diff options
339 files changed, 5455 insertions, 2031 deletions
diff --git a/api/current.txt b/api/current.txt index 8b24826a267b..54fb459b3bc8 100644 --- a/api/current.txt +++ b/api/current.txt @@ -143,6 +143,7 @@ package android { field public static final String SET_WALLPAPER_HINTS = "android.permission.SET_WALLPAPER_HINTS"; field public static final String SIGNAL_PERSISTENT_PROCESSES = "android.permission.SIGNAL_PERSISTENT_PROCESSES"; field public static final String SMS_FINANCIAL_TRANSACTIONS = "android.permission.SMS_FINANCIAL_TRANSACTIONS"; + field public static final String START_VIEW_PERMISSION_USAGE = "android.permission.START_VIEW_PERMISSION_USAGE"; field public static final String STATUS_BAR = "android.permission.STATUS_BAR"; field public static final String SYSTEM_ALERT_WINDOW = "android.permission.SYSTEM_ALERT_WINDOW"; field public static final String TRANSMIT_IR = "android.permission.TRANSMIT_IR"; @@ -10326,6 +10327,7 @@ package android.content { field public static final String ACTION_USER_UNLOCKED = "android.intent.action.USER_UNLOCKED"; field public static final String ACTION_VIEW = "android.intent.action.VIEW"; field public static final String ACTION_VIEW_LOCUS = "android.intent.action.VIEW_LOCUS"; + field @RequiresPermission(android.Manifest.permission.START_VIEW_PERMISSION_USAGE) public static final String ACTION_VIEW_PERMISSION_USAGE = "android.intent.action.VIEW_PERMISSION_USAGE"; field public static final String ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND"; field @Deprecated public static final String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED"; field public static final String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH"; diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index c56224bf1b57..f53ac1b77021 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -296,6 +296,9 @@ message Atom { MediametricsRecorderReported mediametrics_recorder_reported = 200; VehicleMapServicePacketReported vms_packet_reported = 201; VehicleMapServicePacketFailureReported vms_packet_failure_reported = 202; + CarPowerStateChanged car_power_state_changed = 203; + GarageModeInfo garage_mode_info = 204; + TestAtomReported test_atom_reported = 205 [(log_from_module) = "cts"]; } // Pulled events will start at field 10000. @@ -3340,6 +3343,23 @@ message BinaryPushStateChanged { optional int32 user_id = 8; } +/* Test atom, is not logged anywhere */ +message TestAtomReported { + repeated AttributionNode attribution_node = 1; + optional int32 int_field = 2; + optional int64 long_field = 3; + optional float float_field = 4; + optional string string_field = 5; + optional bool boolean_field = 6; + enum State { + UNKNOWN = 0; + OFF = 1; + ON = 2; + } + optional State state = 7; + optional TrainExperimentIds bytes_field = 8 [(android.os.statsd.log_mode) = MODE_BYTES]; +} + /** Represents USB port overheat event. */ message UsbPortOverheatEvent { /* Temperature of USB port at USB plug event, in 1/10ths of degree C. */ @@ -6307,3 +6327,33 @@ message VehicleMapServicePacketFailureReported { // signifies that there are zero subscribers for the packet. optional string subscriber_name = 5; } + +/** + * Logs when Car Power state changed. + * + * Logged from: + * packages/services/Car/service/src/com/android/car/CarStatsLog.java + */ +message CarPowerStateChanged { + // States come from CpmsState in CarPowerManagementService.java. + enum State { + WAIT_FOR_VHAL = 0; + ON = 1; + SHUTDOWN_PREPARE = 2; + WAIT_FOR_FINISH = 3; + SUSPEND = 4; + SIMULATE_SLEEP = 5; + } + optional State state = 1; +} + +/** + * Logs whether GarageMode is entered. + * + * Logged from: + * packages/services/Car/service/src/com/android/car/CarStatsLog.java + */ +message GarageModeInfo { + // Whether GarageMode is entered. + optional bool is_garage_mode = 1; +} diff --git a/core/java/android/app/JobSchedulerImpl.java b/core/java/android/app/JobSchedulerImpl.java index 5494e2a8855c..e8770185305c 100644 --- a/core/java/android/app/JobSchedulerImpl.java +++ b/core/java/android/app/JobSchedulerImpl.java @@ -83,7 +83,7 @@ public class JobSchedulerImpl extends JobScheduler { @Override public List<JobInfo> getAllPendingJobs() { try { - return mBinder.getAllPendingJobs(); + return mBinder.getAllPendingJobs().getList(); } catch (RemoteException e) { return null; } @@ -110,7 +110,7 @@ public class JobSchedulerImpl extends JobScheduler { @Override public List<JobSnapshot> getAllJobSnapshots() { try { - return mBinder.getAllJobSnapshots(); + return mBinder.getAllJobSnapshots().getList(); } catch (RemoteException e) { return null; } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index b4c6d94cc823..789351e0d157 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -8832,8 +8832,8 @@ public class Notification implements Parcelable * <p>Setting this flag is optional; it defaults to false.</p> */ @NonNull - public BubbleMetadata.Builder setSuppressNotification(boolean shouldSupressNotif) { - setFlag(FLAG_SUPPRESS_NOTIFICATION, shouldSupressNotif); + public BubbleMetadata.Builder setSuppressNotification(boolean shouldSuppressNotif) { + setFlag(FLAG_SUPPRESS_NOTIFICATION, shouldSuppressNotif); return this; } diff --git a/core/java/android/app/VoiceInteractor.java b/core/java/android/app/VoiceInteractor.java index 7828573885a3..b37120faf281 100644 --- a/core/java/android/app/VoiceInteractor.java +++ b/core/java/android/app/VoiceInteractor.java @@ -79,10 +79,10 @@ public final class VoiceInteractor { /** @hide */ public static final String KEY_KILL_SIGNAL = "key_kill_signal"; - IVoiceInteractor mInteractor; + @Nullable IVoiceInteractor mInteractor; - Context mContext; - Activity mActivity; + @Nullable Context mContext; + @Nullable Activity mActivity; boolean mRetaining; final HandlerCaller mHandlerCaller; @@ -999,7 +999,9 @@ public final class VoiceInteractor { // destroyed now mInteractor = null; - mActivity.setVoiceInteractor(null); + if (mActivity != null) { + mActivity.setVoiceInteractor(null); + } } public boolean submitRequest(Request request) { diff --git a/core/java/android/app/job/IJobScheduler.aidl b/core/java/android/app/job/IJobScheduler.aidl index 53b33c22dd81..3006f50e54fc 100644 --- a/core/java/android/app/job/IJobScheduler.aidl +++ b/core/java/android/app/job/IJobScheduler.aidl @@ -19,6 +19,7 @@ package android.app.job; import android.app.job.JobInfo; import android.app.job.JobSnapshot; import android.app.job.JobWorkItem; +import android.content.pm.ParceledListSlice; /** * IPC interface that supports the app-facing {@link #JobScheduler} api. @@ -30,8 +31,8 @@ interface IJobScheduler { int scheduleAsPackage(in JobInfo job, String packageName, int userId, String tag); void cancel(int jobId); void cancelAll(); - List<JobInfo> getAllPendingJobs(); + ParceledListSlice getAllPendingJobs(); JobInfo getPendingJob(int jobId); List<JobInfo> getStartedJobs(); - List<JobSnapshot> getAllJobSnapshots(); + ParceledListSlice getAllJobSnapshots(); } diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 804677648d09..2c5860ac8775 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -825,7 +825,9 @@ public abstract class ContentResolver implements ContentInterface { * @param sortOrder How to order the rows, formatted as an SQL ORDER BY * clause (excluding the ORDER BY itself). Passing null will use the * default sort order, which may be unordered. - * @return A Cursor object, which is positioned before the first entry, or null + * @return A Cursor object, which is positioned before the first entry. May return + * <code>null</code> if the underlying content provider returns <code>null</code>, + * or if it crashes. * @see Cursor */ public final @Nullable Cursor query(@RequiresPermission.Read @NonNull Uri uri, @@ -865,7 +867,9 @@ public abstract class ContentResolver implements ContentInterface { * @param cancellationSignal A signal to cancel the operation in progress, or null if none. * If the operation is canceled, then {@link OperationCanceledException} will be thrown * when the query is executed. - * @return A Cursor object, which is positioned before the first entry, or null + * @return A Cursor object, which is positioned before the first entry. May return + * <code>null</code> if the underlying content provider returns <code>null</code>, + * or if it crashes. * @see Cursor */ public final @Nullable Cursor query(@RequiresPermission.Read @NonNull Uri uri, @@ -902,7 +906,9 @@ public abstract class ContentResolver implements ContentInterface { * @param cancellationSignal A signal to cancel the operation in progress, or null if none. * If the operation is canceled, then {@link OperationCanceledException} will be thrown * when the query is executed. - * @return A Cursor object, which is positioned before the first entry, or null + * @return A Cursor object, which is positioned before the first entry. May return + * <code>null</code> if the underlying content provider returns <code>null</code>, + * or if it crashes. * @see Cursor */ @Override @@ -1799,7 +1805,8 @@ public abstract class ContentResolver implements ContentInterface { * @param url The URL of the table to insert into. * @param values The initial values for the newly inserted row. The key is the column name for * the field. Passing an empty ContentValues will create an empty row. - * @return the URL of the newly created row. + * @return the URL of the newly created row. May return <code>null</code> if the underlying + * content provider returns <code>null</code>, or if it crashes. */ @Override public final @Nullable Uri insert(@RequiresPermission.Write @NonNull Uri url, diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 50d1785c6059..9e5fcfb6f73e 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -1881,6 +1881,31 @@ public class Intent implements Parcelable, Cloneable { "android.intent.action.REVIEW_PERMISSIONS"; /** + * Activity action: Launch UI to show information about the usage + * of a given permission. This action would be handled by apps that + * want to show details about how and why given permission is being + * used. + * <p> + * <strong>Important:</strong>You must protect the activity that handles + * this action with the {@link android.Manifest.permission#START_VIEW_PERMISSION_USAGE + * START_VIEW_PERMISSION_USAGE} permission to ensure that only the + * system can launch this activity. The system will not launch + * activities that are not properly protected. + * + * <p> + * Input: {@code android.intent.extra.PERMISSION_NAME} specifies the permission + * for which the launched UI would be targeted. + * </p> + * <p> + * Output: Nothing. + * </p> + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + @RequiresPermission(android.Manifest.permission.START_VIEW_PERMISSION_USAGE) + public static final String ACTION_VIEW_PERMISSION_USAGE = + "android.intent.action.VIEW_PERMISSION_USAGE"; + + /** * Activity action: Launch UI to manage a default app. * <p> * Input: {@link #EXTRA_ROLE_NAME} specifies the role of the default app which will be managed diff --git a/core/java/android/net/SocketKeepalive.java b/core/java/android/net/SocketKeepalive.java index 9d91620bdf96..46eddde968a0 100644 --- a/core/java/android/net/SocketKeepalive.java +++ b/core/java/android/net/SocketKeepalive.java @@ -43,6 +43,10 @@ import java.util.concurrent.Executor; * To stop an existing keepalive, call {@link SocketKeepalive#stop}. The system will call * {@link SocketKeepalive.Callback#onStopped} if the operation was successful or * {@link SocketKeepalive.Callback#onError} if an error occurred. + * + * The device SHOULD support keepalive offload. If it does not, it MUST reply with + * {@link SocketKeepalive.Callback#onError} with {@code ERROR_UNSUPPORTED} to any keepalive offload + * request. If it does, it MUST support at least 3 concurrent keepalive slots per transport. */ public abstract class SocketKeepalive implements AutoCloseable { static final String TAG = "SocketKeepalive"; diff --git a/core/java/android/net/metrics/ApfProgramEvent.java b/core/java/android/net/metrics/ApfProgramEvent.java index 2bd43782d523..e9c209c9cb3b 100644 --- a/core/java/android/net/metrics/ApfProgramEvent.java +++ b/core/java/android/net/metrics/ApfProgramEvent.java @@ -176,7 +176,7 @@ public final class ApfProgramEvent implements IpConnectivityLog.Event { out.writeInt(filteredRas); out.writeInt(currentRas); out.writeInt(programLength); - out.writeInt(flags); + out.writeInt(this.flags); } /** @hide */ @@ -192,6 +192,18 @@ public final class ApfProgramEvent implements IpConnectivityLog.Event { programLength, actualLifetime, lifetimeString, namesOf(flags)); } + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj.getClass().equals(ApfProgramEvent.class))) return false; + final ApfProgramEvent other = (ApfProgramEvent) obj; + return lifetime == other.lifetime + && actualLifetime == other.actualLifetime + && filteredRas == other.filteredRas + && currentRas == other.currentRas + && programLength == other.programLength + && flags == other.flags; + } + /** @hide */ public static final @android.annotation.NonNull Parcelable.Creator<ApfProgramEvent> CREATOR = new Parcelable.Creator<ApfProgramEvent>() { diff --git a/core/java/android/net/metrics/ApfStats.java b/core/java/android/net/metrics/ApfStats.java index 6c3b7af6b888..b9637774e926 100644 --- a/core/java/android/net/metrics/ApfStats.java +++ b/core/java/android/net/metrics/ApfStats.java @@ -275,6 +275,22 @@ public final class ApfStats implements IpConnectivityLog.Event { .toString(); } + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj.getClass().equals(ApfStats.class))) return false; + final ApfStats other = (ApfStats) obj; + return durationMs == other.durationMs + && receivedRas == other.receivedRas + && matchingRas == other.matchingRas + && droppedRas == other.droppedRas + && zeroLifetimeRas == other.zeroLifetimeRas + && parseErrors == other.parseErrors + && programUpdates == other.programUpdates + && programUpdatesAll == other.programUpdatesAll + && programUpdatesAllowingMulticast == other.programUpdatesAllowingMulticast + && maxProgramSize == other.maxProgramSize; + } + /** @hide */ public static final @android.annotation.NonNull Parcelable.Creator<ApfStats> CREATOR = new Parcelable.Creator<ApfStats>() { public ApfStats createFromParcel(Parcel in) { diff --git a/core/java/android/net/metrics/DhcpClientEvent.java b/core/java/android/net/metrics/DhcpClientEvent.java index a3d0a20194f2..2fed7363b713 100644 --- a/core/java/android/net/metrics/DhcpClientEvent.java +++ b/core/java/android/net/metrics/DhcpClientEvent.java @@ -22,6 +22,7 @@ import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; +import android.text.TextUtils; /** * An event recorded when a DhcpClient state machine transitions to a new state. @@ -101,6 +102,14 @@ public final class DhcpClientEvent implements IpConnectivityLog.Event { return String.format("DhcpClientEvent(%s, %dms)", msg, durationMs); } + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj.getClass().equals(DhcpClientEvent.class))) return false; + final DhcpClientEvent other = (DhcpClientEvent) obj; + return TextUtils.equals(msg, other.msg) + && durationMs == other.durationMs; + } + /** @hide */ public static final @android.annotation.NonNull Parcelable.Creator<DhcpClientEvent> CREATOR = new Parcelable.Creator<DhcpClientEvent>() { diff --git a/core/java/android/net/metrics/IpManagerEvent.java b/core/java/android/net/metrics/IpManagerEvent.java index 9d358d11b579..ba05c5900acf 100644 --- a/core/java/android/net/metrics/IpManagerEvent.java +++ b/core/java/android/net/metrics/IpManagerEvent.java @@ -101,6 +101,14 @@ public final class IpManagerEvent implements IpConnectivityLog.Event { Decoder.constants.get(eventType), durationMs); } + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj.getClass().equals(IpManagerEvent.class))) return false; + final IpManagerEvent other = (IpManagerEvent) obj; + return eventType == other.eventType + && durationMs == other.durationMs; + } + final static class Decoder { static final SparseArray<String> constants = MessageUtils.findMessageNames( new Class[]{IpManagerEvent.class}, diff --git a/core/java/android/net/metrics/IpReachabilityEvent.java b/core/java/android/net/metrics/IpReachabilityEvent.java index 80c82117d4e2..d4ba2943d72b 100644 --- a/core/java/android/net/metrics/IpReachabilityEvent.java +++ b/core/java/android/net/metrics/IpReachabilityEvent.java @@ -93,6 +93,13 @@ public final class IpReachabilityEvent implements IpConnectivityLog.Event { return String.format("IpReachabilityEvent(%s:%02x)", eventName, lo); } + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj.getClass().equals(IpReachabilityEvent.class))) return false; + final IpReachabilityEvent other = (IpReachabilityEvent) obj; + return eventType == other.eventType; + } + final static class Decoder { static final SparseArray<String> constants = MessageUtils.findMessageNames(new Class[]{IpReachabilityEvent.class}, diff --git a/core/java/android/net/metrics/NetworkEvent.java b/core/java/android/net/metrics/NetworkEvent.java index bed914d6b2ab..0c57ec644226 100644 --- a/core/java/android/net/metrics/NetworkEvent.java +++ b/core/java/android/net/metrics/NetworkEvent.java @@ -121,6 +121,14 @@ public final class NetworkEvent implements IpConnectivityLog.Event { Decoder.constants.get(eventType), durationMs); } + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj.getClass().equals(NetworkEvent.class))) return false; + final NetworkEvent other = (NetworkEvent) obj; + return eventType == other.eventType + && durationMs == other.durationMs; + } + final static class Decoder { static final SparseArray<String> constants = MessageUtils.findMessageNames( new Class[]{NetworkEvent.class}, new String[]{"NETWORK_"}); diff --git a/core/java/android/net/metrics/RaEvent.java b/core/java/android/net/metrics/RaEvent.java index b2f6585cc2fc..3fd87c23b87d 100644 --- a/core/java/android/net/metrics/RaEvent.java +++ b/core/java/android/net/metrics/RaEvent.java @@ -97,6 +97,18 @@ public final class RaEvent implements IpConnectivityLog.Event { .toString(); } + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj.getClass().equals(RaEvent.class))) return false; + final RaEvent other = (RaEvent) obj; + return routerLifetime == other.routerLifetime + && prefixValidLifetime == other.prefixValidLifetime + && prefixPreferredLifetime == other.prefixPreferredLifetime + && routeInfoLifetime == other.routeInfoLifetime + && rdnssLifetime == other.rdnssLifetime + && dnsslLifetime == other.dnsslLifetime; + } + /** @hide */ public static final @android.annotation.NonNull Parcelable.Creator<RaEvent> CREATOR = new Parcelable.Creator<RaEvent>() { public RaEvent createFromParcel(Parcel in) { diff --git a/core/java/android/net/metrics/ValidationProbeEvent.java b/core/java/android/net/metrics/ValidationProbeEvent.java index c9d7b1b8f7d9..1aaa50d139e0 100644 --- a/core/java/android/net/metrics/ValidationProbeEvent.java +++ b/core/java/android/net/metrics/ValidationProbeEvent.java @@ -170,6 +170,15 @@ public final class ValidationProbeEvent implements IpConnectivityLog.Event { getProbeName(probeType), returnCode, getValidationStage(probeType), durationMs); } + @Override + public boolean equals(Object obj) { + if (obj == null || !(obj.getClass().equals(ValidationProbeEvent.class))) return false; + final ValidationProbeEvent other = (ValidationProbeEvent) obj; + return durationMs == other.durationMs + && probeType == other.probeType + && returnCode == other.returnCode; + } + final static class Decoder { static final SparseArray<String> constants = MessageUtils.findMessageNames( new Class[]{ValidationProbeEvent.class}, diff --git a/core/java/android/net/util/KeepaliveUtils.java b/core/java/android/net/util/KeepaliveUtils.java new file mode 100644 index 000000000000..569fed1fc994 --- /dev/null +++ b/core/java/android/net/util/KeepaliveUtils.java @@ -0,0 +1,121 @@ +/* + * 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.net.util; + +import android.annotation.NonNull; +import android.content.Context; +import android.content.res.Resources; +import android.net.NetworkCapabilities; +import android.text.TextUtils; +import android.util.AndroidRuntimeException; + +import com.android.internal.R; + +/** + * Collection of utilities for socket keepalive offload. + * + * @hide + */ +public final class KeepaliveUtils { + + public static final String TAG = "KeepaliveUtils"; + + // Minimum supported keepalive count per transport if the network supports keepalive. + public static final int MIN_SUPPORTED_KEEPALIVE_COUNT = 3; + + public static class KeepaliveDeviceConfigurationException extends AndroidRuntimeException { + public KeepaliveDeviceConfigurationException(final String msg) { + super(msg); + } + } + + /** + * Read supported keepalive count for each transport type from overlay resource. This should be + * used to create a local variable store of resource customization, and use it as the input for + * {@link getSupportedKeepalivesForNetworkCapabilities}. + * + * @param context The context to read resource from. + * @return An array of supported keepalive count for each transport type. + */ + @NonNull + public static int[] getSupportedKeepalives(@NonNull Context context) { + String[] res = null; + try { + res = context.getResources().getStringArray( + R.array.config_networkSupportedKeepaliveCount); + } catch (Resources.NotFoundException unused) { + } + if (res == null) throw new KeepaliveDeviceConfigurationException("invalid resource"); + + final int[] ret = new int[NetworkCapabilities.MAX_TRANSPORT + 1]; + for (final String row : res) { + if (TextUtils.isEmpty(row)) { + throw new KeepaliveDeviceConfigurationException("Empty string"); + } + final String[] arr = row.split(","); + if (arr.length != 2) { + throw new KeepaliveDeviceConfigurationException("Invalid parameter length"); + } + + int transport; + int supported; + try { + transport = Integer.parseInt(arr[0]); + supported = Integer.parseInt(arr[1]); + } catch (NumberFormatException e) { + throw new KeepaliveDeviceConfigurationException("Invalid number format"); + } + + if (!NetworkCapabilities.isValidTransport(transport)) { + throw new KeepaliveDeviceConfigurationException("Invalid transport " + transport); + } + + // Customized values should be either 0 to indicate the network doesn't support + // keepalive offload, or a positive value that is at least + // MIN_SUPPORTED_KEEPALIVE_COUNT if supported. + if (supported != 0 && supported < MIN_SUPPORTED_KEEPALIVE_COUNT) { + throw new KeepaliveDeviceConfigurationException( + "Invalid supported count " + supported + " for " + + NetworkCapabilities.transportNameOf(transport)); + } + ret[transport] = supported; + } + return ret; + } + + /** + * Get supported keepalive count for the given {@link NetworkCapabilities}. + * + * @param supportedKeepalives An array of supported keepalive count for each transport type. + * @param nc The {@link NetworkCapabilities} of the network the socket keepalive is on. + * + * @return Supported keepalive count for the given {@link NetworkCapabilities}. + */ + public static int getSupportedKeepalivesForNetworkCapabilities( + @NonNull int[] supportedKeepalives, @NonNull NetworkCapabilities nc) { + final int[] transports = nc.getTransportTypes(); + if (transports.length == 0) return 0; + int supportedCount = supportedKeepalives[transports[0]]; + // Iterate through transports and return minimum supported value. + for (final int transport : transports) { + if (supportedCount > supportedKeepalives[transport]) { + supportedCount = supportedKeepalives[transport]; + } + } + return supportedCount; + } +} diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index c50d003afcc0..aa774a6f0e86 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -46,6 +46,7 @@ import android.graphics.ImageDecoder; import android.graphics.Point; import android.graphics.PostProcessor; import android.media.ExifInterface; +import android.media.MediaFile; import android.net.Uri; import android.os.Bundle; import android.os.CancellationSignal; @@ -1724,18 +1725,25 @@ public final class MediaStore { @Deprecated public static final String insertImage(ContentResolver cr, String imagePath, String name, String description) throws FileNotFoundException { - // Check if file exists with a FileInputStream - FileInputStream stream = new FileInputStream(imagePath); - try { - Bitmap bm = BitmapFactory.decodeFile(imagePath); - String ret = insertImage(cr, bm, name, description); - bm.recycle(); - return ret; - } finally { - try { - stream.close(); - } catch (IOException e) { + final File file = new File(imagePath); + final String mimeType = MediaFile.getMimeTypeForFile(imagePath); + + if (TextUtils.isEmpty(name)) name = "Image"; + final PendingParams params = new PendingParams( + MediaStore.Images.Media.EXTERNAL_CONTENT_URI, name, mimeType); + + final Context context = AppGlobals.getInitialApplication(); + final Uri pendingUri = createPending(context, params); + try (PendingSession session = openPending(context, pendingUri)) { + try (InputStream in = new FileInputStream(file); + OutputStream out = session.openOutputStream()) { + FileUtils.copy(in, out); } + return session.publish().toString(); + } catch (Exception e) { + Log.w(TAG, "Failed to insert image", e); + context.getContentResolver().delete(pendingUri, null, null); + return null; } } @@ -1755,45 +1763,22 @@ public final class MediaStore { @Deprecated public static final String insertImage(ContentResolver cr, Bitmap source, String title, String description) { - ContentValues values = new ContentValues(); - values.put(Images.Media.DISPLAY_NAME, title); - values.put(Images.Media.DESCRIPTION, description); - values.put(Images.Media.MIME_TYPE, "image/jpeg"); - - Uri url = null; - String stringUrl = null; /* value to be returned */ - - try { - url = cr.insert(getContentUri(VOLUME_EXTERNAL_PRIMARY), values); - - if (source != null) { - try (OutputStream out = new ParcelFileDescriptor.AutoCloseOutputStream( - cr.openFile(url, "w", null))) { - source.compress(Bitmap.CompressFormat.JPEG, 50, out); - } - - long id = ContentUris.parseId(url); - // Block until we've generated common thumbnails - Images.Thumbnails.getThumbnail(cr, id, Images.Thumbnails.MINI_KIND, null); - Images.Thumbnails.getThumbnail(cr, id, Images.Thumbnails.MICRO_KIND, null); - } else { - Log.e(TAG, "Failed to create thumbnail, removing original"); - cr.delete(url, null, null); - url = null; + if (TextUtils.isEmpty(title)) title = "Image"; + final PendingParams params = new PendingParams( + MediaStore.Images.Media.EXTERNAL_CONTENT_URI, title, "image/jpeg"); + + final Context context = AppGlobals.getInitialApplication(); + final Uri pendingUri = createPending(context, params); + try (PendingSession session = openPending(context, pendingUri)) { + try (OutputStream out = session.openOutputStream()) { + source.compress(Bitmap.CompressFormat.JPEG, 90, out); } + return session.publish().toString(); } catch (Exception e) { - Log.e(TAG, "Failed to insert image", e); - if (url != null) { - cr.delete(url, null, null); - url = null; - } + Log.w(TAG, "Failed to insert image", e); + context.getContentResolver().delete(pendingUri, null, null); + return null; } - - if (url != null) { - stringUrl = url.toString(); - } - - return stringUrl; } /** diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java index ae36e4ecde17..c42dc817bec4 100644 --- a/core/java/android/util/FeatureFlagUtils.java +++ b/core/java/android/util/FeatureFlagUtils.java @@ -37,10 +37,6 @@ public class FeatureFlagUtils { public static final String SEAMLESS_TRANSFER = "settings_seamless_transfer"; public static final String HEARING_AID_SETTINGS = "settings_bluetooth_hearing_aid"; public static final String SCREENRECORD_LONG_PRESS = "settings_screenrecord_long_press"; - public static final String FORCE_GLOBAL_ACTIONS_GRID_ENABLED = - "settings_global_actions_force_grid_enabled"; - public static final String GLOBAL_ACTIONS_PANEL_ENABLED = - "settings_global_actions_panel_enabled"; public static final String PIXEL_WALLPAPER_CATEGORY_SWITCH = "settings_pixel_wallpaper_category_switch"; public static final String DYNAMIC_SYSTEM = "settings_dynamic_system"; @@ -57,8 +53,6 @@ public class FeatureFlagUtils { DEFAULT_FLAGS.put(SEAMLESS_TRANSFER, "false"); DEFAULT_FLAGS.put(HEARING_AID_SETTINGS, "false"); DEFAULT_FLAGS.put(SCREENRECORD_LONG_PRESS, "false"); - DEFAULT_FLAGS.put(FORCE_GLOBAL_ACTIONS_GRID_ENABLED, "false"); - DEFAULT_FLAGS.put(GLOBAL_ACTIONS_PANEL_ENABLED, "true"); DEFAULT_FLAGS.put(PIXEL_WALLPAPER_CATEGORY_SWITCH, "false"); DEFAULT_FLAGS.put("settings_wifi_details_datausage_header", "false"); } diff --git a/core/java/android/util/MemoryIntArray.java b/core/java/android/util/MemoryIntArray.java index 74fea3f4dd30..80b16075cdf6 100644 --- a/core/java/android/util/MemoryIntArray.java +++ b/core/java/android/util/MemoryIntArray.java @@ -20,9 +20,8 @@ import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.os.Parcelable; -import dalvik.system.CloseGuard; - import libcore.io.IoUtils; +import dalvik.system.CloseGuard; import java.io.Closeable; import java.io.IOException; @@ -57,7 +56,7 @@ public final class MemoryIntArray implements Parcelable, Closeable { private final boolean mIsOwner; private final long mMemoryAddr; - private ParcelFileDescriptor mFd; + private int mFd = -1; /** * Creates a new instance. @@ -72,8 +71,8 @@ public final class MemoryIntArray implements Parcelable, Closeable { } mIsOwner = true; final String name = UUID.randomUUID().toString(); - mFd = ParcelFileDescriptor.adoptFd(nativeCreate(name, size)); - mMemoryAddr = nativeOpen(mFd.getFd(), mIsOwner); + mFd = nativeCreate(name, size); + mMemoryAddr = nativeOpen(mFd, mIsOwner); mCloseGuard.open("close"); } @@ -83,8 +82,8 @@ public final class MemoryIntArray implements Parcelable, Closeable { if (pfd == null) { throw new IOException("No backing file descriptor"); } - mFd = ParcelFileDescriptor.adoptFd(pfd.detachFd()); - mMemoryAddr = nativeOpen(mFd.getFd(), mIsOwner); + mFd = pfd.detachFd(); + mMemoryAddr = nativeOpen(mFd, mIsOwner); mCloseGuard.open("close"); } @@ -106,7 +105,7 @@ public final class MemoryIntArray implements Parcelable, Closeable { public int get(int index) throws IOException { enforceNotClosed(); enforceValidIndex(index); - return nativeGet(mFd.getFd(), mMemoryAddr, index); + return nativeGet(mFd, mMemoryAddr, index); } /** @@ -122,7 +121,7 @@ public final class MemoryIntArray implements Parcelable, Closeable { enforceNotClosed(); enforceWritable(); enforceValidIndex(index); - nativeSet(mFd.getFd(), mMemoryAddr, index, value); + nativeSet(mFd, mMemoryAddr, index, value); } /** @@ -132,7 +131,7 @@ public final class MemoryIntArray implements Parcelable, Closeable { */ public int size() throws IOException { enforceNotClosed(); - return nativeSize(mFd.getFd()); + return nativeSize(mFd); } /** @@ -143,9 +142,8 @@ public final class MemoryIntArray implements Parcelable, Closeable { @Override public void close() throws IOException { if (!isClosed()) { - nativeClose(mFd.getFd(), mMemoryAddr, mIsOwner); - mFd.close(); - mFd = null; + nativeClose(mFd, mMemoryAddr, mIsOwner); + mFd = -1; mCloseGuard.close(); } } @@ -154,7 +152,7 @@ public final class MemoryIntArray implements Parcelable, Closeable { * @return Whether this array is closed and shouldn't be used. */ public boolean isClosed() { - return mFd == null; + return mFd == -1; } @Override @@ -177,8 +175,13 @@ public final class MemoryIntArray implements Parcelable, Closeable { @Override public void writeToParcel(Parcel parcel, int flags) { - // Don't let writing to a parcel to close our fd - plz - parcel.writeParcelable(mFd, flags & ~Parcelable.PARCELABLE_WRITE_RETURN_VALUE); + ParcelFileDescriptor pfd = ParcelFileDescriptor.adoptFd(mFd); + try { + // Don't let writing to a parcel to close our fd - plz + parcel.writeParcelable(pfd, flags & ~Parcelable.PARCELABLE_WRITE_RETURN_VALUE); + } finally { + pfd.detachFd(); + } } @Override @@ -192,13 +195,13 @@ public final class MemoryIntArray implements Parcelable, Closeable { if (getClass() != obj.getClass()) { return false; } - - return false; + MemoryIntArray other = (MemoryIntArray) obj; + return mFd == other.mFd; } @Override public int hashCode() { - return mFd.hashCode(); + return mFd; } private void enforceNotClosed() { diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index 4c32f03f6cb3..d985528c38fb 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -1992,7 +1992,7 @@ public class RelativeLayout extends ViewGroup { // dependencies for a specific set of rules for (int j = 0; j < rulesCount; j++) { final int rule = rules[rulesFilter[j]]; - if (ResourceId.isValid(rule)) { + if (rule > 0 || ResourceId.isValid(rule)) { // The node this node depends on final Node dependency = keyNodes.get(rule); // Skip unknowns and self dependencies diff --git a/core/java/com/android/internal/content/FileSystemProvider.java b/core/java/com/android/internal/content/FileSystemProvider.java index cc2caca49276..cdb79abbb7ce 100644 --- a/core/java/com/android/internal/content/FileSystemProvider.java +++ b/core/java/com/android/internal/content/FileSystemProvider.java @@ -247,7 +247,6 @@ public abstract class FileSystemProvider extends DocumentsProvider { } childId = getDocIdForFile(file); onDocIdChanged(childId); - addFolderToMediaStore(getFileForDocId(childId, true)); } else { try { if (!file.createNewFile()) { @@ -259,19 +258,11 @@ public abstract class FileSystemProvider extends DocumentsProvider { throw new IllegalStateException("Failed to touch " + file + ": " + e); } } + MediaStore.scanFile(getContext(), file); return childId; } - private void addFolderToMediaStore(@Nullable File visibleFolder) { - // visibleFolder is null if we're adding a folder to external thumb drive or SD card. - if (visibleFolder != null) { - assert (visibleFolder.isDirectory()); - - MediaStore.scanFile(getContext(), visibleFolder); - } - } - @Override public String renameDocument(String docId, String displayName) throws FileNotFoundException { // Since this provider treats renames as generating a completely new @@ -293,7 +284,6 @@ public abstract class FileSystemProvider extends DocumentsProvider { moveInMediaStore(beforeVisibleFile, afterVisibleFile); if (!TextUtils.equals(docId, afterDocId)) { - scanFile(afterVisibleFile); return afterDocId; } else { return null; diff --git a/core/java/com/android/internal/infra/AbstractRemoteService.java b/core/java/com/android/internal/infra/AbstractRemoteService.java index 64f885770336..3900f1674c13 100644 --- a/core/java/com/android/internal/infra/AbstractRemoteService.java +++ b/core/java/com/android/internal/infra/AbstractRemoteService.java @@ -231,6 +231,7 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I @SuppressWarnings("unchecked") // TODO(b/117779333): fix this warning final S castService = (S) this; mVultureCallback.onServiceDied(castService); + handleBindFailure(); } // Note: we are dumping without a lock held so this is a bit racy but @@ -406,7 +407,8 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I @NonNull BasePendingRequest<S, I> pendingRequest); /** - * Called if {@link Context#bindServiceAsUser} returns {@code false}. + * Called if {@link Context#bindServiceAsUser} returns {@code false}, or + * if {@link DeathRecipient#binderDied()} is called. */ abstract void handleBindFailure(); @@ -431,8 +433,6 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I mBinding = false; if (!mServiceDied) { - // TODO(b/126266412): merge these 2 calls? - handleBindFailure(); handleBinderDied(); } } diff --git a/core/java/com/android/internal/notification/SystemNotificationChannels.java b/core/java/com/android/internal/notification/SystemNotificationChannels.java index accfc875956c..a35e42e4e140 100644 --- a/core/java/com/android/internal/notification/SystemNotificationChannels.java +++ b/core/java/com/android/internal/notification/SystemNotificationChannels.java @@ -43,7 +43,12 @@ public class SystemNotificationChannels { public static String NETWORK_ALERTS = "NETWORK_ALERTS"; public static String NETWORK_AVAILABLE = "NETWORK_AVAILABLE"; public static String VPN = "VPN"; - public static String DEVICE_ADMIN = "DEVICE_ADMIN"; + /** + * @deprecated Legacy device admin channel with low importance which is no longer used, + * Use the high importance {@link #DEVICE_ADMIN} channel instead. + */ + @Deprecated public static String DEVICE_ADMIN_DEPRECATED = "DEVICE_ADMIN"; + public static String DEVICE_ADMIN = "DEVICE_ADMIN_ALERTS"; public static String ALERTS = "ALERTS"; public static String RETAIL_MODE = "RETAIL_MODE"; public static String USB = "USB"; @@ -128,7 +133,7 @@ public class SystemNotificationChannels { final NotificationChannel deviceAdmin = new NotificationChannel( DEVICE_ADMIN, context.getString(R.string.notification_channel_device_admin), - NotificationManager.IMPORTANCE_LOW); + NotificationManager.IMPORTANCE_HIGH); channelsList.add(deviceAdmin); final NotificationChannel alertsChannel = new NotificationChannel( @@ -180,6 +185,12 @@ public class SystemNotificationChannels { nm.createNotificationChannels(channelsList); } + /** Remove notification channels which are no longer used */ + public static void removeDeprecated(Context context) { + final NotificationManager nm = context.getSystemService(NotificationManager.class); + nm.deleteNotificationChannel(DEVICE_ADMIN_DEPRECATED); + } + public static void createAccountChannelForPackage(String pkg, int uid, Context context) { final INotificationManager iNotificationManager = NotificationManager.getService(); try { diff --git a/core/jni/android_util_MemoryIntArray.cpp b/core/jni/android_util_MemoryIntArray.cpp index b68f9eca70cd..2dfbe3ecfef6 100644 --- a/core/jni/android_util_MemoryIntArray.cpp +++ b/core/jni/android_util_MemoryIntArray.cpp @@ -142,6 +142,8 @@ static void android_util_MemoryIntArray_close(JNIEnv* env, jobject clazz, jint f jniThrowException(env, "java/io/IOException", "ashmem unpinning failed"); return; } + + close(fd); } static jint android_util_MemoryIntArray_get(JNIEnv* env, jobject clazz, diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 57b770455817..b634bb2a6e9e 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4213,6 +4213,15 @@ android:description="@string/permdesc_bindCarrierServices" android:protectionLevel="signature|privileged" /> + <!-- + Allows the holder to start the permission usage screen for an app. + <p>Protection level: signature|installer + --> + <permission android:name="android.permission.START_VIEW_PERMISSION_USAGE" + android:label="@string/permlab_startViewPermissionUsage" + android:description="@string/permdesc_startViewPermissionUsage" + android:protectionLevel="signature|installer" /> + <!-- Allows an application to query whether DO_NOT_ASK_CREDENTIALS_ON_BOOT flag is set. @hide --> diff --git a/core/res/res/layout/media_route_chooser_dialog.xml b/core/res/res/layout/media_route_chooser_dialog.xml index d1c6267ea4e7..cd1c74fd7d7d 100644 --- a/core/res/res/layout/media_route_chooser_dialog.xml +++ b/core/res/res/layout/media_route_chooser_dialog.xml @@ -40,7 +40,7 @@ <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:paddingLeft="16dp" + android:paddingStart="16dp" android:text="@string/media_route_chooser_searching" /> </LinearLayout> diff --git a/core/res/res/layout/media_route_list_item.xml b/core/res/res/layout/media_route_list_item.xml index bdca433c1c58..e8460db69582 100644 --- a/core/res/res/layout/media_route_list_item.xml +++ b/core/res/res/layout/media_route_list_item.xml @@ -34,6 +34,7 @@ android:layout_height="wrap_content" android:singleLine="true" android:ellipsize="marquee" + android:textAlignment="viewStart" android:textAppearance="?android:attr/textAppearanceMedium" android:duplicateParentState="true" /> @@ -42,6 +43,7 @@ android:layout_height="wrap_content" android:singleLine="true" android:ellipsize="marquee" + android:textAlignment="viewStart" android:textAppearance="?android:attr/textAppearanceSmall" android:duplicateParentState="true" /> </LinearLayout> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 221215a729a2..2bd7c8a847e2 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Te eenders. Verander asseblief jou pose."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Draai jou kop \'n bietjie minder."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Draai jou kop \'n bietjie minder."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Draai jou kop \'n bietjie minder."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Verwyder enigiets wat jou gesig versteek."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Maak die sensor op die skerm se borand skoon."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Kan nie gesig verifieer nie. Hardeware nie beskikbaar nie."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index dbb115ddb485..44b58cfdbbf3 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"በጣም ይመሳሰላል፣ እባክዎ የእርስዎን ፎቶ አነሳስ ይለውጡ"</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"ጭንቅላትዎን ትንሽ ብቻ ያዙሩት።"</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ጭንቅላትዎን ትንሽ ብቻ ያዙሩት።"</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ጭንቅላትዎን ትንሽ ብቻ ያዙሩት።"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"የእርስዎን ፊት የሚደብቀውን ሁሉንም ነገር በማስወገድ ላይ"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"በማያ ገጹ ላይኛው ጫፍ ላይ ዳሳሹን ያጽዱ።"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"መልክን ማረጋገጥ አይቻልም። ሃርድዌር የለም።"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 7fbf223eb9e7..8b409ca1db97 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -583,14 +583,11 @@ <string name="face_acquired_recalibrate" msgid="8077949502893707539">"يُرجى إعادة تسجيل وجهك."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"لم يعُد يمكن التعرّف على الوجه. حاول مرة أخرى."</string> <string name="face_acquired_too_similar" msgid="1508776858407646460">"الوجه مشابه جدًا، يُرجى تغيير وضعيتك."</string> - <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"اخفض وجهك قليلاً."</string> - <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"اخفض وجهك قليلاً."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"حرّك رأسك قليلاً نحو الأمام مباشرة."</string> + <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"حرّك رأسك قليلاً نحو الأمام مباشرة."</string> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"حرّك رأسك قليلاً نحو الوسط."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"عليك بإزالة أي شيء يُخفي وجهك."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"نظِّف المستشعر أعلى الشاشة."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"يتعذّر التحقُّق من الوجه. الجهاز غير مُتاح."</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 200a2d033231..29e453ffe452 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Digəri ilə oxşardır, pozanızı dəyişin."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Başınızı bir az döndərin."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Başınızı bir az döndərin."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Başınızı bir az döndərin."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Üzünüzü gizlədən maneələri kənarlaşdırın."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Ekranın yuxarı küncündəki sensoru təmizləyin."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Üz doğrulanmadı. Avadanlıq əlçatan deyil."</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 79db13cfca07..e298556fac33 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -576,12 +576,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Previše je slično, promenite pozu."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Malo manje pomerite glavu."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Malo manje pomerite glavu."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Malo manje pomerite glavu."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Uklonite sve što vam zaklanja lice."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Očistite senzor na gornjoj ivici ekrana."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Provera lica nije uspela. Hardver nije dostupan."</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index e3f5310a56d3..7c4060cd651f 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -468,9 +468,9 @@ <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"наладка памеру шпалер"</string> <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Дазваляе прыкладанням задаваць падказкі па памеры сістэмных шпалер."</string> <string name="permlab_setTimeZone" msgid="2945079801013077340">"усталёўваць часавы пояс"</string> - <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Дазваляе прыкладанням змяняць гадзінны пояс планшэта."</string> + <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Дазваляе праграмам змяняць часавы пояс планшэта."</string> <string name="permdesc_setTimeZone" product="tv" msgid="888864653946175955">"Дазваляе праграме змяняць часавы пояс тэлевізара."</string> - <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Дазваляе прыкладанню змяняць гадзінны пояс тэлефона."</string> + <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Дазваляе праграме змяняць часавы пояс тэлефона."</string> <string name="permlab_getAccounts" msgid="1086795467760122114">"пошук уліковых запісаў на прыладзе"</string> <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Дазваляе прыкладанню атрымлiваць спіс уліковых запісаў, вядомых планшэту. Сярод iх могуць быць улiковыя запiсы, створаныя прыкладаннямi, якiя вы ўсталявалi."</string> <string name="permdesc_getAccounts" product="tv" msgid="4190633395633907543">"Дазваляе праграме атрымлiваць спіс уліковых запісаў, вядомых тэлевізару. Сярод iх могуць быць любыя ўлiковыя запiсы, створаныя праграмамі, якiя вы ўсталявалi."</string> @@ -579,12 +579,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Не бачна розніцы. Памяняйце позу."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Вы занадта моцна павярнулі галаву."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Галава не ў цэнтры."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Вы занадта моцна павярнулі галаву."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Прыміце ўсё, што закрывае ваш твар."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Ачысціце датчык уверсе экрана."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Твар не спраўджаны. Абсталяванне недаступнае."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 31d9e0534f97..4663387d7412 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Позата ви е сходна с предишна. Моля, променете я."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Не завъртайте главата си толкова много."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Не завъртайте главата си толкова много."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Не завъртайте главата си толкова много."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Премахнете всичко, което закрива лицето ви."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Изчистете сензора в горния край на екрана."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Лицето не може да се потвърди. Хардуерът не е налице."</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index dee997fbe6ea..32bb40bfaece 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"একই ধরনের দেখতে, একটু অন্যদিকে ঘুরে দাঁড়ান।"</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"আপনার মাথাটি নিচের দিকে সামান্য নামান।"</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"আপনার মাথাটি নিচের দিকে সামান্য নামান।"</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"আপনার মাথাটি সামান্য ঘোরান।"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"আপনার ফেসকে আড়াল করে এমন সব কিছু সরিয়ে দিন।"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"স্ক্রিনের উপরের প্রান্তের সেন্সর মুছুন।"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ফেস যাচাই করা যায়নি। হার্ডওয়্যার উপলভ্য নেই।"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index ac541a6bc327..9f653302baab 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -576,12 +576,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Previše slično, promijenite položaj."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Malo manje zakrenite glavu."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Malo manje zakrenite glavu."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Malo manje zakrenite glavu."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Uklonite prepreke koje blokiraju vaše lice."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Očistite senzor na gornjem rubu ekrana."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Nije moguće potvrditi lice. Hardver nije dostupan."</string> @@ -1828,7 +1825,7 @@ <string name="package_installed_device_owner" msgid="6875717669960212648">"Instalirao je vaš administrator"</string> <string name="package_updated_device_owner" msgid="1847154566357862089">"Ažurirao je vaš administrator"</string> <string name="package_deleted_device_owner" msgid="2307122077550236438">"Izbrisao je vaš administrator"</string> - <string name="confirm_battery_saver" msgid="639106420541753635">"UREDU"</string> + <string name="confirm_battery_saver" msgid="639106420541753635">"Uredu"</string> <string name="battery_saver_description_with_learn_more" msgid="2108984221113106294">"U cilju produženja trajanja baterije, funkcija Ušteda baterije isključuje ili ograničava aktivnost u pozadini, neke vizuelne efekte i druge funkcije koje troše puno energije. "<annotation id="url">"Saznajte više"</annotation></string> <string name="battery_saver_description" msgid="6413346684861241431">"U cilju produženja trajanja baterije, funkcija Ušteda baterije isključuje ili ograničava aktivnost u pozadini, neke vizuelne efekte i druge funkcije koje troše puno energije."</string> <string name="data_saver_description" msgid="6015391409098303235">"Da bi se smanjio prijenos podataka, Ušteda podataka sprečava da neke aplikacije šalju ili primaju podatke u pozadini. Aplikacija koju trenutno koristite može pristupiti podacima, ali će to činiti rjeđe. To može značiti, naprimjer, da se slike ne prikazuju sve dok ih ne dodirnete."</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 31930894bf0c..8fe0cbc54d02 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"És massa semblant; canvia de postura."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Inclina el cap una mica menys."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Inclina el cap una mica menys."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"No inclinis tant el cap."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Suprimeix qualsevol cosa que amagui la teva cara."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Neteja el sensor de l\'extrem superior."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"No es pot verificar la cara. Maquinari no disponible."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 6d76c5bc58ef..bd014f8b45ef 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -579,12 +579,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Příliš podobné, změňte výraz."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Natočte hlavu o něco méně."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Natočte hlavu o něco méně."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Natočte hlavu o něco méně."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Odstraňte vše, co vám zakrývá obličej."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Vyčistěte snímač u horního okraje obrazovky."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Obličej nelze ověřit. Hardware není dostupný."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index a6b7af842a57..230067e745b2 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Det minder for meget om et andet. Skift stilling."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Sørg for, at hovedet ikke er drejet for meget."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Sørg for, at hovedet ikke er bøjet for meget."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Sørg for, at dit hoved ikke er drejet for meget."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Hvis noget skjuler dit ansigt, skal du fjerne det."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Rens sensoren ved skærmens øverste kant."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Ansigt ikke bekræftet. Hardware ikke tilgængelig."</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index ed0f3b5e1ce8..1a94f73f5ed1 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Zu ähnlich. Bitte dreh deinen Kopf etwas."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Dreh den Kopf etwas weniger zur Seite."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Neig den Kopf etwas weniger stark."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Neig den Kopf etwas weniger stark."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Entferne alles, was dein Gesicht verdeckt."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Reinige den Sensor am oberen Rand des Bildschirms."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Gesicht nicht erkannt. Hardware nicht verfügbar."</string> @@ -1183,7 +1180,7 @@ <string name="unsupported_display_size_show" msgid="7969129195360353041">"Immer anzeigen"</string> <string name="unsupported_compile_sdk_message" msgid="4253168368781441759">"<xliff:g id="APP_NAME">%1$s</xliff:g> ist mit der Version deines Android-Betriebssystems nicht kompatibel, wodurch ein unerwartetes Verhalten auftreten kann. Möglicherweise ist eine aktualisierte Version der App verfügbar."</string> <string name="unsupported_compile_sdk_show" msgid="2681877855260970231">"Immer anzeigen"</string> - <string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Auf Updates überprüfen"</string> + <string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Auf Updates prüfen"</string> <string name="smv_application" msgid="3307209192155442829">"Die App <xliff:g id="APPLICATION">%1$s</xliff:g> (Prozess <xliff:g id="PROCESS">%2$s</xliff:g>) hat gegen deine selbsterzwungene StrictMode-Richtlinie verstoßen."</string> <string name="smv_process" msgid="5120397012047462446">"Der Prozess <xliff:g id="PROCESS">%1$s</xliff:g> hat gegen seine selbsterzwungene StrictMode-Richtlinie verstoßen."</string> <string name="android_upgrading_title" product="default" msgid="7513829952443484438">"Smartphone wird aktualisiert…"</string> @@ -1367,7 +1364,7 @@ <string name="share_remote_bugreport_action" msgid="6249476773913384948">"TEILEN"</string> <string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ABLEHNEN"</string> <string name="select_input_method" msgid="4653387336791222978">"Eingabemethode wählen"</string> - <string name="show_ime" msgid="2506087537466597099">"Auf dem Display einblenden, wenn die physische Tastatur aktiv ist"</string> + <string name="show_ime" msgid="2506087537466597099">"Bildschirmtastatur auch dann anzeigen, wenn physische Tastatur aktiv ist"</string> <string name="hardware" msgid="194658061510127999">"Virtuelle Tastatur einblenden"</string> <string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Physische Tastatur konfigurieren"</string> <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Zum Auswählen von Sprache und Layout tippen"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index c06e1c59e3a8..fac3a6237924 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Πολύ παρόμοιο, αλλάξτε την πόζα σας."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Στρέψτε λιγότερο το κεφάλι σας."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Στρέψτε λιγότερο το κεφάλι σας."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Στρέψτε λιγότερο το κεφάλι σας."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Απομακρύνετε οτιδήποτε κρύβει το πρόσωπό σας."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Καθαρίστε τον αισθητήρα επάνω στην οθόνη."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Αδύν. επαλήθ. προσώπου. Μη διαθέσιμος εξοπλισμός."</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index e1e618c868b1..ef92758c24ab 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Too similar, please change your pose."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Turn your head a little less."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Turn your head a little less."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Turn your head a little less."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Remove anything hiding your face."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Clean the sensor at the top edge of the screen."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Can’t verify face. Hardware not available."</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 4585a256184c..eb2b01256df7 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Too similar, please change your pose."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Turn your head a little less."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Turn your head a little less."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Turn your head a little less."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Remove anything hiding your face."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Clean the sensor at the top edge of the screen."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Can’t verify face. Hardware not available."</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index e1e618c868b1..ef92758c24ab 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Too similar, please change your pose."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Turn your head a little less."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Turn your head a little less."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Turn your head a little less."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Remove anything hiding your face."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Clean the sensor at the top edge of the screen."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Can’t verify face. Hardware not available."</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index e1e618c868b1..ef92758c24ab 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Too similar, please change your pose."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Turn your head a little less."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Turn your head a little less."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Turn your head a little less."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Remove anything hiding your face."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Clean the sensor at the top edge of the screen."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Can’t verify face. Hardware not available."</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 9fffe2f29a4d..53b3c2caccbc 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Too similar, please change your pose."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Turn your head a little less."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Turn your head a little less."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Turn your head a little less."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Remove anything hiding your face."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Clean the sensor at the top edge of the screen."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Can’t verify face. Hardware not available."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 5c580ea6c038..ead403facc43 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Es muy similar a la anterior. Haz otra pose."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Gira la cabeza un poco menos."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Gira la cabeza un poco menos."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Gira la cabeza un poco menos."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Quítate cualquier objeto que te cubra el rostro."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Limpiar sensor del borde superior de la pantalla."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"No se verificó el rostro. Hardware no disponible."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index e54af4e8f5bc..17e7c4a2b1a1 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Se parece mucha a la anterior. Pon otra cara."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Gira la cabeza un poco menos."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Gira la cabeza un poco menos."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"No gires tanto la cabeza."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Retira cualquier objeto que no deje ver tu cara."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Limpia el sensor situado en la parte superior."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"No se puede verificar. Hardware no disponible."</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 01bd8a4893ef..84500af90f45 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Liiga sarnane, palun muutke oma asendit."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Pöörake oma pead veidi vähem."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Pöörake oma pead veidi vähem."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Pöörake oma pead veidi vähem."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Eemaldage kõik, mis varjab teie nägu."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Puhastage ekraani ülaservas olev andur."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Nägu ei saa kinnitada. Riistvara pole saadaval."</string> @@ -1804,7 +1801,7 @@ <string name="confirm_battery_saver" msgid="639106420541753635">"OK"</string> <string name="battery_saver_description_with_learn_more" msgid="2108984221113106294">"Aku tööea pikendamiseks lülitab akusäästja taustategevused, mõningad visuaalsed efektid ja muud akut koormavad funktsioonid välja või piirab neid. "<annotation id="url">"Lisateave"</annotation></string> <string name="battery_saver_description" msgid="6413346684861241431">"Aku tööea pikendamiseks lülitab akusäästja taustategevused, mõningad visuaalsed efektid ja muud akut koormavad funktsioonid välja või piirab neid."</string> - <string name="data_saver_description" msgid="6015391409098303235">"Andmekasutuse vähendamiseks keelab andmemahu säästja mõne rakenduse puhul andmete taustal saatmise ja vastuvõtmise. Rakendus, mida praegu kasutate, pääseb andmesidele juurde, kuid võib seda teha väiksema sagedusega. Seetõttu võidakse näiteks kujutised kuvada alles siis, kui neid puudutate."</string> + <string name="data_saver_description" msgid="6015391409098303235">"Andmekasutuse vähendamiseks keelab andmemahu säästja mõne rakenduse puhul andmete taustal saatmise ja vastuvõtmise. Rakendus, mida praegu kasutate, pääseb andmesidele juurde, kuid võib seda teha väiksema sagedusega. Seetõttu võidakse näiteks pildid kuvada alles siis, kui neid puudutate."</string> <string name="data_saver_enable_title" msgid="4674073932722787417">"Lül. andmemahu säästja sisse?"</string> <string name="data_saver_enable_button" msgid="7147735965247211818">"Lülita sisse"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 1cca09e32e75..8b6a5f896838 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Jarrera berdintsuegia da. Alda ezazu."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Biratu burua pixka bat gutxiago."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Biratu burua pixka bat gutxiago."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Biratu burua pixka bat gutxiago."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Kendu aurpegia estaltzen dizuten gauzak."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Garbitu pantailaren goiko ertzeko sentsorea."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Ezin da egiaztatu aurpegia. Hardwarea ez dago erabilgarri."</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index f6b2ab717326..3c14011ccb69 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"بسیار شبیه قبلی است، لطفاً قیافه دیگری بگیرید."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"سرتان را کمی پایین آورید."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"سرتان را کمی پایین آورید."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"سرتان را کمی پایین آورید."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"هرچیزی را که حائل چهرهتان است بردارید."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"حسگر واقع در لبه بالای صفحه را تمیز کنید."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"چهره تأیید نشد. سختافزار در دسترس نیست."</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 1fa7efa69c15..1ce4792a69c5 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Liian samanlainen, vaihda asentoa."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Käännä päätä vähän vähemmän."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Käännä päätä vähän vähemmän."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Käännä päätä vähän vähemmän."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Poista esteet kasvojesi edestä."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Puhdista näytön yläreunassa oleva anturi."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Kasvoja ei voi vahvistaa. Laitteisto ei käytettäv."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index bea10c3fd57c..b5b613058660 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Trop similaire. Changez de pose."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Tournez un peu moins votre tête."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Tournez un peu moins votre tête."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Tournez un peu moins votre tête."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Retirez tout ce qui pourrait couvrir votre visage."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Nettoyez le capteur dans le haut de l\'écran."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Imposs. de vérif. visage. Matériel non accessible."</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index d26cacc256cf..965feb08c655 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -301,7 +301,7 @@ <string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"Autoriser <xliff:g id="APP_NAME">%1$s</xliff:g> à accéder aux données relatives à votre activité physique ?"</string> <string name="permgrouplab_camera" msgid="4820372495894586615">"Appareil photo"</string> <string name="permgroupdesc_camera" msgid="3250611594678347720">"prendre des photos et enregistrer des vidéos"</string> - <string name="permgrouprequest_camera" msgid="1299833592069671756">"Autoriser l\'appli <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> à prendre des photos et enregistrer des vidéos ?"</string> + <string name="permgrouprequest_camera" msgid="1299833592069671756">"Autoriser <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> à prendre des photos et enregistrer des vidéos ?"</string> <string name="permgrouplab_calllog" msgid="8798646184930388160">"Journaux d\'appels"</string> <string name="permgroupdesc_calllog" msgid="3006237336748283775">"Lire et écrire les journaux d\'appels du téléphone"</string> <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Autoriser l\'appli <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> à accéder aux journaux d\'appels de votre téléphone ?"</string> @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Ressemble à un visage existant, changez de pose."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Tournez un peu moins la tête."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Tournez un peu moins la tête."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Tournez un peu moins la tête."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Retirez tout ce qui cache votre visage."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Nettoyez le capteur en haut de l\'écran."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Imposs. valider visage. Matériel non disponible."</string> @@ -1367,7 +1364,7 @@ <string name="share_remote_bugreport_action" msgid="6249476773913384948">"PARTAGER"</string> <string name="decline_remote_bugreport_action" msgid="6230987241608770062">"REFUSER"</string> <string name="select_input_method" msgid="4653387336791222978">"Sélectionnez le mode de saisie"</string> - <string name="show_ime" msgid="2506087537466597099">"Afficher l\'écran virtuel même lorsque le clavier physique est actif"</string> + <string name="show_ime" msgid="2506087537466597099">"Afficher le clavier virtuel même lorsque le clavier physique est actif"</string> <string name="hardware" msgid="194658061510127999">"Afficher le clavier virtuel"</string> <string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"Configurer le clavier physique"</string> <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Appuyer pour sélectionner la langue et la disposition"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 102beb9bc3b0..dcaaebf60e00 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"É moi similar. Cambia a pose."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Xira a cabeza un pouco menos."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Xira a cabeza un pouco menos."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Xira a cabeza un pouco menos."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Quita todo o que oculte a túa cara."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Limpa o sensor na parte superior da pantalla."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Sen verificar a cara. Hardware non dispoñible."</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index e0107e97c04e..5456a466fe51 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -571,16 +571,11 @@ <string name="face_acquired_recalibrate" msgid="8077949502893707539">"કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ચહેરો ઓળખી શકાતો નથી. ફરી પ્રયાસ કરો."</string> <string name="face_acquired_too_similar" msgid="1508776858407646460">"ઘણી સમાનતા ધરાવે છે, કૃપા કરીને તમારો પોઝ બદલો."</string> - <!-- no translation found for face_acquired_pan_too_extreme (4581629343077288178) --> - <skip /> - <!-- no translation found for face_acquired_tilt_too_extreme (4019954263012496468) --> - <skip /> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"તમારું માથું થોડું ફેરવો."</string> + <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"તમારું માથું થોડું ફેરવો."</string> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"તમારું માથું થોડું ઓછું ફેરવો."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"તમારા ચહેરાને છુપાવતી કંઈપણ વસ્તુ દૂર કરો."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"સ્ક્રીનની ટોચની ધાર પરના સેન્સરને સાફ કરો."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ચહેરો ચકાસી શકાતો નથી. હાર્ડવેર ઉપલબ્ધ નથી."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index d47d0425d15d..65d87eb8d4d1 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -571,16 +571,11 @@ <string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया फिर से अपने चेहरे की पहचान कराएं."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"अब चेहरे की पहचान नहीं कर पा रहा. फिर से कोशिश करें."</string> <string name="face_acquired_too_similar" msgid="1508776858407646460">"चेहरा काफ़ी मिलता-जुलता है, कृपया अपना पोज़ बदलें."</string> - <!-- no translation found for face_acquired_pan_too_extreme (4581629343077288178) --> - <skip /> - <!-- no translation found for face_acquired_tilt_too_extreme (4019954263012496468) --> - <skip /> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"अपना सिर थोड़ा कम घुमाएं."</string> + <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"अपना सिर थोड़ा कम घुमाएं."</string> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"अपना सिर थोड़ा कम घुमाएं"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"आपके चेहरे को छिपाने वाली सभी चीज़ों को हटाएं"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"स्क्रीन के ऊपरी किनारे पर मौजूद सेंसर को साफ करें."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"चेहरा नहीं पहचान पा रहे. हार्डवेयर उपलब्ध नहीं है."</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index fd7fcce6acca..01b223973965 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -576,12 +576,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Previše slično, promijenite pozu."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Nagnite glavu malo manje."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Nagnite glavu malo manje."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Nagnite glavu malo manje."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Uklonite sve što vam zakriva lice."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Očistite senzor na gornjem rubu zaslona."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Lice nije potvrđeno. Hardver nije dostupan."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 8571ebbc39eb..c790311abc2a 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Túlságosan hasonló, változtasson a pózon."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Kicsit kevésbé fordítsa el a fejét."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Kicsit kevésbé fordítsa el a fejét."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Kicsit kevésbé fordítsa el a fejét."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Távolítson el mindent, ami takarja az arcát."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Tisztítsa meg a képernyő tetején lévő érzékelőt."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Sikertelen arcellenőrzés. A hardver nem érhető el."</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 20aaf6c35a15..4c27f218a273 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Շատ նման է նախորդին։ Փոխեք ձեր դիրքը։"</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Գլուխն ուղիղ պահեք։"</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Գլուխն ուղիղ պահեք։"</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Գլուխն ուղիղ պահեք։"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Հեռացրեք այն ամենը, ինչը թաքցնում է ձեր երեսը:"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Մաքրեք էկրանի վերևի անկյունում գտնվող տվիչը:"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Չհաջողվեց հաստատել դեմքը։ Սարքն անհասանելի է:"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 00cc38f7d98d..8c9393db1896 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Terlalu mirip, ubah pose Anda."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Putar sedikit kepala Anda."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Putar sedikit kepala Anda."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Putar sedikit kepala Anda."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Singkirkan apa saja yang menutupi wajah Anda."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Bersihkan sensor di tepi atas layar."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Tidak dapat memverifikasi wajah. Hardware tidak tersedia."</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 57df45c658a7..a2e058d65f76 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Of svipað. Stilltu þér öðruvísi upp."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Snúðu höfðinu aðeins minna."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Hallaðu höfðinu aðeins minna."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Snúðu höfðinu aðeins minna."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Fjarlægðu það sem kann að hylja andlitið."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Hreinsaðu skynjarann á efri brún skjásins."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Andlit ekki staðfest. Vélbúnaður er ekki tiltækur."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 67a36d11cf6d..623c0440e4fe 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Troppo simile; cambia posa."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Gira un po\' meno la testa."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Gira un po\' meno la testa."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Gira un po\' meno la testa."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Rimuovi tutto ciò che ti nasconde il viso."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Pulisci sensore sul bordo superiore dello schermo."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Imposs. verificare volto. Hardware non disponibile."</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 9660a3748938..532f1cbe2fb7 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"似すぎています。ポーズを変えてください。"</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"顔の向きを少し戻してください。"</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"顔の向きを少し戻してください。"</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"顔の向きを少し戻してください。"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"顔を隠しているものをすべて外してください"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"画面の上端にあるセンサーの汚れを落としてください。"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"顔を確認できません。ハードウェアを利用できません。"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 1e4eba005088..a610af36e840 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -228,7 +228,7 @@ <string name="global_action_bug_report" msgid="7934010578922304799">"ხარვეზის შესახებ ანგარიში"</string> <string name="global_action_logout" msgid="935179188218826050">"სესიის დასრულება"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"ეკრანის ანაბეჭდი"</string> - <string name="bugreport_title" msgid="5981047024855257269">"სისტ. ხარვეზ. ანგარ."</string> + <string name="bugreport_title" msgid="5981047024855257269">"ხარვეზის ანგარიში"</string> <string name="bugreport_message" msgid="398447048750350456">"იგი შეაგროვებს ინფორმაციას თქვენი მოწყობილობის ამჟამინდელი მდგომარეობის შესახებ, რათა ის ელფოსტის შეტყობინების სახით გააგზავნოს. ხარვეზის ანგარიშის მომზადებასა და შეტყობინების გაგზავნას გარკვეული დრო სჭირდება. გთხოვთ, მოითმინოთ."</string> <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ინტერაქტიული ანგარიში"</string> <string name="bugreport_option_interactive_summary" msgid="229299488536107968">"გამოიყენეთ ეს ვარიანტი შემთხვევათა უმეტესობაში. ის საშუალებას მოგცემთ, თვალი მიადევნოთ ანგარიშის პროგრესს, პრობლემის შესახებ მეტი დეტალი შეიყვანოთ და გადაიღოთ ეკრანის ანაბეჭდები. ამ ვარიანტის არჩევის შემთხვევაში, შეიძლება მოხდეს ზოგიერთი ნაკლებად გამოყენებადი სექციის გამოტოვება, რომელთა შესახებ მოხსენებასაც დიდი დრო სჭირდება."</string> @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"მეტისმეტად მსგავსია. გთხოვთ, შეცვალოთ პოზა."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"თავი ცოტა ნაკლებად მიაბრუნეთ."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"თავი ცოტა ნაკლებად მიაბრუნეთ."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"თავი ცოტა ნაკლებად მიაბრუნეთ."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"მოაშორეთ ყველაფერი, რაც სახეს გიფარავთ."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"გაწმინდეთ სენსორი ეკრანის ზედა კიდეზე."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"სახე ვერ დასტურდება. აპარატი მიუწვდომელია."</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 17b92da51826..085b5d85b585 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -571,16 +571,11 @@ <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Қайта тіркеліңіз."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Енді бет анықтау мүмкін емес. Әрекетті қайталаңыз."</string> <string name="face_acquired_too_similar" msgid="1508776858407646460">"Алдыңғысына тым ұқсас, басқаша қалыпта түсіңіз."</string> - <!-- no translation found for face_acquired_pan_too_extreme (4581629343077288178) --> - <skip /> - <!-- no translation found for face_acquired_tilt_too_extreme (4019954263012496468) --> - <skip /> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Басыңызды түзурек ұстаңыз."</string> + <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Басыңызды түзурек ұстаңыз."</string> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Басыңызды кішкене бұрыңыз."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Бетіңізді жауып тұрған нәрсені алып тастаңыз."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Экранның жоғарғы жиегіндегі датчикті тазалаңыз."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Бетті тану мүмкін емес. Жабдық қолжетімді емес."</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 67c7c27ec40d..3ef1bf08c6d5 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"ស្រដៀងគ្នាពេក សូមផ្លាស់ប្ដូរកាយវិការរបស់អ្នក។"</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"ងាកក្បាលរបស់អ្នកបន្តិចទៀត។"</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ងាកក្បាលរបស់អ្នកបន្តិចទៀត។"</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ងាកក្បាលរបស់អ្នកបន្តិចទៀត។"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"យកអ្វីដែលបាំងមុខរបស់អ្នកចេញ។"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"សម្អាតឧបករណ៍ចាប់សញ្ញានៅគែមខាងលើនៃអេក្រង់។"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"មិនអាចផ្ទៀងផ្ទាត់មុខបានទេ។ មិនមានហាតវែរទេ។"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index ffb02d8ac3d4..dab10df3c1ef 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"ತುಂಬಾ ಸಮಾನ, ನಿಮ್ಮ ಪೋಸ್ ಬದಲಾಯಿಸಿ."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"ನಿಮ್ಮ ತಲೆಯನ್ನು ಹೆಚ್ಚು ತಿರುಗಿಸಬೇಡಿ."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ನಿಮ್ಮ ತಲೆಯನ್ನು ಹೆಚ್ಚು ತಿರುಗಿಸಬೇಡಿ."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ನಿಮ್ಮ ತಲೆಯನ್ನು ಸ್ವಲ್ಪ ಕಡಿಮೆ ತಿರುಗಿಸಿ."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"ನಿಮ್ಮ ಮುಖವನ್ನು ಮರೆಮಾಡುವ ಯಾವುದನ್ನಾದರೂ ತೆಗೆದುಹಾಕಿ."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"ಸ್ಕ್ರೀನ್ ಮೇಲ್ಬಾಗದ ಅಂಚಿನಲ್ಲಿನ ಸೆನ್ಸರ್ ಸ್ವಚ್ಚಗೊಳಿಸಿ."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ಮುಖ ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಹಾರ್ಡ್ವೇರ್ ಲಭ್ಯವಿಲ್ಲ."</string> @@ -1369,7 +1366,7 @@ <string name="decline_remote_bugreport_action" msgid="6230987241608770062">"ನಿರಾಕರಿಸಿ"</string> <string name="select_input_method" msgid="4653387336791222978">"ಇನ್ಪುಟ್ ವಿಧಾನವನ್ನು ಆರಿಸಿ"</string> <string name="show_ime" msgid="2506087537466597099">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್ ಸಕ್ರಿಯವಾಗಿರುವಾಗ ಅದನ್ನು ಪರದೆಯ ಮೇಲಿರಿಸಿ"</string> - <string name="hardware" msgid="194658061510127999">"ವರ್ಚ್ಯುಯಲ್ ಕೀಬೋರ್ಡ್ ತೋರಿಸು"</string> + <string name="hardware" msgid="194658061510127999">"ವರ್ಚುವಲ್ ಕೀಬೋರ್ಡ್ ತೋರಿಸಿ"</string> <string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string> <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ಭಾಷೆ ಮತ್ತು ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 072a365438cf..9a76aa2898bb 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"너무 비슷합니다. 다른 포즈를 취해 보세요."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"고개를 조금 덜 돌려 보세요."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"고개를 조금 덜 돌려 보세요."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"고개를 조금 덜 돌려 보세요."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"얼굴이 가려지지 않도록 해 주세요."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"화면 상단 가장자리의 센서를 깨끗하게 닦아 주세요."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"얼굴을 확인할 수 없습니다. 하드웨어를 사용할 수 없습니다."</string> @@ -985,8 +982,8 @@ <string name="preposition_for_year" msgid="5040395640711867177">"<xliff:g id="YEAR">%s</xliff:g>년"</string> <string name="day" msgid="8144195776058119424">"일"</string> <string name="days" msgid="4774547661021344602">"일"</string> - <string name="hour" msgid="2126771916426189481">"시간"</string> - <string name="hours" msgid="894424005266852993">"시간"</string> + <string name="hour" msgid="2126771916426189481">"시"</string> + <string name="hours" msgid="894424005266852993">"시"</string> <string name="minute" msgid="9148878657703769868">"분"</string> <string name="minutes" msgid="5646001005827034509">"분"</string> <string name="second" msgid="3184235808021478">"초"</string> @@ -1849,7 +1846,7 @@ <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"다운타임"</string> <string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"평일 밤"</string> <string name="zen_mode_default_weekends_name" msgid="2786495801019345244">"주말"</string> - <string name="zen_mode_default_events_name" msgid="8158334939013085363">"캘린더 일정"</string> + <string name="zen_mode_default_events_name" msgid="8158334939013085363">"캘린더 일정 중"</string> <string name="zen_mode_default_every_night_name" msgid="3012363838882944175">"수면 중"</string> <string name="muted_by" msgid="5942954724562097128">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>(이)가 일부 소리를 음소거함"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"사용 중인 기기 내부에 문제가 발생했습니다. 초기화할 때까지 불안정할 수 있습니다."</string> @@ -1925,7 +1922,7 @@ <string name="app_category_productivity" msgid="3742083261781538852">"생산성"</string> <string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"기기 저장용량"</string> <string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB 디버깅"</string> - <string name="time_picker_hour_label" msgid="2979075098868106450">"시간"</string> + <string name="time_picker_hour_label" msgid="2979075098868106450">"시"</string> <string name="time_picker_minute_label" msgid="5168864173796598399">"분"</string> <string name="time_picker_header_text" msgid="143536825321922567">"시간 설정"</string> <string name="time_picker_input_error" msgid="7574999942502513765">"올바른 시간을 입력하세요."</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index ad03d79f6016..663e48bd1df5 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -571,16 +571,11 @@ <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Жүзүңүздү кайра таанытыңыз."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Жүз таанылган жок. Кайра аракет кылыңыз."</string> <string name="face_acquired_too_similar" msgid="1508776858407646460">"Мурункуга окшош болуп калды, башкача туруңуз."</string> - <!-- no translation found for face_acquired_pan_too_extreme (4581629343077288178) --> - <skip /> - <!-- no translation found for face_acquired_tilt_too_extreme (4019954263012496468) --> - <skip /> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Башыңызды бир аз гана эңкейтиңиз."</string> + <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Башыңызды бир аз гана эңкейтиңиз."</string> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Башыңызды бир аз гана эңкейтиңиз."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Жүзүңүздү жашырып турган нерселерди алып салыңыз."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Экрандын жогору жагындагы сенсорду тазалаңыз."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Жүз ырасталбай жатат. Аппараттык камсыздоо жеткиликсиз."</string> @@ -1933,7 +1928,7 @@ <string name="time_picker_minute_label" msgid="5168864173796598399">"мүнөт"</string> <string name="time_picker_header_text" msgid="143536825321922567">"Убакытты коюу"</string> <string name="time_picker_input_error" msgid="7574999942502513765">"Убакытты туура көрсөтүңүз"</string> - <string name="time_picker_prompt_label" msgid="7588093983899966783">"Убакытты жазыңыз"</string> + <string name="time_picker_prompt_label" msgid="7588093983899966783">"Убакытты киргизиңиз"</string> <string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Убакытты текст киргизүү режиминде киргизиңиз."</string> <string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Убакытты дубал саатынын режиминде киргизиңиз."</string> <string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Автотолтуруу опциялары"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index d30159906d99..e3cd3f91c8bc 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -571,16 +571,11 @@ <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ກະລຸນາລົງທະບຽນອຸປະກອນຂອງທ່ານອີກເທື່ອໜຶ່ງ."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ບໍ່ສາມາດຈຳແນກໃບໜ້າໄດ້ອີກຕໍ່ໄປ. ກະລຸນາລອງໃໝ່."</string> <string name="face_acquired_too_similar" msgid="1508776858407646460">"ຄ້າຍກັນເກີນໄປ, ກະລຸນາປ່ຽນທ່າຂອງທ່ານ."</string> - <!-- no translation found for face_acquired_pan_too_extreme (4581629343077288178) --> - <skip /> - <!-- no translation found for face_acquired_tilt_too_extreme (4019954263012496468) --> - <skip /> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"ອຽງຫົວຂອງທ່ານໜ້ອຍໜຶ່ງ."</string> + <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ອຽງຫົວຂອງທ່ານໜ້ອຍໜຶ່ງ."</string> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ອຽງຫົວຂອງທ່ານໜ້ອຍໜຶ່ງ."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"ນຳສິ່ງທີ່ກີດຂວາງໃບໜ້າທ່ານອອກ."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"ທຳຄວາມສະອາດເຊັນເຊີຢູ່ເທິງສຸດຂອງຂອບຈໍ."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ບໍ່ສາມາດຢັ້ງຢືນໃບໜ້າໄດ້. ບໍ່ມີຮາດແວໃຫ້ໃຊ້."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 28ce6edacd72..f03a2c857c73 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -579,12 +579,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Per daug panašu, pakeiskite veido išraišką."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Nesukite tiek galvos."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Nesukite tiek galvos."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Nesukite tiek galvos."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Patraukite viską, kas užstoja jūsų veidą."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Nuvalykite jutiklį, esantį ekrano viršuje."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Nepavyko patv. veido. Aparatinė įranga negalima."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 888e637e062d..8e7ec0853e09 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -576,12 +576,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Pārāk līdzīgi. Lūdzu, mainiet pozu."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Pagrieziet galvu nedaudz mazāk."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Pagrieziet galvu nedaudz mazāk."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Pagrieziet galvu nedaudz mazāk."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Noņemiet visu, kas aizsedz jūsu seju."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Notīriet sensoru ekrāna augšējā malā."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Nevar verificēt seju. Aparatūra nav pieejama."</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 8db6305eec43..dd8c6c2f7c0e 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Премногу слично, сменете ја позата."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Не вртете ја главата толку многу."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Не вртете ја главата толку многу."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Не вртете ја главата толку многу."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Отстранете ги работите што ви го покриваат лицето."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Исчистете го сензорот на горниот врв од екранот."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Ликот не може да се потврди. Хардвер - недостапен."</string> @@ -1807,7 +1804,7 @@ <string name="confirm_battery_saver" msgid="639106420541753635">"Во ред"</string> <string name="battery_saver_description_with_learn_more" msgid="2108984221113106294">"Штедачот на батерија ги исклучува или ограничува активноста во заднина, некои визуелни ефекти и други функции со голема потрошувачка на енергија за да се продолжи траењето на батеријата. "<annotation id="url">"Дознајте повеќе"</annotation></string> <string name="battery_saver_description" msgid="6413346684861241431">"Штедачот на батерија ги исклучува или ограничува активноста во заднина, некои визуелни ефекти и други функции со голема потрошувачка на енергија за да се продолжи траењето на батеријата."</string> - <string name="data_saver_description" msgid="6015391409098303235">"За да се намали користењето интернет, Штедачот на интернет спречува дел од апликациите да испраќаат или да примаат податоци во заднина. Апликацијата што ја користите во моментов можеби ќе пристапува до интернет, но тоа ќе го прави поретко. Ова значи, на пример, дека сликите нема да се прикажат додека не ги допрете."</string> + <string name="data_saver_description" msgid="6015391409098303235">"За да се намали користењето интернет, „Штедачот на интернет“ спречува дел од апликациите да испраќаат или да примаат податоци во заднина. Апликацијата што ја користите во моментов можеби ќе пристапува до интернет, но тоа ќе го прави поретко. Ова значи, на пример, дека сликите нема да се прикажат додека не ги допрете."</string> <string name="data_saver_enable_title" msgid="4674073932722787417">"Вклучете Штедач на интернет?"</string> <string name="data_saver_enable_button" msgid="7147735965247211818">"Вклучи"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index c09330b0b87e..10e16cad4991 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -526,7 +526,7 @@ <string name="biometric_error_canceled" msgid="349665227864885880">"പരിശോധിച്ചുറപ്പിക്കൽ റദ്ദാക്കി"</string> <string name="biometric_error_device_not_secured" msgid="6583143098363528349">"പിന്നോ പാറ്റേണോ പാസ്വേഡോ സജ്ജീകരിച്ചിട്ടില്ല"</string> <string name="fingerprint_acquired_partial" msgid="735082772341716043">"വിരലടയാളം ഭാഗികമായി തിരിച്ചറിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string> - <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"വിരലടയാളം പ്രോസസ്സ് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക."</string> + <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"വിരലടയാളം പ്രോസസ് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക."</string> <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"വിരലടയാള സെൻസറിൽ ചെളിയുണ്ട്. അത് വൃത്തിയാക്കി വീണ്ടും ശ്രമിക്കുക."</string> <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"വിരൽ വളരെ വേഗത്തിൽ നീക്കി. വീണ്ടും ശ്രമിക്കുക."</string> <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"വിരൽ വളരെ പതുക്കെ നീക്കി. വീണ്ടും ശ്രമിക്കുക."</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 11dbc522803b..70e46b4c4f8a 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Хэт адилхан байгаа тул байрлалаа өөрчилнө үү."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Толгойгоо арай багаар эргүүлнэ үү."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Толгойгоо арай багаар эргүүлнэ үү."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Толгойгоо арай багаар эргүүлнэ үү."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Таны нүүрийг далдалж буй аливаа зүйлийг хасна уу."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Дэлгэцийн дээд ирмэгт байрлах мэдрэгчийг цэвэрлэнэ үү."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Царайг бататгаж чадсангүй. Техник хангамж боломжгүй байна."</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 73c42f184de1..9a4630ce7326 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -301,7 +301,7 @@ <string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला तुमची शारीरिक अॅक्टिव्हिटी अॅक्सेस करण्याची अनुमती द्यायची का?"</string> <string name="permgrouplab_camera" msgid="4820372495894586615">"कॅमेरा"</string> <string name="permgroupdesc_camera" msgid="3250611594678347720">"चित्रे घेण्याची आणि व्हिडिओ रेकॉर्ड"</string> - <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला फोटो घेऊ आणि व्हिडिओ रेकॉर्ड करू द्यायचा?"</string> + <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला फोटो घेऊ आणि व्हिडिओ रेकॉर्ड करू द्यायचे?"</string> <string name="permgrouplab_calllog" msgid="8798646184930388160">"कॉल लॉग"</string> <string name="permgroupdesc_calllog" msgid="3006237336748283775">"फोन कॉल लॉग वाचा आणि लिहा"</string> <string name="permgrouprequest_calllog" msgid="8487355309583773267">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला तुमचे फोन कॉल लॉग अॅक्सेस करण्याची अनुमती द्यायची का?"</string> @@ -1803,9 +1803,9 @@ <string name="package_updated_device_owner" msgid="1847154566357862089">"आपल्या प्रशासकाने अपडेट केले"</string> <string name="package_deleted_device_owner" msgid="2307122077550236438">"आपल्या प्रशासकाने हटवले"</string> <string name="confirm_battery_saver" msgid="639106420541753635">"ओके"</string> - <string name="battery_saver_description_with_learn_more" msgid="2108984221113106294">"बॅटरी लाइफ वाढवण्यासाठी बॅटरी सेव्हर बॅकग्राउंड अॅक्टिव्हिटी, काही व्हिज्युअल इफेक्ट आणि इतर हाय-पॉवर वैशिष्ट्ये बंद किंवा मर्यादित करतो. "<annotation id="url">"अधिक जाणून घ्या"</annotation></string> + <string name="battery_saver_description_with_learn_more" msgid="2108984221113106294">"बॅटरी सेव्हर हे वैशिष्ट्य बॅटरीचे आयुष्य वाढवण्यासाठी बॅकग्राउंड अॅक्टिव्हिटी, काही व्हिज्युअल इफेक्ट आणि इतर हाय-पॉवर वैशिष्ट्ये बंद किंवा मर्यादित करते. "<annotation id="url">"अधिक जाणून घ्या"</annotation></string> <string name="battery_saver_description" msgid="6413346684861241431">"बॅटरी लाइफ वाढवण्यासाठी बॅटरी सेव्हर बॅकग्राउंड अॅक्टिव्हिटी, काही व्हिज्युअल इफेक्ट आणि इतर हाय-पॉवर वैशिष्ट्ये बंद किंवा मर्यादित करतो."</string> - <string name="data_saver_description" msgid="6015391409098303235">"डेटा वापर कमी करण्यात मदत करण्यासाठी, डेटा सर्व्हर काही अॅप्सना पार्श्वभूमीमध्ये डेटा पाठविण्यास किंवा मिळवण्यास प्रतिबंध करतो. तुम्ही सध्या वापरत असलेला अॅप डेटामध्ये प्रवेश करू शकतो परंतु तसे तो खूप कमी वेळा करू शकतो. याचा अर्थ, उदाहरणार्थ, तुम्ही इमेज टॅप करेपर्यंत त्या प्रदर्शित करणार नाहीत असा असू शकतो."</string> + <string name="data_saver_description" msgid="6015391409098303235">"डेटा सर्व्हर डेटाचा वापर कमी करण्यात मदत करण्यासाठी काही अॅप्सना पार्श्वभूमीमध्ये डेटा पाठवण्यास किंवा मिळवण्यास प्रतिबंध करतो. तुम्ही सध्या वापरत असलेले अॅप डेटा अॅक्सेस करू शकते, पण तसे खूप कमी वेळा होते. याचाच अर्थ असा की, तुम्ही इमेजवर टॅप करेपर्यंत त्या डिस्प्ले होणार नाहीत असा असू शकतो."</string> <string name="data_saver_enable_title" msgid="4674073932722787417">"डेटा सेव्हर चालू करायचा?"</string> <string name="data_saver_enable_button" msgid="7147735965247211818">"चालू करा"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 76261b30b331..65e243139123 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Terlalu serupa, sila ubah lagak gaya anda."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Pusingkan kepala anda kurang sedikit."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Pusingkan kepala anda kurang sedikit."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Pusingkan kepala anda kurang sedikit."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Alih keluar apa saja yang melindungi wajah anda."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Bersihkan penderia di tepi bahagian atas skrin."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Tdk dpt sahkan wajah. Perkakasan tidak tersedia."</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 80a08383f18a..f3f077b70dda 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"ဆင်တူနေသည်၊ အမူအရာ ပြောင်းပါ။"</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"ခေါင်းကို သိပ်မလှည့်ပါနှင့်။"</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ခေါင်းကို သိပ်မလှည့်ပါနှင့်။"</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ခေါင်းကို သိပ်မလှည့်ပါနှင့်။"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"သင့်မျက်နှာကို ကွယ်နေသည့်အရာအားလုံး ဖယ်ပါ။"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"မျက်နှာပြင်ထိပ်ရှိ အာရုံခံဆင်ဆာကို သန့်ရှင်းပါ။"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"မျက်နှာကို အတည်ပြု၍ မရပါ။ ဟာ့ဒ်ဝဲ မရနိုင်ပါ။"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index ff02690a241d..5ca5d942ff41 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"For likt – endre posituren din."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Vri hodet ditt litt mindre."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Vri hodet ditt litt mindre."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Vri hodet ditt litt mindre."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Fjern alt som skjuler ansiktet ditt."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Rengjør sensoren på toppkanten av skjermen."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Kan ikke bekrefte ansikt. Utilgjengelig maskinvare."</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 549441cfae7d..aa996108203d 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -416,9 +416,9 @@ <string name="permlab_accessFineLocation" msgid="6265109654698562427">"अग्रभूमिमा मात्र सटीक स्थानमाथि पहुँच राख्नुहोस्"</string> <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"यो अनुप्रयोगले अग्रभागमा चलिरहेको अवस्थामा मात्र तपाईंलाई स्थानको सटिक जानकारी दिन सक्छ। यी स्थानसम्बन्धी सेवाहरू अनिवार्य रूपमा सक्रिय गरिएका हुनु पर्छ र अनुप्रयोगले यिनीहरूको प्रयोग गर्न सकोस् भन्नाका खातिर तपाईंको फोनमै उपलब्ध हुन्छन्। यस कार्यले गर्दा ब्याट्री बढी खर्च हुन सक्छ।"</string> <string name="permlab_accessCoarseLocation" msgid="3707180371693213469">"अग्रभूमिमा मात्र अनुमानित स्थान (नेटवर्कमा आधारित) माथि पहुँच राख्नुहोस्"</string> - <string name="permdesc_accessCoarseLocation" product="tablet" msgid="8594719010575779120">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको ट्याब्लेटमा उपलब्ध हुनु पर्छ।"</string> - <string name="permdesc_accessCoarseLocation" product="tv" msgid="3027871910200890806">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको TV मा उपलब्ध हुनु पर्छ।"</string> - <string name="permdesc_accessCoarseLocation" product="default" msgid="854896049371048754">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको फोनमा उपलब्ध हुनु पर्छ।"</string> + <string name="permdesc_accessCoarseLocation" product="tablet" msgid="8594719010575779120">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थानसम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको ट्याब्लेटमा उपलब्ध हुनु पर्छ।"</string> + <string name="permdesc_accessCoarseLocation" product="tv" msgid="3027871910200890806">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थानसम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको TV मा उपलब्ध हुनु पर्छ।"</string> + <string name="permdesc_accessCoarseLocation" product="default" msgid="854896049371048754">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थानसम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको फोनमा उपलब्ध हुनु पर्छ।"</string> <string name="permlab_accessBackgroundLocation" msgid="3965397804300661062">"पृष्ठभूमिमा स्थानसम्बन्धी पहुँच"</string> <string name="permdesc_accessBackgroundLocation" msgid="1096394429579210251">"यसका अतिरिक्त यसलाई अनुमानित वा सटिक स्थानमाथि पहुँच राख्ने अनुमति दिइएको छ भने उक्त अनुप्रयोगले पृष्ठभूमिमा चलिरहेको बेला स्थानमाथि पहुँच राख्न सक्छ।"</string> <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"तपाईँका अडियो सेटिङहरू परिवर्तन गर्नुहोस्"</string> @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"अनुहार उस्तै भयो, कृपया आफ्नो पोज बदल्नुहोस्।"</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"आफ्नो टाउको अलि थोरै घुमाउनुहोस्।"</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"आफ्नो टाउको अलि थोरै घुमाउनुहोस्।"</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"आफ्नो टाउको अलि थोरै घुमाउनुहोस्।"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"तपाईंको अनुहार लुकाउने सबै कुरा लुकाउनुहोस्।"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"स्क्रिनको शीर्ष कुनामा रहेको सेन्सर सफा गर्नुहोस्।"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"अनुहार पुष्टि गर्न सकिएन। हार्डवेयर उपलब्ध छैन।"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 544d2265656b..61ffafc878a3 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Lijkt te veel op elkaar. Verander je pose."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Draai je hoofd iets minder."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Draai je hoofd iets minder."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Draai je hoofd iets minder."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Zorg dat je gezicht volledig zichtbaar is."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Maak de sensor bovenaan het scherm schoon."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Kan gezicht niet verifiëren. Hardware niet beschikbaar."</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 33ad73d48f43..9ed1040f18f2 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"ਬਹੁਤ ਮਿਲਦਾ-ਜੁਲਦਾ ਹੈ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਅੰਦਾਜ਼ ਬਦਲੋ।"</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"ਆਪਣਾ ਸਿਰ ਥੋੜਾ ਜਿਹਾ ਝੁਕਾਓ।"</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ਆਪਣਾ ਸਿਰ ਥੋੜਾ ਜਿਹਾ ਝੁਕਾਓ।"</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ਆਪਣਾ ਸਿਰ ਥੋੜਾ ਜਿਹਾ ਝੁਕਾਓ।"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"ਤੁਹਾਡਾ ਚਿਹਰਾ ਲੁਕਾਉਣ ਵਾਲੀ ਕੋਈ ਵੀ ਚੀਜ਼ ਹਟਾਓ।"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"ਸਕ੍ਰੀਨ ਦੇ ਸਿਖਰਲੇ ਕਿਨਾਰੇ ਦਾ ਸੈਂਸਰ ਸਾਫ਼ ਕਰੋ।"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਹੋ ਸਕੀ। ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ।"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index b1b232567c66..75bfc859d4dc 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -213,7 +213,7 @@ <string name="reboot_to_update_reboot" msgid="6428441000951565185">"Uruchamiam ponownie…"</string> <string name="reboot_to_reset_title" msgid="4142355915340627490">"Przywracanie danych fabrycznych"</string> <string name="reboot_to_reset_message" msgid="2432077491101416345">"Uruchamiam ponownie…"</string> - <string name="shutdown_progress" msgid="2281079257329981203">"Wyłączanie..."</string> + <string name="shutdown_progress" msgid="2281079257329981203">"Wyłączam..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet zostanie wyłączony."</string> <string name="shutdown_confirm" product="tv" msgid="476672373995075359">"Telewizor zostanie wyłączony."</string> <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"Zegarek zostanie wyłączony."</string> @@ -579,12 +579,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Za mała różnica. Zmień pozycję."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Trochę mniej obróć głowę."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Trochę mniej obróć głowę."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Trochę mniej obróć głowę."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Usuń wszystko, co zasłania Ci twarz."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Wyczyść czujnik na górnej krawędzi ekranu."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Nie można zweryfikować twarzy. Sprzęt niedostępny."</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 5e7927d9f7a0..87c9e1656904 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Muito parecido, mude de posição."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Incline a cabeça um pouco menos."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Incline a cabeça um pouco menos."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Incline a cabeça um pouco menos."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Remova tudo que esteja ocultando seu rosto."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Limpe o sensor na borda superior da tela."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Impossível verificar rosto. Hardware indisponível."</string> @@ -1549,7 +1546,7 @@ <string name="storage_usb_drive_label" msgid="4501418548927759953">"Drive USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string> <string name="storage_usb" msgid="3017954059538517278">"Armazenamento USB"</string> <string name="extract_edit_menu_button" msgid="8940478730496610137">"Editar"</string> - <string name="data_usage_warning_title" msgid="6499834033204801605">"Aviso de dados"</string> + <string name="data_usage_warning_title" msgid="6499834033204801605">"Alerta de uso de dados"</string> <string name="data_usage_warning_body" msgid="7340198905103751676">"Você usou <xliff:g id="APP">%s</xliff:g> de dados"</string> <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Limite de dados móveis atingido"</string> <string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Limite de dados Wi-Fi atingido"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 09f181f96ed9..18728691cdf1 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Muito parecida, mude de pose."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Rode a cabeça um pouco menos."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Rode a cabeça um pouco menos."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Rode a cabeça um pouco menos."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Remova tudo o que esteja a ocultar o seu rosto."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Limpe o sensor na extremidade superior do ecrã."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Não pode validar o rosto. Hardware não disponível."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 5e7927d9f7a0..87c9e1656904 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Muito parecido, mude de posição."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Incline a cabeça um pouco menos."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Incline a cabeça um pouco menos."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Incline a cabeça um pouco menos."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Remova tudo que esteja ocultando seu rosto."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Limpe o sensor na borda superior da tela."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Impossível verificar rosto. Hardware indisponível."</string> @@ -1549,7 +1546,7 @@ <string name="storage_usb_drive_label" msgid="4501418548927759953">"Drive USB <xliff:g id="MANUFACTURER">%s</xliff:g>"</string> <string name="storage_usb" msgid="3017954059538517278">"Armazenamento USB"</string> <string name="extract_edit_menu_button" msgid="8940478730496610137">"Editar"</string> - <string name="data_usage_warning_title" msgid="6499834033204801605">"Aviso de dados"</string> + <string name="data_usage_warning_title" msgid="6499834033204801605">"Alerta de uso de dados"</string> <string name="data_usage_warning_body" msgid="7340198905103751676">"Você usou <xliff:g id="APP">%s</xliff:g> de dados"</string> <string name="data_usage_mobile_limit_title" msgid="6561099244084267376">"Limite de dados móveis atingido"</string> <string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Limite de dados Wi-Fi atingido"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 0e4c0bafd753..69c2fe8dfb23 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -576,12 +576,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Prea asemănător, schimbați poziția."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Întoarceți capul mai puțin."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Întoarceți capul mai puțin."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Întoarceți capul mai puțin."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Eliminați orice vă ascunde chipul."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Curățați senzorul de la marginea de sus a ecranului."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Nu se poate confirma fața. Hardware-ul nu este disponibil."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 8c96363aa8bc..f45b9fb0cbb1 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -579,12 +579,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Слишком похожее выражение лица. Измените позу."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Держите голову ровнее."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Держите голову ровнее."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Держите голову ровнее."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Ваше лицо плохо видно."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Очистите сканер в верхней части экрана."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Не удалось распознать лицо. Сканер недоступен."</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 90d351819f68..29a2dd233a67 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"ඉතා සමානයි, ඔබේ හැඩ ගැසීම වෙනස් කරන්න."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"ඔබේ හිස ටිකක් අඩුවෙන් කරකවන්න."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ඔබේ හිස ටිකක් අඩුවෙන් කරකවන්න."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ඔබේ හිස ටිකක් අඩුවෙන් කරකවන්න."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"ඔබේ මුහුණ සඟවන කිසිවක් ඉවත් කරන්න."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"තිරයේ ඉහළ කෙළවරේ සංවේදකය පිරිසිදු කරන්න."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"මුහුණ සත්යාපනය කළ නොහැක. දෘඩාංගය නොමැත."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 44192984c4a4..33dc6f4d8b37 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -579,12 +579,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Príliš rovnaké, zmeňte postoj."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Otočte hlavu o niečo menej."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Otočte hlavu o niečo menej."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Otočte hlavu o niečo menej."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Odstráňte všetko, čo vám zakrýva tvár."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Vyčistite senzor v hornom okraji obrazovky."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Tvár sa nedá overiť. Hardvér nie je k dispozícii."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 242754099355..7bd13fc4eb04 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -579,12 +579,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Preveč podobno, spremenite položaj."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Glejte malce bolj naravnost."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Malce manj nagnite glavo."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Glejte malce bolj naravnost."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Umaknite vse, kar vam morda zakriva obraz."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Očistite tipalo na zgornjem robu zaslona."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Obraza ni mogoče preveriti. Str. opr. ni na voljo."</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 6946113df9d9..5c7b014de227 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Tepër e ngjashme, ndrysho pozën"</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Ktheje kokën pak më pak."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Ktheje kokën pak më pak."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Ktheje kokën pak më pak."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Hiq gjithçka që fsheh fytyrën tënde."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Pastro sensorin në anën e sipërme të ekranit."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Fytyra s\'mund të verifikohet. Hardueri nuk ofrohet."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 7767cffe1b07..52bfbe2440b5 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -576,12 +576,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Превише је слично, промените позу."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Мало мање померите главу."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Мало мање померите главу."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Мало мање померите главу."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Уклоните све што вам заклања лице."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Очистите сензор на горњој ивици екрана."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Провера лица није успела. Хардвер није доступан."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 471295268b6c..52c532d96aa9 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"För likt. Ändra ansiktsposition."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Vrid mindre på huvudet."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Vrid mindre på huvudet."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Vrid mindre på huvudet."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Ta bort allt som täcker ansiktet."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Rengör sensorn på skärmens överkant."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Ansiktsverifiering går ej. Otillgänglig maskinvara."</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index e08a9f93e32c..1fa17dc76836 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Inafanana sana, tafadhali badilisha mkao wako."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Geuza kichwa chako kidogo."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Geuza kichwa chako kidogo."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Geuza kichwa chako kidogo."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Ondoa kitu chochote kinachoficha uso wako."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Safisha kitambuzi kwenye ukingo wa juu wa skrini."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Imeshindwa kuthibitisha uso. Maunzi hayapatikani."</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 3fd84e7378c4..226c5fe575be 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -241,7 +241,7 @@ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"โหมดปิดเสียง"</string> <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ปิดเสียงไว้"</string> <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"เปิดเสียงแล้ว"</string> - <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"โหมดใช้งานบนเครื่องบิน"</string> + <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"โหมดบนเครื่องบิน"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"เปิดโหมดใช้งานบนเครื่องบิน"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"โหมดใช้งานบนเครื่องบินปิดทำงานอยู่"</string> <string name="global_action_settings" msgid="1756531602592545966">"การตั้งค่า"</string> @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"ใกล้เคียงเกินไป โปรดเปลี่ยนท่าโพส"</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"จัดตำแหน่งศีรษะให้ตรง"</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"จัดตำแหน่งศีรษะให้ตรง"</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"จัดตำแหน่งศีรษะให้ตรง"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"เอาสิ่งที่ปิดบังใบหน้าออก"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"ทำความสะอาดเซ็นเซอร์ที่ขอบด้านบนของหน้าจอ"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ยืนยันใบหน้าไม่ได้ ฮาร์ดแวร์ไม่พร้อมใช้งาน"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index c01937b275d6..2b0436cb6b53 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Masyadong magkatulad, pakibago ang pose mo."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Huwag masyadong lumingon."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Huwag masyadong tumingala o yumuko."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Huwag masyadong lumingon."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Alisin ang anumang humaharang sa iyong mukha."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Linisinin ang sensor sa itaas na gilid ng screen."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Di ma-verify ang mukha. Di available ang hardware."</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 72cd38993c6e..847680ed6c09 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Duruşunuz çok benzer, lütfen pozunuzu değiştirin."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Başınızı biraz daha az çevirin."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Başınızı biraz daha az çevirin."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Başınızı biraz daha az çevirin."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Yüzünüzün görünmesini engelleyen şeyleri kaldırın."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Ekranın üst kenarındaki sensörü temizleyin."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Yüz doğrulanamıyor. Donanım kullanılamıyor."</string> @@ -1816,12 +1813,12 @@ <item quantity="one">1 dakika için (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="736789408293052283"> - <item quantity="other">%1$d saat için (şu saate kadar: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> - <item quantity="one">1 saat için (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> + <item quantity="other">%1$d saat (şu saate kadar: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="one">1 saat (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371"> - <item quantity="other">%1$d saat için (şu saate kadar: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> - <item quantity="one">1 saat için (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> + <item quantity="other">%1$d saat (şu saate kadar: <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="one">1 saat (şu saate kadar: <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_minutes" formatted="false" msgid="5127407202506485571"> <item quantity="other">%d dakika süreyle</item> @@ -1832,12 +1829,12 @@ <item quantity="one">1 dakika için</item> </plurals> <plurals name="zen_mode_duration_hours" formatted="false" msgid="6571961796799076730"> - <item quantity="other">%d saat için</item> - <item quantity="one">1 saat için</item> + <item quantity="other">%d saat</item> + <item quantity="one">1 saat</item> </plurals> <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217"> - <item quantity="other">%d saat için</item> - <item quantity="one">1 saat için</item> + <item quantity="other">%d saat</item> + <item quantity="one">1 saat</item> </plurals> <string name="zen_mode_until" msgid="7336308492289875088">"Şu saate kadar: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="9128205721301330797">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (sonraki alarma) saatine kadar"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 2914281e9a46..d3eaff64e8e2 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -579,12 +579,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Надто схоже на попередню спробу, змініть позу."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Трохи перемістіть обличчя."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Трохи перемістіть обличчя."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Трохи поверніть обличчя."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Приберіть об’єкти, які затуляють ваше обличчя."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Очистьте датчик угорі екрана."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Не вдається перевірити обличчя. Апаратне забезпечення недоступне."</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index e5c485dd8e9d..4105b2aa41eb 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Yuz ifodasi oldingiday. Holatingizni oʻzgartiring."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Boshingizni asta buring."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Boshingizni asta buring."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Boshingizni asta buring."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Yuzingizni berkitayotgan narsalarni olib tahlang."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Ekranning tepasidagi sensorni tozalang."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Yuzingiz tasdiqlanmadi. Qurilma ishlamayapti."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index d6dca0ab26d6..4aa0722f01e9 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Khuôn mặt quá giống nhau, vui lòng đổi tư thế."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Hãy bớt di chuyển đầu."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Hãy bớt di chuyển đầu."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Hãy bớt di chuyển đầu."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Hãy loại bỏ mọi thứ che khuất khuôn mặt bạn."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Hãy lau sạch cảm biến ở cạnh trên của màn hình."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Không thể xác minh khuôn mặt. Phần cứng không có sẵn."</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 01c9c238fa17..39ad8e26780d 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -571,16 +571,11 @@ <string name="face_acquired_recalibrate" msgid="8077949502893707539">"请重新注册您的面孔。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"已无法识别人脸,请重试。"</string> <string name="face_acquired_too_similar" msgid="1508776858407646460">"与先前的姿势太相近,请换一个姿势。"</string> - <!-- no translation found for face_acquired_pan_too_extreme (4581629343077288178) --> - <skip /> - <!-- no translation found for face_acquired_tilt_too_extreme (4019954263012496468) --> - <skip /> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"请将您的头稍微上下倾斜。"</string> + <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"请将您的头稍微上下倾斜。"</string> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"请将您的头稍微左右旋转。"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"请移除所有遮挡您面部的物体。"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"请将屏幕顶部边缘的传感器擦拭干净。"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"无法验证人脸。硬件无法使用。"</string> @@ -1369,7 +1364,7 @@ <string name="share_remote_bugreport_action" msgid="6249476773913384948">"分享"</string> <string name="decline_remote_bugreport_action" msgid="6230987241608770062">"拒绝"</string> <string name="select_input_method" msgid="4653387336791222978">"选择输入法"</string> - <string name="show_ime" msgid="2506087537466597099">"开启后,连接到实体键盘时,它会一直显示在屏幕上"</string> + <string name="show_ime" msgid="2506087537466597099">"在连接到实体键盘时保持显示"</string> <string name="hardware" msgid="194658061510127999">"显示虚拟键盘"</string> <string name="select_keyboard_layout_notification_title" msgid="597189518763083494">"配置实体键盘"</string> <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"点按即可选择语言和布局"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 35fbaa6dec33..302fb714c69b 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"臉孔位置太相近,請改變您的姿勢。"</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"減少頭部左右轉動幅度。"</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"減少頭部上下轉動幅度。"</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"減少頭部左右轉動幅度。"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"移除遮住您臉孔的任何東西。"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"請清潔螢幕頂部邊緣的感應器。"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"無法驗證臉孔,硬件無法使用。"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 141706da6c11..2f5f8a552d08 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"與先前的姿勢太相似,請換一個姿勢。"</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"請將你的頭部稍微向左或向右轉動。"</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"請將你的頭部稍微向上或向下傾斜。"</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"請將你的頭部稍微向左或向右旋轉。"</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"請移除任何會遮住臉孔的物體。"</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"請清除螢幕頂端感應器的髒汙。"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"相關硬體無法使用,因此無法驗證臉孔。"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index d770e85203f5..42056af172c6 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -573,12 +573,9 @@ <string name="face_acquired_too_similar" msgid="1508776858407646460">"Kufana kakhulu, sicela ushintshe ukuma kwakho."</string> <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Jikisa ikhanda lakho kancane."</string> <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Jikisa ikhanda lakho kancane."</string> - <!-- no translation found for face_acquired_roll_too_extreme (6312973147689664409) --> - <skip /> - <!-- no translation found for face_acquired_obscured (5357207702967893283) --> - <skip /> - <!-- no translation found for face_acquired_sensor_dirty (2535761002815565222) --> - <skip /> + <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Jikisa ikhanda lakho kancane."</string> + <string name="face_acquired_obscured" msgid="5357207702967893283">"Susa noma yini efihle ubuso bakho."</string> + <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Hlanza inzwa kunqenqema oluphezulu lwesikrini."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Ayikwazi ukuqinisekisa ubuso. Izingxenyekazi zekhompyutha azitholakali."</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index ab708e53dc7e..0daebd76daf4 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -358,6 +358,22 @@ default value of that setting. --> <integer translatable="false" name="config_networkDefaultDailyMultipathQuotaBytes">2500000</integer> + <!-- Default supported concurrent socket keepalive slots per transport type, used by + ConnectivityManager.createSocketKeepalive() for calculating the number of keepalive + offload slots that should be reserved for privileged access. This string array should be + overridden by the device to present the capability of creating socket keepalives. --> + <!-- An Array of "[NetworkCapabilities.TRANSPORT_*],[supported keepalives] --> + <string-array translatable="false" name="config_networkSupportedKeepaliveCount"> + <item>0,3</item> + <item>1,3</item> + </string-array> + + <!-- Reserved privileged keepalive slots per transport. --> + <integer translatable="false" name="config_reservedPrivilegedKeepaliveSlots">2</integer> + + <!-- Allowed unprivileged keepalive slots per uid. --> + <integer translatable="false" name="config_allowedUnprivilegedKeepalivePerUid">2</integer> + <!-- List of regexpressions describing the interface (if any) that represent tetherable USB interfaces. If the device doesn't want to support tethering over USB this should be empty. An example would be "usb.*" --> @@ -1094,6 +1110,11 @@ --> </integer-array> + <!-- Color mode to use when accessibility transforms are enabled. This color mode must be + supported by the device, but not necessarily appear in config_availableColorModes. The + regularly selected color mode will be used if this value is negative. --> + <integer name="config_accessibilityColorMode">-1</integer> + <!-- Indicate whether to allow the device to suspend when the screen is off due to the proximity sensor. This resource should only be set to true if the sensor HAL correctly handles the proximity sensor as a wake-up source. @@ -3281,6 +3302,10 @@ {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. --> <bool name="config_navBarNeedsScrim">true</bool> + <!-- Controls whether seamless rotation should be allowed even though the navbar can move + (which normally prevents seamless rotation). --> + <bool name="config_allowSeamlessRotationDespiteNavBarMoving">false</bool> + <!-- Default insets [LEFT/RIGHTxTOP/BOTTOM] from the screen edge for picture-in-picture windows. These values are in DPs and will be converted to pixel sizes internally. --> <string translatable="false" name="config_defaultPictureInPictureScreenEdgeInsets">16x16</string> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index ca90f4326737..7de6ca5c0708 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -633,8 +633,8 @@ <!-- Text shown when viewing channel settings for notifications related to vpn status --> <string name="notification_channel_vpn">VPN status</string> - <!-- Text shown when viewing channel settings for notifications related to remote device administration --> - <string name="notification_channel_device_admin">Device administration</string> + <!-- Notification channel name. This channel sends high-priority alerts from the user's IT admin for key updates about the user's work device or work profile. --> + <string name="notification_channel_device_admin">Alerts from your IT admin</string> <!-- Text shown when viewing channel settings for notifications related to important alerts --> <string name="notification_channel_alerts">Alerts</string> @@ -1726,6 +1726,11 @@ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_access_notification_policy">Allows the app to read and write Do Not Disturb configuration.</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permlab_startViewPermissionUsage">start view permission usage</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permdesc_startViewPermissionUsage">Allows the holder to start the permission usage for an app. Should never be needed for normal apps.</string> + <!-- Policy administration --> <!-- Title of policy access to limiting the user's password choices --> @@ -5035,13 +5040,8 @@ <!-- Notification content shown when new SMS/MMS is received while the device is locked [CHAR LIMIT=NONE] --> <string name="new_sms_notification_content">Open SMS app to view</string> - <!-- Notification title shown when user profile is credential encrypted and requires the user to unlock before some features are usable [CHAR LIMIT=30] --> - <string name="user_encrypted_title">Some functionality may be limited</string> - <!-- Notification message shown when user profile is credential encrypted and requires the user to unlock before some features are usable [CHAR LIMIT=30] --> - <string name="user_encrypted_message">Tap to unlock</string> - <!-- Notification detail shown when user profile is credential encrypted and requires the user to unlock before some features are usable [CHAR LIMIT=30] --> - <string name="user_encrypted_detail">User data locked</string> - + <!-- Notification title shown when user profile is credential encrypted and requires the user to unlock before some features are usable [CHAR LIMIT=36] --> + <string name="profile_encrypted_title">Some functionality may be limited</string> <!-- Notification detail shown when work profile is credential encrypted and requires the user to unlock before some features are usable [CHAR LIMIT=30] --> <string name="profile_encrypted_detail">Work profile locked</string> <!-- Notification message shown when work profile is credential encrypted and requires the user to unlock before some features are usable [CHAR LIMIT=30] --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 29181c871d1b..1ef2eb4a0435 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2026,6 +2026,9 @@ <java-symbol type="array" name="config_apfEthTypeBlackList" /> <java-symbol type="integer" name="config_networkDefaultDailyMultipathQuotaBytes" /> <java-symbol type="integer" name="config_networkMeteredMultipathPreference" /> + <java-symbol type="array" name="config_networkSupportedKeepaliveCount" /> + <java-symbol type="integer" name="config_reservedPrivilegedKeepaliveSlots" /> + <java-symbol type="integer" name="config_allowedUnprivilegedKeepalivePerUid" /> <java-symbol type="integer" name="config_notificationsBatteryFullARGB" /> <java-symbol type="integer" name="config_notificationsBatteryLedOff" /> <java-symbol type="integer" name="config_notificationsBatteryLedOn" /> @@ -2872,6 +2875,7 @@ <java-symbol type="bool" name="config_navBarTapThrough" /> <java-symbol type="bool" name="config_navBarAlwaysShowOnSideEdgeGesture" /> <java-symbol type="bool" name="config_navBarNeedsScrim" /> + <java-symbol type="bool" name="config_allowSeamlessRotationDespiteNavBarMoving" /> <java-symbol type="dimen" name="config_backGestureInset" /> <java-symbol type="color" name="system_bar_background_semi_transparent" /> @@ -3024,9 +3028,7 @@ <java-symbol type="string" name="now_string_shortest" /> <!-- Encryption notification while accounts are locked by credential encryption --> - <java-symbol type="string" name="user_encrypted_title" /> - <java-symbol type="string" name="user_encrypted_message" /> - <java-symbol type="string" name="user_encrypted_detail" /> + <java-symbol type="string" name="profile_encrypted_title" /> <java-symbol type="string" name="profile_encrypted_detail" /> <java-symbol type="string" name="profile_encrypted_message" /> <java-symbol type="drawable" name="ic_user_secure" /> @@ -3185,6 +3187,7 @@ <java-symbol type="array" name="config_nightDisplayColorTemperatureCoefficients" /> <java-symbol type="array" name="config_nightDisplayColorTemperatureCoefficientsNative" /> <java-symbol type="array" name="config_availableColorModes" /> + <java-symbol type="integer" name="config_accessibilityColorMode" /> <java-symbol type="bool" name="config_displayWhiteBalanceAvailable" /> <java-symbol type="bool" name="config_displayWhiteBalanceEnabledDefault" /> <java-symbol type="integer" name="config_displayWhiteBalanceColorTemperatureMin" /> diff --git a/core/tests/bugreports/Android.bp b/core/tests/bugreports/Android.bp new file mode 100644 index 000000000000..d3bf0dd7a7e8 --- /dev/null +++ b/core/tests/bugreports/Android.bp @@ -0,0 +1,27 @@ +// Copyright (C) 2019 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +android_test { + name: "BugreportManagerTestCases", + srcs: ["src/**/*.java"], + libs: [ + "android.test.runner", + "android.test.base", + ], + static_libs: ["androidx.test.rules", "truth-prebuilt"], + test_suites: ["general-tests"], + sdk_version: "test_current", + platform_apis: true, +} + diff --git a/core/tests/bugreports/AndroidManifest.xml b/core/tests/bugreports/AndroidManifest.xml new file mode 100644 index 000000000000..0cfb8747e629 --- /dev/null +++ b/core/tests/bugreports/AndroidManifest.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:installLocation="internalOnly" + package="com.android.os.bugreports.tests"> + <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="com.android.os.bugreports.tests" + android:label="Unit tests of BugreportManager" /> +</manifest> diff --git a/core/tests/bugreports/AndroidTest.xml b/core/tests/bugreports/AndroidTest.xml new file mode 100644 index 000000000000..410ca6043583 --- /dev/null +++ b/core/tests/bugreports/AndroidTest.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<configuration description="Config for BugreportManager test cases"> + <option name="test-suite-tag" value="apct" /> + <option name="test-suite-tag" value="apct-instrumentation" /> + + <option name="config-descriptor:metadata" key="component" value="framework"/> + <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" /> + <option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" /> + + <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> + <option name="cleanup-apks" value="true"/> + <option name="test-file-name" value="BugreportManagerTestCases.apk"/> + </target_preparer> + + <test class="com.android.tradefed.testtype.AndroidJUnitTest"> + <option name="package" value="com.android.os.bugreports.tests"/> + <!-- test-timeout unit is ms, value = 30 min --> + <option name="test-timeout" value="1800000" /> + <option name="runtime-hint" value="30m" /> + </test> +</configuration> diff --git a/core/tests/bugreports/config/test-sysconfig.xml b/core/tests/bugreports/config/test-sysconfig.xml new file mode 100644 index 000000000000..09c69ba699de --- /dev/null +++ b/core/tests/bugreports/config/test-sysconfig.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2019 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!-- WARNING: This is a test config. --> +<config> + <bugreport-whitelisted package="com.android.os.bugreports.tests" /> +</config> diff --git a/core/tests/bugreports/run.sh b/core/tests/bugreports/run.sh new file mode 100755 index 000000000000..010339836538 --- /dev/null +++ b/core/tests/bugreports/run.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# 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. + +# Script to run bugreport unitests +# Must run on a rooted device. +# Must run lunch before running the script +# Usage: ${ANDROID_BUILD_TOP}/frameworks/base/core/tests/bugreports/run.sh + +# NOTE: This script replaces the framework-sysconfig.xml on your device, so use with caution. +# It tries to replace it when done, but if the script does not finish cleanly +# (for e.g. force stopped mid-way) your device will be left in an inconsistent state. +# Reflashing will restore the right config. + +TMP_SYS_CONFIG=/var/tmp/framework-sysconfig.xml + +if [[ -z $ANDROID_PRODUCT_OUT ]]; then + echo "Please lunch before running this test." + exit 0 +fi + +# Print every command to console. +set -x + +make -j BugreportManagerTestCases && + adb root && + adb remount && + adb wait-for-device && + # Save the sysconfig file in a tmp location and push the test config in + adb pull /system/etc/sysconfig/framework-sysconfig.xml "${TMP_SYS_CONFIG}" && + adb push $ANDROID_BUILD_TOP/frameworks/base/core/tests/bugreports/config/test-sysconfig.xml /system/etc/sysconfig/framework-sysconfig.xml && + # The test app needs to be a priv-app. + adb push $OUT/testcases/BugreportManagerTestCases/*/BugreportManagerTestCases.apk /system/priv-app || + exit 1 + +adb reboot && +adb wait-for-device && +atest BugreportManagerTest || echo "Tests FAILED!" + +# Restore the saved config file +if [ -f "${TMP_SYS_CONFIG}" ]; then + SIZE=$(stat --printf="%s" "${TMP_SYS_CONFIG}") + if [ SIZE > 0 ]; then + adb remount && + adb wait-for-device && + adb push "${TMP_SYS_CONFIG}" /system/etc/sysconfig/framework-sysconfig.xml && + rm "${TMP_SYS_CONFIG}" + fi +fi diff --git a/core/tests/bugreports/src/android/server/bugreports/BugreportManagerTest.java b/core/tests/bugreports/src/android/server/bugreports/BugreportManagerTest.java new file mode 100644 index 000000000000..220f854c337a --- /dev/null +++ b/core/tests/bugreports/src/android/server/bugreports/BugreportManagerTest.java @@ -0,0 +1,341 @@ +/* + * 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.os.bugreports.tests; + +import static com.google.common.truth.Truth.assertThat; + +import static org.junit.Assert.fail; + +import android.Manifest; +import android.content.Context; +import android.os.BugreportManager; +import android.os.BugreportManager.BugreportCallback; +import android.os.BugreportParams; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.ParcelFileDescriptor; +import android.util.Log; + +import androidx.test.InstrumentationRegistry; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TestName; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.io.File; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; + + +/** + * Tests for BugreportManager API. + */ +@RunWith(JUnit4.class) +public class BugreportManagerTest { + @Rule public TestName name = new TestName(); + + private static final String TAG = "BugreportManagerTest"; + private static final long BUGREPORT_TIMEOUT_MS = TimeUnit.MINUTES.toMillis(10); + + private Handler mHandler; + private Executor mExecutor; + private BugreportManager mBrm; + private ParcelFileDescriptor mBugreportFd; + private ParcelFileDescriptor mScreenshotFd; + + @Before + public void setup() throws Exception { + mHandler = createHandler(); + mExecutor = (runnable) -> { + if (mHandler != null) { + mHandler.post(() -> { + runnable.run(); + }); + } + }; + + mBrm = getBugreportManager(); + mBugreportFd = parcelFd("bugreport_" + name.getMethodName(), ".zip"); + mScreenshotFd = parcelFd("screenshot_" + name.getMethodName(), ".png"); + + getPermissions(); + } + + @After + public void teardown() throws Exception { + dropPermissions(); + } + + + @Test + public void normalFlow_wifi() throws Exception { + BugreportCallbackImpl callback = new BugreportCallbackImpl(); + mBrm.startBugreport(mBugreportFd, mScreenshotFd, wifi(), mExecutor, callback); + waitTillDoneOrTimeout(callback); + + assertThat(callback.isDone()).isTrue(); + // Wifi bugreports should not receive any progress. + assertThat(callback.hasReceivedProgress()).isFalse(); + // TODO: Because of b/130234145, consent dialog is not shown; so we get a timeout error. + // When the bug is fixed, accept consent via UIAutomator and verify contents + // of mBugreportFd. + assertThat(callback.getErrorCode()).isEqualTo( + BugreportCallback.BUGREPORT_ERROR_USER_CONSENT_TIMED_OUT); + assertFdsAreClosed(mBugreportFd, mScreenshotFd); + } + + @Test + public void normalFlow_interactive() throws Exception { + BugreportCallbackImpl callback = new BugreportCallbackImpl(); + mBrm.startBugreport(mBugreportFd, mScreenshotFd, interactive(), mExecutor, callback); + + waitTillDoneOrTimeout(callback); + assertThat(callback.isDone()).isTrue(); + // Interactive bugreports show progress updates. + assertThat(callback.hasReceivedProgress()).isTrue(); + assertThat(callback.getErrorCode()).isEqualTo( + BugreportCallback.BUGREPORT_ERROR_USER_CONSENT_TIMED_OUT); + assertFdsAreClosed(mBugreportFd, mScreenshotFd); + } + + @Test + public void simultaneousBugreportsNotAllowed() throws Exception { + // Start bugreport #1 + BugreportCallbackImpl callback = new BugreportCallbackImpl(); + mBrm.startBugreport(mBugreportFd, mScreenshotFd, wifi(), mExecutor, callback); + + // Before #1 is done, try to start #2. + assertThat(callback.isDone()).isFalse(); + BugreportCallbackImpl callback2 = new BugreportCallbackImpl(); + ParcelFileDescriptor bugreportFd2 = parcelFd("bugreport_2_" + name.getMethodName(), ".zip"); + ParcelFileDescriptor screenshotFd2 = + parcelFd("screenshot_2_" + name.getMethodName(), ".png"); + mBrm.startBugreport(bugreportFd2, screenshotFd2, wifi(), mExecutor, callback2); + Thread.sleep(500 /* .5s */); + + // Verify #2 encounters an error. + assertThat(callback2.getErrorCode()).isEqualTo( + BugreportCallback.BUGREPORT_ERROR_ANOTHER_REPORT_IN_PROGRESS); + assertFdsAreClosed(bugreportFd2, screenshotFd2); + + // Cancel #1 so we can move on to the next test. + mBrm.cancelBugreport(); + Thread.sleep(500 /* .5s */); + assertThat(callback.isDone()).isTrue(); + assertFdsAreClosed(mBugreportFd, mScreenshotFd); + } + + @Test + public void cancelBugreport() throws Exception { + // Start a bugreport. + BugreportCallbackImpl callback = new BugreportCallbackImpl(); + mBrm.startBugreport(mBugreportFd, mScreenshotFd, wifi(), mExecutor, callback); + + // Verify it's not finished yet. + assertThat(callback.isDone()).isFalse(); + + // Try to cancel it, but first without DUMP permission. + dropPermissions(); + try { + mBrm.cancelBugreport(); + fail("Expected cancelBugreport to throw SecurityException without DUMP permission"); + } catch (SecurityException expected) { + } + assertThat(callback.isDone()).isFalse(); + + // Try again, with DUMP permission. + getPermissions(); + mBrm.cancelBugreport(); + Thread.sleep(500 /* .5s */); + assertThat(callback.isDone()).isTrue(); + assertFdsAreClosed(mBugreportFd, mScreenshotFd); + } + + @Test + public void insufficientPermissions_throwsException() throws Exception { + dropPermissions(); + + BugreportCallbackImpl callback = new BugreportCallbackImpl(); + try { + mBrm.startBugreport(mBugreportFd, mScreenshotFd, wifi(), mExecutor, callback); + fail("Expected startBugreport to throw SecurityException without DUMP permission"); + } catch (SecurityException expected) { + } + assertFdsAreClosed(mBugreportFd, mScreenshotFd); + } + + @Test + public void invalidBugreportMode_throwsException() throws Exception { + BugreportCallbackImpl callback = new BugreportCallbackImpl(); + + try { + mBrm.startBugreport(mBugreportFd, mScreenshotFd, + new BugreportParams(25) /* unknown bugreport mode */, mExecutor, callback); + fail("Expected to throw IllegalArgumentException with unknown bugreport mode"); + } catch (IllegalArgumentException expected) { + } + assertFdsAreClosed(mBugreportFd, mScreenshotFd); + } + + private Handler createHandler() { + HandlerThread handlerThread = new HandlerThread("BugreportManagerTest"); + handlerThread.start(); + return new Handler(handlerThread.getLooper()); + } + + /* Implementatiion of {@link BugreportCallback} that offers wrappers around execution result */ + private static final class BugreportCallbackImpl extends BugreportCallback { + private int mErrorCode = -1; + private boolean mSuccess = false; + private boolean mReceivedProgress = false; + private final Object mLock = new Object(); + + @Override + public void onProgress(float progress) { + synchronized (mLock) { + mReceivedProgress = true; + } + } + + @Override + public void onError(int errorCode) { + synchronized (mLock) { + mErrorCode = errorCode; + Log.d(TAG, "bugreport errored."); + } + } + + @Override + public void onFinished() { + synchronized (mLock) { + Log.d(TAG, "bugreport finished."); + mSuccess = true; + } + } + + /* Indicates completion; and ended up with a success or error. */ + public boolean isDone() { + synchronized (mLock) { + return (mErrorCode != -1) || mSuccess; + } + } + + public int getErrorCode() { + synchronized (mLock) { + return mErrorCode; + } + } + + public boolean isSuccess() { + synchronized (mLock) { + return mSuccess; + } + } + + public boolean hasReceivedProgress() { + synchronized (mLock) { + return mReceivedProgress; + } + } + } + + public static BugreportManager getBugreportManager() { + Context context = InstrumentationRegistry.getContext(); + BugreportManager bm = + (BugreportManager) context.getSystemService(Context.BUGREPORT_SERVICE); + if (bm == null) { + throw new AssertionError("Failed to get BugreportManager"); + } + return bm; + } + + private static ParcelFileDescriptor parcelFd(String prefix, String extension) throws Exception { + File f = File.createTempFile(prefix, extension); + f.setReadable(true, true); + f.setWritable(true, true); + + return ParcelFileDescriptor.open(f, + ParcelFileDescriptor.MODE_WRITE_ONLY | ParcelFileDescriptor.MODE_APPEND); + } + + private static void dropPermissions() { + InstrumentationRegistry.getInstrumentation().getUiAutomation() + .dropShellPermissionIdentity(); + } + + private static void getPermissions() { + InstrumentationRegistry.getInstrumentation().getUiAutomation() + .adoptShellPermissionIdentity(Manifest.permission.DUMP); + } + + private static void assertFdIsClosed(ParcelFileDescriptor pfd) { + try { + int fd = pfd.getFd(); + fail("Expected ParcelFileDescriptor argument to be closed, but got: " + fd); + } catch (IllegalStateException expected) { + } + } + + private static void assertFdsAreClosed(ParcelFileDescriptor... pfds) { + for (int i = 0; i < pfds.length; i++) { + assertFdIsClosed(pfds[i]); + } + } + + private static long now() { + return System.currentTimeMillis(); + } + + private static boolean shouldTimeout(long startTimeMs) { + return now() - startTimeMs >= BUGREPORT_TIMEOUT_MS; + } + + private static void waitTillDoneOrTimeout(BugreportCallbackImpl callback) throws Exception { + long startTimeMs = now(); + while (!callback.isDone()) { + Thread.sleep(1000 /* 1s */); + if (shouldTimeout(startTimeMs)) { + break; + } + Log.d(TAG, "Waited " + (now() - startTimeMs) + "ms"); + } + } + + /* + * Returns a {@link BugreportParams} for wifi only bugreport. + * + * <p>Wifi bugreports have minimal content and are fast to run. They also suppress progress + * updates. + */ + private static BugreportParams wifi() { + return new BugreportParams(BugreportParams.BUGREPORT_MODE_WIFI); + } + + /* + * Returns a {@link BugreportParams} for interactive bugreport that offers progress updates. + * + * <p>This is the typical bugreport taken by users. This can take on the order of minutes to + * finish. + */ + private static BugreportParams interactive() { + return new BugreportParams(BugreportParams.BUGREPORT_MODE_INTERACTIVE); + } +} diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java index e3eb2a313cf6..c2fa8b2b38da 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java @@ -40,6 +40,7 @@ import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -411,6 +412,7 @@ public class TextClassifierTest { assertThat(textLanguage, isTextLanguage("ja")); } + @Ignore // Doesn't work without a language-based model. @Test public void testSuggestConversationActions_textReplyOnly_maxOne() { if (isTextClassifierDisabled()) return; @@ -438,6 +440,7 @@ public class TextClassifierTest { Truth.assertThat(conversationAction.getTextReply()).isNotNull(); } + @Ignore // Doesn't work without a language-based model. @Test public void testSuggestConversationActions_textReplyOnly_noMax() { if (isTextClassifierDisabled()) return; @@ -493,6 +496,7 @@ public class TextClassifierTest { Truth.assertThat(actionIntent.getData()).isEqualTo(Uri.parse("https://www.android.com")); } + @Ignore // Doesn't work without a language-based model. @Test public void testSuggestConversationActions_copy() { if (isTextClassifierDisabled()) return; diff --git a/core/tests/utiltests/Android.mk b/core/tests/utiltests/Android.mk index 343c07af51df..9ef73e9aad93 100644 --- a/core/tests/utiltests/Android.mk +++ b/core/tests/utiltests/Android.mk @@ -18,6 +18,7 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ androidx.test.rules \ frameworks-base-testutils \ mockito-target-minus-junit4 \ + androidx.test.ext.junit LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base android.test.mock diff --git a/core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp b/core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp index 4b14284fdea5..57ee2d5f6cbb 100644 --- a/core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp +++ b/core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp @@ -21,6 +21,36 @@ #include <sys/ioctl.h> #include <sys/mman.h> +jint android_util_MemoryIntArrayTest_createAshmem(__attribute__((unused)) JNIEnv* env, + __attribute__((unused)) jobject clazz, + jstring name, jint size) +{ + + if (name == NULL) { + return -1; + } + + if (size < 0) { + return -1; + } + + const char* nameStr = env->GetStringUTFChars(name, NULL); + const int ashmemSize = sizeof(std::atomic_int) * size; + int fd = ashmem_create_region(nameStr, ashmemSize); + env->ReleaseStringUTFChars(name, nameStr); + + if (fd < 0) { + return -1; + } + + int setProtResult = ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE); + if (setProtResult < 0) { + return -1; + } + + return fd; +} + void android_util_MemoryIntArrayTest_setAshmemSize(__attribute__((unused)) JNIEnv* env, __attribute__((unused)) jobject clazz, jint fd, jint size) { diff --git a/core/tests/utiltests/jni/registration.cpp b/core/tests/utiltests/jni/registration.cpp index d4fc2fbb83fc..0c84d98e9de9 100644 --- a/core/tests/utiltests/jni/registration.cpp +++ b/core/tests/utiltests/jni/registration.cpp @@ -16,14 +16,25 @@ #include <jni.h> +extern jint android_util_MemoryIntArrayTest_createAshmem(JNIEnv* env, + jobject clazz, jstring name, jint size); extern void android_util_MemoryIntArrayTest_setAshmemSize(JNIEnv* env, jobject clazz, jint fd, jint size); extern "C" { + JNIEXPORT jint JNICALL Java_android_util_MemoryIntArrayTest_nativeCreateAshmem( + JNIEnv * env, jobject obj, jstring name, jint size); JNIEXPORT void JNICALL Java_android_util_MemoryIntArrayTest_nativeSetAshmemSize( JNIEnv * env, jobject obj, jint fd, jint size); }; +JNIEXPORT jint JNICALL Java_android_util_MemoryIntArrayTest_nativeCreateAshmem( + __attribute__((unused)) JNIEnv * env,__attribute__((unused)) jobject obj, + jstring name, jint size) +{ + return android_util_MemoryIntArrayTest_createAshmem(env, obj, name, size); +} + JNIEXPORT void JNICALL Java_android_util_MemoryIntArrayTest_nativeSetAshmemSize( __attribute__((unused)) JNIEnv * env,__attribute__((unused)) jobject obj, jint fd, jint size) diff --git a/core/tests/utiltests/src/android/util/MemoryIntArrayTest.java b/core/tests/utiltests/src/android/util/MemoryIntArrayTest.java index 2daefe74eb12..1966e122ee5b 100644 --- a/core/tests/utiltests/src/android/util/MemoryIntArrayTest.java +++ b/core/tests/utiltests/src/android/util/MemoryIntArrayTest.java @@ -23,9 +23,8 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.os.Parcel; -import android.os.ParcelFileDescriptor; -import androidx.test.runner.AndroidJUnit4; +import androidx.test.ext.junit.runners.AndroidJUnit4; import libcore.io.IoUtils; @@ -36,6 +35,8 @@ import java.lang.reflect.Field; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; + +import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) public class MemoryIntArrayTest { static { @@ -255,11 +256,13 @@ public class MemoryIntArrayTest { // Create a MemoryIntArray to muck with MemoryIntArray array = new MemoryIntArray(1); - // Grab the internal ashmem fd. - Field fdField = MemoryIntArray.class.getDeclaredField("mFd"); - fdField.setAccessible(true); - int fd = ((ParcelFileDescriptor)fdField.get(array)).getFd(); - assertTrue("fd must be valid", fd != -1); + // Create the fd to stuff in the MemoryIntArray + final int fd = nativeCreateAshmem("foo", 1); + + // Replace the fd with our ahsmem region + Field fdFiled = MemoryIntArray.class.getDeclaredField("mFd"); + fdFiled.setAccessible(true); + fdFiled.set(array, fd); CountDownLatch countDownLatch = new CountDownLatch(2); @@ -294,9 +297,10 @@ public class MemoryIntArrayTest { } if (!success) { - fail("MemoryIntArray should catch ashmem size changing under it"); + fail("MemoryIntArray should catch ahshmem size changing under it"); } } + private native int nativeCreateAshmem(String name, int size); private native void nativeSetAshmemSize(int fd, int size); } diff --git a/data/etc/com.android.dialer.xml b/data/etc/com.android.dialer.xml index ccdb21fa5040..405279f8b1a4 100644 --- a/data/etc/com.android.dialer.xml +++ b/data/etc/com.android.dialer.xml @@ -24,5 +24,7 @@ <permission name="android.permission.STOP_APP_SWITCHES"/> <permission name="com.android.voicemail.permission.READ_VOICEMAIL"/> <permission name="com.android.voicemail.permission.WRITE_VOICEMAIL"/> + <permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS"/> + <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/> </privapp-permissions> </permissions> diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java index 11d635eaba12..297153d09eca 100644 --- a/graphics/java/android/graphics/drawable/GradientDrawable.java +++ b/graphics/java/android/graphics/drawable/GradientDrawable.java @@ -637,8 +637,7 @@ public class GradientDrawable extends Drawable { * @see #setOrientation(Orientation) */ public Orientation getOrientation() { - updateGradientStateOrientation(); - return mGradientState.mOrientation; + return mGradientState.getOrientation(); } /** @@ -654,10 +653,7 @@ public class GradientDrawable extends Drawable { * @see #getOrientation() */ public void setOrientation(Orientation orientation) { - // Update the angle here so that subsequent attempts to obtain the orientation - // from the angle overwrite previously configured values during inflation - mGradientState.mAngle = getAngleFromOrientation(orientation); - mGradientState.mOrientation = orientation; + mGradientState.setOrientation(orientation); mGradientIsDirty = true; invalidateSelf(); } @@ -1246,76 +1242,6 @@ public class GradientDrawable extends Drawable { } /** - * Update the orientation of the gradient based on the given angle only if the type is - * {@link #LINEAR_GRADIENT} - */ - private void updateGradientStateOrientation() { - if (mGradientState.mGradient == LINEAR_GRADIENT) { - int angle = mGradientState.mAngle; - if (angle % 45 != 0) { - throw new IllegalArgumentException("Linear gradient requires 'angle' attribute to " - + "be a multiple of 45"); - } - - Orientation orientation; - switch (angle) { - case 0: - orientation = Orientation.LEFT_RIGHT; - break; - case 45: - orientation = Orientation.BL_TR; - break; - case 90: - orientation = Orientation.BOTTOM_TOP; - break; - case 135: - orientation = Orientation.BR_TL; - break; - case 180: - orientation = Orientation.RIGHT_LEFT; - break; - case 225: - orientation = Orientation.TR_BL; - break; - case 270: - orientation = Orientation.TOP_BOTTOM; - break; - case 315: - orientation = Orientation.TL_BR; - break; - default: - // Should not get here as exception is thrown above if angle is not multiple - // of 45 degrees - orientation = Orientation.LEFT_RIGHT; - break; - } - mGradientState.mOrientation = orientation; - } - } - - private int getAngleFromOrientation(Orientation orientation) { - switch (orientation) { - default: - case LEFT_RIGHT: - return 0; - case BL_TR: - return 45; - case BOTTOM_TOP: - return 90; - case BR_TL: - return 135; - case RIGHT_LEFT: - return 180; - case TR_BL: - return 225; - case TOP_BOTTOM: - return 270; - case TL_BR: - return 315; - } - } - - /** * This checks mGradientIsDirty, and if it is true, recomputes both our drawing * rectangle (mRect) and the gradient itself, since it depends on our * rectangle too. @@ -1344,8 +1270,7 @@ public class GradientDrawable extends Drawable { if (st.mGradient == LINEAR_GRADIENT) { final float level = st.mUseLevel ? getLevel() / 10000.0f : 1.0f; - updateGradientStateOrientation(); - switch (st.mOrientation) { + switch (st.getOrientation()) { case TOP_BOTTOM: x0 = r.left; y0 = r.top; x1 = x0; y1 = level * r.bottom; @@ -2056,7 +1981,7 @@ public class GradientDrawable extends Drawable { int[] mAttrPadding; public GradientState(Orientation orientation, int[] gradientColors) { - mOrientation = orientation; + setOrientation(orientation); setGradientColors(gradientColors); } @@ -2259,6 +2184,93 @@ public class GradientDrawable extends Drawable { mCenterY = y; } + public void setOrientation(Orientation orientation) { + // Update the angle here so that subsequent attempts to obtain the orientation + // from the angle overwrite previously configured values during inflation + mAngle = getAngleFromOrientation(orientation); + mOrientation = orientation; + } + + @NonNull + public Orientation getOrientation() { + updateGradientStateOrientation(); + return mOrientation; + } + + /** + * Update the orientation of the gradient based on the given angle only if the type is + * {@link #LINEAR_GRADIENT} + */ + private void updateGradientStateOrientation() { + if (mGradient == LINEAR_GRADIENT) { + int angle = mAngle; + if (angle % 45 != 0) { + throw new IllegalArgumentException("Linear gradient requires 'angle' attribute " + + "to be a multiple of 45"); + } + + Orientation orientation; + switch (angle) { + case 0: + orientation = Orientation.LEFT_RIGHT; + break; + case 45: + orientation = Orientation.BL_TR; + break; + case 90: + orientation = Orientation.BOTTOM_TOP; + break; + case 135: + orientation = Orientation.BR_TL; + break; + case 180: + orientation = Orientation.RIGHT_LEFT; + break; + case 225: + orientation = Orientation.TR_BL; + break; + case 270: + orientation = Orientation.TOP_BOTTOM; + break; + case 315: + orientation = Orientation.TL_BR; + break; + default: + // Should not get here as exception is thrown above if angle is not multiple + // of 45 degrees + orientation = Orientation.LEFT_RIGHT; + break; + } + mOrientation = orientation; + } + } + + private int getAngleFromOrientation(@Nullable Orientation orientation) { + if (orientation != null) { + switch (orientation) { + default: + case LEFT_RIGHT: + return 0; + case BL_TR: + return 45; + case BOTTOM_TOP: + return 90; + case BR_TL: + return 135; + case RIGHT_LEFT: + return 180; + case TR_BL: + return 225; + case TOP_BOTTOM: + return 270; + case TL_BR: + return 315; + } + } else { + return 0; + } + } + public void setGradientColors(@Nullable int[] colors) { mGradientColors = colors; mSolidColors = null; diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index 62fd48940870..5173f638068d 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -167,8 +167,6 @@ void VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe LOG_ALWAYS_FATAL_IF(physDeviceProperties.apiVersion < VK_MAKE_VERSION(1, 1, 0)); mDriverVersion = physDeviceProperties.driverVersion; - mIsQualcomm = physDeviceProperties.vendorID == 20803; - // query to get the initial queue props size uint32_t queueCount; mGetPhysicalDeviceQueueFamilyProperties(mPhysicalDevice, &queueCount, nullptr); diff --git a/libs/hwui/renderthread/VulkanManager.h b/libs/hwui/renderthread/VulkanManager.h index 31de8030c4c1..dd3c6d0dba81 100644 --- a/libs/hwui/renderthread/VulkanManager.h +++ b/libs/hwui/renderthread/VulkanManager.h @@ -179,13 +179,6 @@ private: SwapBehavior mSwapBehavior = SwapBehavior::Discard; GrVkExtensions mExtensions; uint32_t mDriverVersion = 0; - - // TODO: Remove once fix has landed. Temporaryly needed for workaround for setting up AHB - // surfaces on Qualcomm. Currently if you don't use VkSwapchain Qualcomm is not setting - // reporting that we need to use one of their private vendor usage bits which greatly effects - // performance if it is not used. - bool mIsQualcomm = false; - bool isQualcomm() const { return mIsQualcomm; } }; } /* namespace renderthread */ diff --git a/libs/hwui/renderthread/VulkanSurface.cpp b/libs/hwui/renderthread/VulkanSurface.cpp index df6b9ed2cdcb..b2cc23e76b8a 100644 --- a/libs/hwui/renderthread/VulkanSurface.cpp +++ b/libs/hwui/renderthread/VulkanSurface.cpp @@ -297,11 +297,6 @@ VulkanSurface* VulkanSurface::Create(ANativeWindow* window, ColorMode colorMode, native_window_get_consumer_usage(window, &consumerUsage); windowInfo.windowUsageFlags = consumerUsage | hwbUsage.androidHardwareBufferUsage; - if (vkManager.isQualcomm()) { - windowInfo.windowUsageFlags = - windowInfo.windowUsageFlags | AHARDWAREBUFFER_USAGE_VENDOR_0; - } - /* * Now we attempt to modify the window! */ diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index 23db27d421ac..31a6b81df485 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -233,6 +233,12 @@ public class ExifInterface { public static final String TAG_NEW_SUBFILE_TYPE = "NewSubfileType"; /** Type is String. */ public static final String TAG_OECF = "OECF"; + /** Type is String. {@hide} */ + public static final String TAG_OFFSET_TIME = "OffsetTime"; + /** Type is String. {@hide} */ + public static final String TAG_OFFSET_TIME_ORIGINAL = "OffsetTimeOriginal"; + /** Type is String. {@hide} */ + public static final String TAG_OFFSET_TIME_DIGITIZED = "OffsetTimeDigitized"; /** Type is int. */ public static final String TAG_PIXEL_X_DIMENSION = "PixelXDimension"; /** Type is int. */ @@ -486,6 +492,7 @@ public class ExifInterface { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private static SimpleDateFormat sFormatter; + private static SimpleDateFormat sFormatterTz; // See Exchangeable image file format for digital still cameras: Exif version 2.2. // The following values are for parsing EXIF data area. There are tag groups in EXIF data area. @@ -1041,6 +1048,9 @@ public class ExifInterface { new ExifTag(TAG_EXIF_VERSION, 36864, IFD_FORMAT_STRING), new ExifTag(TAG_DATETIME_ORIGINAL, 36867, IFD_FORMAT_STRING), new ExifTag(TAG_DATETIME_DIGITIZED, 36868, IFD_FORMAT_STRING), + new ExifTag(TAG_OFFSET_TIME, 36880, IFD_FORMAT_STRING), + new ExifTag(TAG_OFFSET_TIME_ORIGINAL, 36881, IFD_FORMAT_STRING), + new ExifTag(TAG_OFFSET_TIME_DIGITIZED, 36882, IFD_FORMAT_STRING), new ExifTag(TAG_COMPONENTS_CONFIGURATION, 37121, IFD_FORMAT_UNDEFINED), new ExifTag(TAG_COMPRESSED_BITS_PER_PIXEL, 37122, IFD_FORMAT_URATIONAL), new ExifTag(TAG_SHUTTER_SPEED_VALUE, 37377, IFD_FORMAT_SRATIONAL), @@ -1301,6 +1311,8 @@ public class ExifInterface { static { sFormatter = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); sFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); + sFormatterTz = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss XXX"); + sFormatterTz.setTimeZone(TimeZone.getTimeZone("UTC")); // Build up the hash tables to look up Exif tags for reading Exif tags. for (int ifdType = 0; ifdType < EXIF_TAGS.length; ++ifdType) { @@ -2140,7 +2152,8 @@ public class ExifInterface { @UnsupportedAppUsage public @CurrentTimeMillisLong long getDateTime() { return parseDateTime(getAttribute(TAG_DATETIME), - getAttribute(TAG_SUBSEC_TIME)); + getAttribute(TAG_SUBSEC_TIME), + getAttribute(TAG_OFFSET_TIME)); } /** @@ -2151,7 +2164,8 @@ public class ExifInterface { */ public @CurrentTimeMillisLong long getDateTimeDigitized() { return parseDateTime(getAttribute(TAG_DATETIME_DIGITIZED), - getAttribute(TAG_SUBSEC_TIME_DIGITIZED)); + getAttribute(TAG_SUBSEC_TIME_DIGITIZED), + getAttribute(TAG_OFFSET_TIME_DIGITIZED)); } /** @@ -2163,11 +2177,12 @@ public class ExifInterface { @UnsupportedAppUsage public @CurrentTimeMillisLong long getDateTimeOriginal() { return parseDateTime(getAttribute(TAG_DATETIME_ORIGINAL), - getAttribute(TAG_SUBSEC_TIME_ORIGINAL)); + getAttribute(TAG_SUBSEC_TIME_ORIGINAL), + getAttribute(TAG_OFFSET_TIME_ORIGINAL)); } private static @CurrentTimeMillisLong long parseDateTime(@Nullable String dateTimeString, - @Nullable String subSecs) { + @Nullable String subSecs, @Nullable String offsetString) { if (dateTimeString == null || !sNonZeroTimePattern.matcher(dateTimeString).matches()) return -1; @@ -2176,6 +2191,13 @@ public class ExifInterface { // The exif field is in local time. Parsing it as if it is UTC will yield time // since 1/1/1970 local time Date datetime = sFormatter.parse(dateTimeString, pos); + + if (offsetString != null) { + dateTimeString = dateTimeString + " " + offsetString; + ParsePosition position = new ParsePosition(0); + datetime = sFormatterTz.parse(dateTimeString, position); + } + if (datetime == null) return -1; long msecs = datetime.getTime(); diff --git a/media/java/android/media/ThumbnailUtils.java b/media/java/android/media/ThumbnailUtils.java index 5de56c718570..b3c2bb78862a 100644 --- a/media/java/android/media/ThumbnailUtils.java +++ b/media/java/android/media/ThumbnailUtils.java @@ -52,6 +52,7 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; +import java.util.Objects; import java.util.function.ToIntFunction; /** @@ -369,10 +370,12 @@ public class ThumbnailUtils { // If we're okay with something larger than native format, just // return a frame without up-scaling it if (size.getWidth() > width && size.getHeight() > height) { - return mmr.getFrameAtTime(duration / 2, OPTION_CLOSEST_SYNC); + return Objects.requireNonNull( + mmr.getFrameAtTime(duration / 2, OPTION_CLOSEST_SYNC)); } else { - return mmr.getScaledFrameAtTime(duration / 2, OPTION_CLOSEST_SYNC, - size.getWidth(), size.getHeight()); + return Objects.requireNonNull( + mmr.getScaledFrameAtTime(duration / 2, OPTION_CLOSEST_SYNC, + size.getWidth(), size.getHeight())); } } catch (RuntimeException e) { throw new IOException("Failed to create thumbnail", e); diff --git a/packages/CarSystemUI/AndroidManifest.xml b/packages/CarSystemUI/AndroidManifest.xml index 4e8a3a3885a7..195d4fee5162 100644 --- a/packages/CarSystemUI/AndroidManifest.xml +++ b/packages/CarSystemUI/AndroidManifest.xml @@ -19,6 +19,6 @@ package="com.android.systemui" android:sharedUserId="android.uid.systemui" coreApp="true"> - - + <!-- This permission is required to monitor car power state. --> + <uses-permission android:name="android.car.permission.CAR_POWER" /> </manifest> diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java index d20038db9151..5f99e1750bb6 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java @@ -22,7 +22,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.util.Log; +import android.view.Display; import android.view.View; import android.view.ViewGroup; @@ -112,9 +112,11 @@ public class CarFacetButtonController { */ public void taskChanged(List<ActivityManager.StackInfo> stackInfoList) { ActivityManager.StackInfo validStackInfo = null; - for (ActivityManager.StackInfo stackInfo :stackInfoList) { - // Find the first stack info with a topActivity - if (stackInfo.topActivity != null) { + for (ActivityManager.StackInfo stackInfo : stackInfoList) { + // Find the first stack info with a topActivity in the primary display. + // TODO: We assume that CarFacetButton will launch an app only in the primary display. + // We need to extend the functionality to handle the mutliple display properly. + if (stackInfo.topActivity != null && stackInfo.displayId == Display.DEFAULT_DISPLAY) { validStackInfo = stackInfo; break; } diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index 91053466f398..f5dab01d1b09 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -25,6 +25,7 @@ import android.app.ActivityTaskManager; import android.car.Car; import android.car.drivingstate.CarDrivingStateEvent; import android.car.drivingstate.CarUxRestrictionsManager; +import android.car.hardware.power.CarPowerManager.CarPowerStateListener; import android.content.Context; import android.graphics.PixelFormat; import android.graphics.Rect; @@ -121,12 +122,17 @@ public class CarStatusBar extends StatusBar implements private boolean mDeviceIsProvisioned = true; private HvacController mHvacController; private DrivingStateHelper mDrivingStateHelper; - private static FlingAnimationUtils sFlingAnimationUtils; + private PowerManagerHelper mPowerManagerHelper; + private FlingAnimationUtils mFlingAnimationUtils; private SwitchToGuestTimer mSwitchToGuestTimer; + private NotificationDataManager mNotificationDataManager; + private NotificationClickHandlerFactory mNotificationClickHandlerFactory; // The container for the notifications. private CarNotificationView mNotificationView; private RecyclerView mNotificationList; + // The controller for the notification view. + private NotificationViewController mNotificationViewController; // The state of if the notification list is currently showing the bottom. private boolean mNotificationListAtBottom; // Was the notification list at the bottom when the user first touched the screen @@ -156,6 +162,20 @@ public class CarStatusBar extends StatusBar implements // If notification shade is being swiped vertically to close. private boolean mIsSwipingVerticallyToClose; + private final CarPowerStateListener mCarPowerStateListener = + (int state) -> { + // When the car powers on, clear all notifications and mute/unread states. + Log.d(TAG, "New car power state: " + state); + if (state == CarPowerStateListener.ON) { + if (mNotificationClickHandlerFactory != null) { + mNotificationClickHandlerFactory.clearAllNotifications(); + } + if (mNotificationDataManager != null) { + mNotificationDataManager.clearAll(); + } + } + }; + @Override public void start() { // get the provisioned state before calling the parent class since it's that flow that @@ -172,7 +192,7 @@ public class CarStatusBar extends StatusBar implements R.integer.notification_settle_open_percentage); mSettleClosePercentage = mContext.getResources().getInteger( R.integer.notification_settle_close_percentage); - sFlingAnimationUtils = new FlingAnimationUtils(mContext, + mFlingAnimationUtils = new FlingAnimationUtils(mContext, FLING_ANIMATION_MAX_TIME, FLING_SPEED_UP_FACTOR); createBatteryController(); @@ -204,6 +224,9 @@ public class CarStatusBar extends StatusBar implements mDrivingStateHelper = new DrivingStateHelper(mContext, this::onDrivingStateChanged); mDrivingStateHelper.connectToCarService(); + mPowerManagerHelper = new PowerManagerHelper(mContext, mCarPowerStateListener); + mPowerManagerHelper.connectToCarService(); + mSwitchToGuestTimer = new SwitchToGuestTimer(mContext); } @@ -308,7 +331,6 @@ public class CarStatusBar extends StatusBar implements } } - @Override protected void makeStatusBarView(@Nullable RegisterStatusBarResult result) { super.makeStatusBarView(result); @@ -407,7 +429,7 @@ public class CarStatusBar extends StatusBar implements } ); - NotificationClickHandlerFactory clickHandlerFactory = new NotificationClickHandlerFactory( + mNotificationClickHandlerFactory = new NotificationClickHandlerFactory( mBarService, launchResult -> { if (launchResult == ActivityManager.START_TASK_TO_FRONT @@ -422,17 +444,27 @@ public class CarStatusBar extends StatusBar implements CarUxRestrictionManagerWrapper carUxRestrictionManagerWrapper = new CarUxRestrictionManagerWrapper(); carUxRestrictionManagerWrapper.setCarUxRestrictionsManager(carUxRestrictionsManager); - NotificationDataManager notificationDataManager = new NotificationDataManager(); + + mNotificationDataManager = new NotificationDataManager(); + mNotificationDataManager.setOnUnseenCountUpdateListener( + () -> { + // TODO: Update Notification Icon based on unseen count + Log.d(TAG, "unseen count: " + + mNotificationDataManager.getUnseenNotificationCount()); + }); + CarHeadsUpNotificationManager carHeadsUpNotificationManager = - new CarSystemUIHeadsUpNotificationManager(mContext, clickHandlerFactory, - notificationDataManager); + new CarSystemUIHeadsUpNotificationManager(mContext, + mNotificationClickHandlerFactory, mNotificationDataManager); + mNotificationClickHandlerFactory.setNotificationDataManager(mNotificationDataManager); carNotificationListener.registerAsSystemService(mContext, carUxRestrictionManagerWrapper, - carHeadsUpNotificationManager, notificationDataManager); + carHeadsUpNotificationManager, mNotificationDataManager); mNotificationView = mStatusBarWindow.findViewById(R.id.notification_view); View glassPane = mStatusBarWindow.findViewById(R.id.glass_pane); - mNotificationView.setClickHandlerFactory(clickHandlerFactory); + mNotificationView.setClickHandlerFactory(mNotificationClickHandlerFactory); + mNotificationView.setNotificationDataManager(mNotificationDataManager); // The glass pane is used to view touch events before passed to the notification list. // This allows us to initialize gesture listeners and detect when to close the notifications @@ -514,11 +546,12 @@ public class CarStatusBar extends StatusBar implements } }); - NotificationViewController mNotificationViewController = new NotificationViewController( + mNotificationViewController = new NotificationViewController( mNotificationView, PreprocessingManager.getInstance(mContext), carNotificationListener, - carUxRestrictionManagerWrapper); + carUxRestrictionManagerWrapper, + mNotificationDataManager); mNotificationViewController.enable(); } @@ -538,7 +571,6 @@ public class CarStatusBar extends StatusBar implements mNotificationList.scrollToPosition(0); mStatusBarWindowController.setPanelVisible(true); mNotificationView.setVisibility(View.VISIBLE); - animateNotificationPanel(mOpeningVelocity, false); setPanelExpanded(true); @@ -621,15 +653,18 @@ public class CarStatusBar extends StatusBar implements mStatusBarWindowController.setPanelVisible(false); mNotificationView.setVisibility(View.INVISIBLE); mNotificationList.setClipBounds(null); + mNotificationViewController.setIsInForeground(false); // let the status bar know that the panel is closed setPanelExpanded(false); } else { + mNotificationViewController.setIsInForeground(true); // let the status bar know that the panel is open + mNotificationView.setVisibleNotificationsAsSeen(); setPanelExpanded(true); } } }); - sFlingAnimationUtils.apply(animator, from, to, Math.abs(velocity)); + mFlingAnimationUtils.apply(animator, from, to, Math.abs(velocity)); animator.start(); } @@ -825,7 +860,6 @@ public class CarStatusBar extends StatusBar implements } } - @Override public void showBatteryView() { if (Log.isLoggable(TAG, Log.DEBUG)) { diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/PowerManagerHelper.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/PowerManagerHelper.java new file mode 100644 index 000000000000..8de1439c3306 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/PowerManagerHelper.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.car; + +import android.annotation.NonNull; +import android.car.Car; +import android.car.CarNotConnectedException; +import android.car.hardware.power.CarPowerManager; +import android.car.hardware.power.CarPowerManager.CarPowerStateListener; +import android.content.ComponentName; +import android.content.Context; +import android.content.ServiceConnection; +import android.os.IBinder; +import android.util.Log; + +/** + * Helper class for connecting to the {@link CarPowerManager} and listening for power state changes. + */ +public class PowerManagerHelper { + public static final String TAG = "PowerManagerHelper"; + + private final Context mContext; + private final CarPowerStateListener mCarPowerStateListener; + + private Car mCar; + private CarPowerManager mCarPowerManager; + + private final ServiceConnection mCarConnectionListener = + new ServiceConnection() { + public void onServiceConnected(ComponentName name, IBinder service) { + Log.d(TAG, "Car Service connected"); + try { + mCarPowerManager = (CarPowerManager) mCar.getCarManager(Car.POWER_SERVICE); + if (mCarPowerManager != null) { + mCarPowerManager.setListener(mCarPowerStateListener); + } else { + Log.e(TAG, "CarPowerManager service not available"); + } + } catch (CarNotConnectedException e) { + Log.e(TAG, "Car not connected", e); + } + } + + @Override + public void onServiceDisconnected(ComponentName name) { + destroyCarPowerManager(); + } + }; + + PowerManagerHelper(Context context, @NonNull CarPowerStateListener listener) { + mContext = context; + mCarPowerStateListener = listener; + } + + /** + * Connect to Car service. + */ + void connectToCarService() { + mCar = Car.createCar(mContext, mCarConnectionListener); + if (mCar != null) { + mCar.connect(); + } + } + + /** + * Disconnects from Car service. + */ + void disconnectFromCarService() { + if (mCar != null) { + mCar.disconnect(); + } + } + + private void destroyCarPowerManager() { + if (mCarPowerManager != null) { + mCarPowerManager.clearListener(); + } + } +} diff --git a/packages/NetworkStack/Android.bp b/packages/NetworkStack/Android.bp index 62de2ba45455..64718da8333b 100644 --- a/packages/NetworkStack/Android.bp +++ b/packages/NetworkStack/Android.bp @@ -108,6 +108,8 @@ android_app { defaults: ["NetworkStackAppCommon"], certificate: "platform", manifest: "AndroidManifest_InProcess.xml", + // InProcessNetworkStack is a replacement for NetworkStack + overrides: ["NetworkStack"], } // Updatable network stack packaged as an application @@ -116,6 +118,7 @@ android_app { defaults: ["NetworkStackAppCommon"], certificate: "networkstack", manifest: "AndroidManifest.xml", + use_embedded_native_libs: true, } genrule { diff --git a/packages/NetworkStack/AndroidManifest.xml b/packages/NetworkStack/AndroidManifest.xml index 252b90fea840..bfcd6c1baba3 100644 --- a/packages/NetworkStack/AndroidManifest.xml +++ b/packages/NetworkStack/AndroidManifest.xml @@ -41,7 +41,7 @@ <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" /> <!-- Signature permission defined in NetworkStackStub --> <uses-permission android:name="android.permission.MAINLINE_NETWORK_STACK" /> - <application> + <application android:extractNativeLibs="false"> <service android:name="com.android.server.NetworkStackService"> <intent-filter> <action android:name="android.net.INetworkStackConnector"/> diff --git a/packages/NetworkStack/src/android/net/ip/IpClient.java b/packages/NetworkStack/src/android/net/ip/IpClient.java index dc74c041c35a..266b1b047a90 100644 --- a/packages/NetworkStack/src/android/net/ip/IpClient.java +++ b/packages/NetworkStack/src/android/net/ip/IpClient.java @@ -372,10 +372,6 @@ public class IpClient extends StateMachine { private boolean mMulticastFiltering; private long mStartTimeMillis; - /* This must match the definition in KeepaliveTracker.KeepaliveInfo */ - private static final int TYPE_NATT = 1; - private static final int TYPE_TCP = 2; - /** * Reading the snapshot is an asynchronous operation initiated by invoking * Callback.startReadPacketFilter() and completed when the WiFi Service responds with an @@ -705,7 +701,7 @@ public class IpClient extends StateMachine { * keepalive offload. */ public void addKeepalivePacketFilter(int slot, @NonNull TcpKeepalivePacketDataParcelable pkt) { - sendMessage(CMD_ADD_KEEPALIVE_PACKET_FILTER_TO_APF, slot, TYPE_TCP, pkt); + sendMessage(CMD_ADD_KEEPALIVE_PACKET_FILTER_TO_APF, slot, 0 /* Unused */, pkt); } /** @@ -714,7 +710,7 @@ public class IpClient extends StateMachine { */ public void addNattKeepalivePacketFilter(int slot, @NonNull NattKeepalivePacketDataParcelable pkt) { - sendMessage(CMD_ADD_KEEPALIVE_PACKET_FILTER_TO_APF, slot, TYPE_NATT, pkt); + sendMessage(CMD_ADD_KEEPALIVE_PACKET_FILTER_TO_APF, slot, 0 /* Unused */ , pkt); } /** @@ -1626,13 +1622,12 @@ public class IpClient extends StateMachine { case CMD_ADD_KEEPALIVE_PACKET_FILTER_TO_APF: { final int slot = msg.arg1; - final int type = msg.arg2; if (mApfFilter != null) { - if (type == TYPE_NATT) { + if (msg.obj instanceof NattKeepalivePacketDataParcelable) { mApfFilter.addNattKeepalivePacketFilter(slot, (NattKeepalivePacketDataParcelable) msg.obj); - } else { + } else if (msg.obj instanceof TcpKeepalivePacketDataParcelable) { mApfFilter.addTcpKeepalivePacketFilter(slot, (TcpKeepalivePacketDataParcelable) msg.obj); } diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 69c432f4b412..5013300944f6 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -275,7 +275,7 @@ <string name="hdcp_checking_title" msgid="8605478913544273282">"Праверка HDCP"</string> <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"Усталяваць рэжым праверкі HDCP"</string> <string name="debug_debugging_category" msgid="6781250159513471316">"Адладка"</string> - <string name="debug_app" msgid="8349591734751384446">"Выберыце праграму для адладкі"</string> + <string name="debug_app" msgid="8349591734751384446">"Выбраць праграму для адладкі"</string> <string name="debug_app_not_set" msgid="718752499586403499">"Праграма для адладкi не зададзена"</string> <string name="debug_app_set" msgid="2063077997870280017">"Адладка прыкладання: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="select_application" msgid="5156029161289091703">"Выберыце прыкладанне"</string> @@ -304,7 +304,7 @@ <string name="disable_overlays_summary" msgid="3578941133710758592">"Заўсёды выкарыстоўваць GPU для экраннай кампаноўкі"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Сімуляцыя каляр. прасторы"</string> <string name="enable_opengl_traces_title" msgid="6790444011053219871">"Уключэнне слядоў OpenGL"</string> - <string name="usb_audio_disable_routing" msgid="8114498436003102671">"Адключыць аўдыёмаршрутызацыю USB"</string> + <string name="usb_audio_disable_routing" msgid="8114498436003102671">"Адключыць аўдыямаршрутызацыю USB"</string> <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"Выкл. аўтаперанакіраванне на USB-аўдыяпрылады"</string> <string name="debug_layout" msgid="5981361776594526155">"Паказаць межы макета"</string> <string name="debug_layout_summary" msgid="2001775315258637682">"Паказаць межы кліпа, палі і г. д."</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index c63cba907386..18bbc80beed2 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -314,7 +314,7 @@ <string name="force_msaa_summary" msgid="9123553203895817537">"Активиране на 4x MSAA в прилож. с OpenGL ES 2.0"</string> <string name="show_non_rect_clip" msgid="505954950474595172">"Отстр. на грешки при неправоъг. изрязване"</string> <string name="track_frame_time" msgid="6094365083096851167">"Изобр. на HWUI: Профилир."</string> - <string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Слоеве за отстр. на грешки в ГП: Актив."</string> + <string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Активиране на слоевете за отстр. на грешки в ГП"</string> <string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Разреш. на зарежд. на слоевете за отстр. на грешки в ГП за съотв. прилож."</string> <string name="window_animation_scale_title" msgid="6162587588166114700">"Скала на аним.: Прозорец"</string> <string name="transition_animation_scale_title" msgid="387527540523595875">"Скала на преходната анимация"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index ac27c1e2ed6f..22d39c502445 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -259,7 +259,7 @@ <string name="allow_mock_location" msgid="2787962564578664888">"Ubicaciones de prueba"</string> <string name="allow_mock_location_summary" msgid="317615105156345626">"Permitir ubicaciones de prueba"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"Habilitar inspección de atributos de vista"</string> - <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Siempre mantén los datos móviles activos, incluso cuando esté activada la conexión Wi‑Fi (para cambiar de red de forma rápida)."</string> + <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Mantener siempre los datos móviles activos, incluso cuando esté activada la conexión Wi‑Fi (para cambiar de red de forma rápida)."</string> <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Usar la aceleración de hardware de conexión mediante dispositivo portátil si está disponible"</string> <string name="adb_warning_title" msgid="6234463310896563253">"¿Permitir depuración por USB?"</string> <string name="adb_warning_message" msgid="7316799925425402244">"La depuración por USB solo está indicada para actividades de programación. Úsala para copiar datos entre tu computadora y el dispositivo, para instalar aplicaciones en el dispositivo sin recibir notificaciones y para leer datos de registro."</string> @@ -295,7 +295,7 @@ <string name="show_touches_summary" msgid="6101183132903926324">"Mostrar información visual para presiones"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Ver actualiz. de superficie"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"Destello en superficie por actualización"</string> - <string name="show_hw_screen_updates" msgid="4117270979975470789">"Mostrar actualizaciones"</string> + <string name="show_hw_screen_updates" msgid="4117270979975470789">"Mostrar cambios de vista"</string> <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Mostrar vistas de ventanas procesadas"</string> <string name="show_hw_layers_updates" msgid="5645728765605699821">"Ver actualiz. de capas de hardware"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Luz verde en capas de hardware al actualizarse"</string> @@ -327,7 +327,7 @@ <string name="show_all_anrs" msgid="4924885492787069007">"Mostrar ANR en 2.° plano"</string> <string name="show_all_anrs_summary" msgid="6636514318275139826">"Mostrar diálogo cuando las apps en segundo plano no responden"</string> <string name="show_notification_channel_warnings" msgid="1399948193466922683">"Alertas de notificaciones"</string> - <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"App que publica notificación sin canal válido"</string> + <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"Advertencia en pantalla cuando una app publica una notificación sin canal válido"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permisos en almacenamiento externo"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Cualquier app puede escribirse en un almacenamiento externo, sin importar los valores del manifiesto"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forzar actividades para que cambien de tamaño"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index d62a4789d572..e5e8f56a840f 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -88,7 +88,7 @@ <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"Kasutamine kontaktide jagamiseks"</string> <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Interneti-ühenduse jagamine"</string> <string name="bluetooth_profile_map" msgid="1019763341565580450">"Tekstsõnumid"</string> - <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-kaardi juurdepääs"</string> + <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-i juurdepääs"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-heli: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-heli"</string> <string name="bluetooth_profile_hearing_aid" msgid="6680721080542444257">"Kuuldeaparaadid"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index 287d9ebe99a2..447b738dfae1 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -207,7 +207,7 @@ <string name="bugreport_in_power" msgid="7923901846375587241">"Akatsen txostenerako lasterbidea"</string> <string name="bugreport_in_power_summary" msgid="1778455732762984579">"Bateriaren menuan, erakutsi akatsen txostena sortzeko botoia"</string> <string name="keep_screen_on" msgid="1146389631208760344">"Mantendu aktibo"</string> - <string name="keep_screen_on_summary" msgid="2173114350754293009">"Pantaila ez da inoiz inaktibo ezarriko kargatu bitartean"</string> + <string name="keep_screen_on_summary" msgid="2173114350754293009">"Pantaila ez da ezarriko inoiz inaktibo kargatu bitartean"</string> <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Gaitu Bluetooth HCI miatze-erregistroa"</string> <string name="bt_hci_snoop_log_summary" msgid="8857606786588106495">"Hauteman Bluetooth paketeak (aktibatu edo desaktibatu Bluetooth konexioa ezarpena aldatu ostean)."</string> <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM desblokeoa"</string> @@ -267,7 +267,7 @@ <string name="dev_settings_warning_title" msgid="7244607768088540165">"Baimendu garapenerako ezarpenak?"</string> <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ezarpen hauek garapen-xedeetarako pentsatu dira soilik. Baliteke ezarpenen eraginez gailua matxuratzea edo funtzionamendu okerra izatea."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Egiaztatu USBko aplikazioak"</string> - <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Egiaztatu ADB/ADT bidez instalatutako aplikazioak portaera kaltegarriak antzemateko."</string> + <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Egiaztatu ADB/ADT bidez instalatutako aplikazioak portaera kaltegarriak antzemateko"</string> <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"Bluetooth gailuak izenik gabe (MAC helbideak soilik) erakutsiko dira"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Bluetooth bidezko bolumen absolutuaren eginbidea desgaitu egiten du urruneko gailuetan arazoak hautematen badira; esaterako, bolumena ozenegia bada edo ezin bada kontrolatu"</string> <string name="enable_terminal_title" msgid="95572094356054120">"Tokiko terminala"</string> @@ -297,12 +297,12 @@ <string name="show_screen_updates_summary" msgid="2569622766672785529">"Distiratu leiho osoen azalak eguneratzen direnean"</string> <string name="show_hw_screen_updates" msgid="4117270979975470789">"Erakutsi ikuspegi-aldaketak"</string> <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Nabarmendu leiho barruko ikuspegiak marraztean"</string> - <string name="show_hw_layers_updates" msgid="5645728765605699821">"Hardware-geruzen eguneratzeak"</string> + <string name="show_hw_layers_updates" msgid="5645728765605699821">"Hardware-geruzen aldaketak"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Eguneratu bitartean, hardware-geruzak berdez"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Araztu GPU gainidazketa"</string> <string name="disable_overlays" msgid="2074488440505934665">"Desgaitu HW gainjartzeak"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Erabili beti GPU pantaila-muntaietarako"</string> - <string name="simulate_color_space" msgid="6745847141353345872">"Simulatu kolore-espazioa"</string> + <string name="simulate_color_space" msgid="6745847141353345872">"Simulatu kolore-eremua"</string> <string name="enable_opengl_traces_title" msgid="6790444011053219871">"Gaitu OpenGL aztarnak"</string> <string name="usb_audio_disable_routing" msgid="8114498436003102671">"Desgaitu USB audio-bideratzea"</string> <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"Desgaitu USB audio-gailuetara automatikoki bideratzea"</string> @@ -329,9 +329,9 @@ <string name="show_notification_channel_warnings" msgid="1399948193466922683">"Erakutsi jakinarazpenen kanalen abisuak"</string> <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"Bistaratu abisuak aplikazioek baliozko kanalik gabeko jakinarazpenak argitaratzean"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"Behartu aplikazioak onartzea kanpoko memorian"</string> - <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Aplikazioek kanpoko memorian idatz dezakete, manifestuaren balioak kontuan izan gabe"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Aplikazioek kanpoko memorian idatz dezakete, ezarritako balioak kontuan izan gabe"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Behartu jardueren tamaina doitu ahal izatea"</string> - <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Eman aukera jarduera guztien tamaina doitzeko, hainbat leihotan erabili ahal izan daitezen, manifestuan jartzen duena jartzen duela ere."</string> + <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Eman aukera jarduera guztien tamaina doitzeko, hainbat leihotan erabili ahal izan daitezen, ezarritako balioak kontuan izan gabe"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Gaitu estilo libreko leihoak"</string> <string name="enable_freeform_support_summary" msgid="8247310463288834487">"Onartu estilo libreko leiho esperimentalak"</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Babeskopien pasahitz lokala"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index a123bfe02940..c8f99a757fa0 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -266,8 +266,8 @@ <string name="adb_keys_warning_message" msgid="5659849457135841625">"دسترسی به اشکالزدایی USB از تمام رایانههایی که قبلاً مجاز دانستهاید لغو شود؟"</string> <string name="dev_settings_warning_title" msgid="7244607768088540165">"تنظیمات برنامهنویسی مجاز باشد؟"</string> <string name="dev_settings_warning_message" msgid="2298337781139097964">"این تنظیمات فقط برای برنامهنویسی در نظر گرفته شده است. ممکن است استفاده از این تنظیمات موجب خرابی یا عملکرد نادرست دستگاه یا برنامههای شما شود."</string> - <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"تأیید برنامههای نصب شده از طریق USB"</string> - <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"برنامههای نصب شده از طریق ADB/ADT را ازنظر رفتار مخاطرهآمیز بررسی کنید."</string> + <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"تأیید برنامهها ازطریق USB"</string> + <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"برنامههای نصبشده ازطریق ADB/ADT را ازنظر رفتار مخاطرهآمیز بررسی کنید."</string> <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"دستگاههای بلوتوث بدون نام (فقط نشانیهای MAC) نشان داده خواهند شد"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"درصورت وجود مشکل در صدا با دستگاههای راه دور مثل صدای بلند ناخوشایند یا عدم کنترل صدا، ویژگی میزان صدای کامل بلوتوث را غیرفعال کنید."</string> <string name="enable_terminal_title" msgid="95572094356054120">"ترمینال محلی"</string> @@ -280,7 +280,7 @@ <string name="debug_app_set" msgid="2063077997870280017">"در حال اشکالزدایی برنامه: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="select_application" msgid="5156029161289091703">"انتخاب برنامه"</string> <string name="no_application" msgid="2813387563129153880">"هیچ چیز"</string> - <string name="wait_for_debugger" msgid="1202370874528893091">"انتظار برای اشکالزدا"</string> + <string name="wait_for_debugger" msgid="1202370874528893091">"منتظر اشکالزدا"</string> <string name="wait_for_debugger_summary" msgid="1766918303462746804">"برنامه اشکالزدایی شده منتظر پیوست شدن اشکالزدا قبل از اجرا است"</string> <string name="debug_input_category" msgid="1811069939601180246">"ورودی"</string> <string name="debug_drawing_category" msgid="6755716469267367852">"طراحی"</string> @@ -308,8 +308,8 @@ <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"غیرفعال کردن مسیریابی خودکار به وسایل جانبی صوتی USB"</string> <string name="debug_layout" msgid="5981361776594526155">"نمایش محدودههای طرحبندی"</string> <string name="debug_layout_summary" msgid="2001775315258637682">"نمایش مرزها، حاشیهها و ویژگیهای دیگر کلیپ."</string> - <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"اجباری کردن چیدمان RTL"</string> - <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"اجباری کردن چیدمان RTL صفحه برای همه زبانها"</string> + <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"اجباری کردن چیدمان راستچین"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"اجباری کردن چیدمان راستچین صفحه برای همه زبانها"</string> <string name="force_msaa" msgid="7920323238677284387">"اجبار 4x MSAA"</string> <string name="force_msaa_summary" msgid="9123553203895817537">"فعال کردن 4X MSAA در برنامههای OpenGL ES 2.0"</string> <string name="show_non_rect_clip" msgid="505954950474595172">"اشکالزدایی عملکردهای کلیپ غیرمربعی"</string> @@ -324,12 +324,12 @@ <string name="immediately_destroy_activities" msgid="1579659389568133959">"فعالیتها نگه داشته نشوند"</string> <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"از بین بردن هر فعالیت به محض خروج کاربر از آن"</string> <string name="app_process_limit_title" msgid="4280600650253107163">"محدودیت پردازش در پسزمینه"</string> - <string name="show_all_anrs" msgid="4924885492787069007">"نمایش موارد ANR پسزمینه"</string> + <string name="show_all_anrs" msgid="4924885492787069007">"نمایش موارد «برنامه پاسخ نمیدهد» پسزمینه"</string> <string name="show_all_anrs_summary" msgid="6636514318275139826">"نمایش گفتگوی \"برنامه پاسخ نمیدهد\" برای برنامههای پسزمینه"</string> <string name="show_notification_channel_warnings" msgid="1399948193466922683">"نمایش هشدارهای کانال اعلان"</string> <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"هنگامی که برنامهای بدون وجود کانالی معتبر، اعلانی پست میکند، هشدار روی صفحهای نمایش میدهد"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"اجازه اجباری به برنامههای دستگاه ذخیره خارجی"</string> - <string name="force_allow_on_external_summary" msgid="3640752408258034689">"بدون توجه به مقادیر مانیفست، هر برنامهای را برای نوشتن در حافظه خارجی واجد شرایط میکند"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"بدون توجه به مقادیر آشکار، هر برنامهای را برای نوشتن در حافظه خارجی واجد شرایط میکند"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"اجبار فعالیتها به قابل تغییر اندازه بودن"</string> <string name="force_resizable_activities_summary" msgid="6667493494706124459">"بدون توجه به مقادیر مانیفست، اندازه همه فعالیتها برای حالت چند پنجرهای میتواند تغییر کند."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"فعال کردن پنجرههای آزاد"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 514671bd5e07..e2bc2fea882e 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -407,7 +407,7 @@ <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"chargement…"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Pas en charge"</string> <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Appareil branché, mais impossible de le charger pour le moment"</string> - <string name="battery_info_status_full" msgid="2824614753861462808">"pleine"</string> + <string name="battery_info_status_full" msgid="2824614753861462808">"Pleine"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Contrôlé par l\'administrateur"</string> <string name="disabled" msgid="9206776641295849915">"Désactivée"</string> <string name="external_source_trusted" msgid="2707996266575928037">"Autorisé"</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 041845c7b131..ea4a68871252 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -153,7 +153,7 @@ <string name="launch_defaults_some" msgid="313159469856372621">"Postavljene su neke zadane postavke"</string> <string name="launch_defaults_none" msgid="4241129108140034876">"Nema zadanih postavki"</string> <string name="tts_settings" msgid="8186971894801348327">"Postavke za tekst u govor"</string> - <string name="tts_settings_title" msgid="1237820681016639683">"Pretvaranje teksta u govor"</string> + <string name="tts_settings_title" msgid="1237820681016639683">"Tekst u govor"</string> <string name="tts_default_rate_title" msgid="6030550998379310088">"Brzina govora"</string> <string name="tts_default_rate_summary" msgid="4061815292287182801">"Brzina kojom se izgovara tekst"</string> <string name="tts_default_pitch_title" msgid="6135942113172488671">"Visina glasa"</string> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 94acc7a82be6..836b70d39af6 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -208,7 +208,7 @@ <string name="bugreport_in_power_summary" msgid="1778455732762984579">"Գործարկման ցանկում ցույց տալ կոճակը՝ վրիպակների հաղորդման համար"</string> <string name="keep_screen_on" msgid="1146389631208760344">"Մնալ արթուն"</string> <string name="keep_screen_on_summary" msgid="2173114350754293009">"Էկրանը երբեք չի քնի լիցքավորման ընթացքում"</string> - <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Միացնել Bluetooth HCI snoop log-ը"</string> + <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Միացնել HCI մատյանի վարումը Bluetooth-ի համար"</string> <string name="bt_hci_snoop_log_summary" msgid="8857606786588106495">"Պահել Bluetooth փաթեթները (այս կարգավորումը փոխելուց հետո անհրաժեշտ է վերագործարկել Bluetooth-ը)"</string> <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ապակողպում"</string> <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Թույլ տալ սկզբնաբեռնման բեռնիչի ապակողպումը"</string> @@ -228,7 +228,7 @@ <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Ընտրել Bluetooth AVRCP տարբերակը"</string> <string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth աուդիո կոդեկ"</string> <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="8436224899475822557">"Գործարկել Bluetooth աուդիո կոդեկը\nԸնտրություն"</string> - <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth աուդիոյի Ընդհատավորման հաճախականությունը"</string> + <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth աուդիոյի ընդհատավորման հաճախականությունը"</string> <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="8010380028880963535">"Գործարկել Bluetooth աուդիո կոդեկը\nԸնտրություն՝ ընդհատավորման հաճախականություն"</string> <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth աուդիո, բիթ / նմուշ"</string> <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="8063859754619484760">"Գործարկել Bluetooth աուդիո կոդեկը\nԸնտրություն՝ բիթ/նմուշ"</string> @@ -244,7 +244,7 @@ <string name="private_dns_mode_provider" msgid="8354935160639360804">"Մասնավոր DNS ծառայության մատակարարի խնամորդի անունը"</string> <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Մուտքագրեք DNS ծառայության մատակարարի խնամորդի անունը"</string> <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Չհաջողվեց միանալ"</string> - <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Ցույց տալ անլար էկրանի հավաստագրման ընտրանքները"</string> + <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Ցույց տալ անլար էկրանների հավաստագրման ընտրանքները"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Բարձրացնել մակարդակը, Wi‑Fi ընտրիչում ամեն մի SSID-ի համար ցույց տալ RSSI"</string> <string name="wifi_metered_label" msgid="4514924227256839725">"Վճարովի թրաֆիկ"</string> <string name="wifi_unmetered_label" msgid="6124098729457992931">"Անսահմանափակ թրաֆիկ"</string> @@ -294,11 +294,11 @@ <string name="show_touches" msgid="2642976305235070316">"Ցույց տալ հպումները"</string> <string name="show_touches_summary" msgid="6101183132903926324">"Ցույց տալ հպումների տեսանելի արձագանքը"</string> <string name="show_screen_updates" msgid="5470814345876056420">"Ցույց տալ մակերեսի թարմացումները"</string> - <string name="show_screen_updates_summary" msgid="2569622766672785529">"Թող պատուհանի ամբողջական մակերեսները առկայծեն, երբ թարմացվում են"</string> + <string name="show_screen_updates_summary" msgid="2569622766672785529">"Թարմացվելիս ընդգծել սարքաշարի ծածկույթները կանաչ գույնով"</string> <string name="show_hw_screen_updates" msgid="4117270979975470789">"Ցուցադրել թարմացումները"</string> <string name="show_hw_screen_updates_summary" msgid="6506943466625875655">"Լուսավորել պատուհանի թարմացված տարածքները"</string> <string name="show_hw_layers_updates" msgid="5645728765605699821">"Ցույց տալ սարքաշարի ծածկույթի թարմացումները"</string> - <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Թող սարքաշարի ծածկույթները կանաչ գույնով առկայծեն, երբ թարմացվեն"</string> + <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Թարմացվելիս ընդգծել սարքաշարի ծածկույթները կանաչ գույնով"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Վրիպազերծել GPU գերազանցումները"</string> <string name="disable_overlays" msgid="2074488440505934665">"Կասեցնել HW վրադրումները"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Միշտ օգտագործել GPU-ն` էկրանի կազմման համար"</string> @@ -355,8 +355,8 @@ <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Ակտիվ չէ: Հպեք՝ փոխելու համար:"</string> <string name="inactive_app_active_summary" msgid="4174921824958516106">"Ակտիվ է: Հպեք՝ փոխելու համար:"</string> <string name="standby_bucket_summary" msgid="6567835350910684727">"Հավելվածի սպասման կարգավիճակ՝ <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <string name="runningservices_settings_title" msgid="8097287939865165213">"Աշխատեցվող ծառայություններ"</string> - <string name="runningservices_settings_summary" msgid="854608995821032748">"Դիտել և վերահսկել ընթացիկ աշխատեցվող ծառայությունները"</string> + <string name="runningservices_settings_title" msgid="8097287939865165213">"Աշխատող ծառայություններ"</string> + <string name="runningservices_settings_summary" msgid="854608995821032748">"Դիտել և վերահսկել ընթացիկ աշխատող ծառայությունները"</string> <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ծառայություն"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Ընտրեք WebView-ի իրականացումը"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Այս ընտրանքն այլևս վավեր չէ: Փորձեք նորից:"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 7efe241e4ab7..5ae201e4bd91 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -221,7 +221,7 @@ <string name="wifi_display_certification" msgid="8611569543791307533">"Сымсыз дисплей сертификаты"</string> <string name="wifi_verbose_logging" msgid="4203729756047242344">"Wi‑Fi егжей-тегжейлі журналы"</string> <string name="mobile_data_always_on" msgid="8774857027458200434">"Мобильдік деректер әрқашан қосулы"</string> - <string name="tethering_hardware_offload" msgid="7470077827090325814">"Тетерингтің аппараттық жеделдетуі"</string> + <string name="tethering_hardware_offload" msgid="7470077827090325814">"Тетеринг режиміндегі аппараттық жеделдету"</string> <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Bluetooth құрылғыларын атаусыз көрсету"</string> <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Абсолютті дыбыс деңгейін өшіру"</string> <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP нұсқасы"</string> @@ -260,7 +260,7 @@ <string name="allow_mock_location_summary" msgid="317615105156345626">"Жасанды аймақтарды пайдалануға рұқсат беру"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"Көру төлсипатын тексеруді қосу"</string> <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Wi‑Fi қосулы кезде де мобильдік интернетті өшірмеу (желіні жылдам ауыстыру үшін)"</string> - <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Қолжетімді болса тетерингтің аппараттық жеделдетуін пайдалану"</string> + <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Тетеринг режиміндегі аппараттық жеделдетуді пайдалану (қолжетімді болса)"</string> <string name="adb_warning_title" msgid="6234463310896563253">"USB жөндеулеріне рұқсат берілсін бе?"</string> <string name="adb_warning_message" msgid="7316799925425402244">"USB жөндеу дамыту мақсаттарына ғана арналған. Оны компьютер және құрылғы арасында дерек көшіру, құрылғыға ескертусіз қолданба орнату және тіркелім деректерін оқу үшін қолданыңыз."</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"Бұған дейін рұқсат берілген барлық компьютерлерде USB жөндеу функциясына тыйым салынсын ба?"</string> @@ -284,7 +284,7 @@ <string name="wait_for_debugger_summary" msgid="1766918303462746804">"Орындау алдында жөнделетін қолданба жөндеушіні күтеді"</string> <string name="debug_input_category" msgid="1811069939601180246">"Кіріс"</string> <string name="debug_drawing_category" msgid="6755716469267367852">"Сызу"</string> - <string name="debug_hw_drawing_category" msgid="6220174216912308658">"Бейнелеуді жабдықпен жылдамдату"</string> + <string name="debug_hw_drawing_category" msgid="6220174216912308658">"Бейнелеуді аппараттық жеделдету"</string> <string name="media_category" msgid="4388305075496848353">"Meдиа"</string> <string name="debug_monitoring_category" msgid="7640508148375798343">"Бақылау"</string> <string name="strict_mode" msgid="1938795874357830695">"Қатаң режим қосылған"</string> @@ -331,9 +331,9 @@ <string name="force_allow_on_external" msgid="3215759785081916381">"Сыртқы жадта қолданбаларға рұқсат ету"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Манифест мәндеріне қарамастан, кез келген қолданбаны сыртқы жадқа жазу мүмкіндігін береді"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Әрекеттердің өлшемін өзгертуге рұқсат ету"</string> - <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Манифест мәндеріне қарамастан бірнеше терезе режимінде барлық әрекеттердің өлшемін өзгертуге рұқсат беру."</string> + <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Манифест мәндеріне қарамастан, бірнеше терезе режимінде барлық әрекеттердің өлшемін өзгертуге рұқсат беру"</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Еркін пішіндегі терезелерді қосу"</string> - <string name="enable_freeform_support_summary" msgid="8247310463288834487">"Еркін пішінді терезелерді құру эксперименттік функиясын қосу."</string> + <string name="enable_freeform_support_summary" msgid="8247310463288834487">"Еркін пішінді терезелерді құру эксперименттік функиясын қосу"</string> <string name="local_backup_password_title" msgid="3860471654439418822">"Компьютердегі сақтық көшірме құпия сөзі"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Компьютердегі толық сақтық көшірмелер қазір қорғалмаған"</string> <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Үстелдік компьютердің толық сақтық көшірмелерінің кілтсөзін өзгерту немесе жою үшін түртіңіз"</string> @@ -357,7 +357,7 @@ <string name="standby_bucket_summary" msgid="6567835350910684727">"Қолданбаның күту режимі: <xliff:g id="BUCKET"> %s</xliff:g>"</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"Қосылып тұрған қызметтер"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"Қазір істеп тұрған қызметтерді көру және басқару"</string> - <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ендіру"</string> + <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView қызметі"</string> <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView ендіруін орнату"</string> <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"Бұл таңдау енді жарамды емес. Әрекетті қайталаңыз."</string> <string name="convert_to_file_encryption" msgid="3060156730651061223">"Файлды шифрлауға түрлендіру"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index cf58afed5aa7..4991ddbcaff2 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -452,7 +452,7 @@ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Күйгүзүү"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"\"Тынчымды алба\" режимин күйгүзүү"</string> <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Эч качан"</string> - <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Шашылыш эскертмелер гана"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Шашылыш билдирүүлөр гана"</string> <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Бул нерсе өчүрүлмөйүнчө <xliff:g id="WHEN">%1$s</xliff:g> боло турган кийинки ойготкучту укпайсыз"</string> <string name="zen_alarm_warning" msgid="6236690803924413088">"<xliff:g id="WHEN">%1$s</xliff:g> боло турган кийинки ойготкучту укпайсыз"</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 2e7a856e2171..bde71e304263 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -23,8 +23,7 @@ <string name="wifi_fail_to_scan" msgid="1265540342578081461">"Nepavyksta nuskaityti tinklų"</string> <string name="wifi_security_none" msgid="7985461072596594400">"Nėra"</string> <string name="wifi_remembered" msgid="4955746899347821096">"Išsaugotas"</string> - <!-- no translation found for wifi_disconnected (8085419869003922556) --> - <skip /> + <string name="wifi_disconnected" msgid="8085419869003922556">"Neprisijungta"</string> <string name="wifi_disabled_generic" msgid="4259794910584943386">"Neleidžiama"</string> <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP konfigūracijos triktis"</string> <string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"Neprisijungta dėl žemos kokybės tinklo"</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index ade78012bf30..5be177defda1 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -334,9 +334,9 @@ <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Направете сите активности да бидат со променлива големина за повеќе прозорци, без разлика на вредностите на манифестот."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Овозможи прозорци со слободна форма"</string> <string name="enable_freeform_support_summary" msgid="8247310463288834487">"Овозможи поддршка за експериментални прозорци со слободна форма."</string> - <string name="local_backup_password_title" msgid="3860471654439418822">"Резервна лозинка за работна површина"</string> - <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Целосни резервни копии на работната површина кои во моментов не се заштитени"</string> - <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Допрете за да се промени или отстрани лозинката за целосни резервни копии на работната површина"</string> + <string name="local_backup_password_title" msgid="3860471654439418822">"Лозинка за бекап на компјутер"</string> + <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Целосниот бекап на компјутерот во моментов не е заштитен"</string> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Допрете за да се промени или отстрани лозинката за целосен бекап на компјутерот"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Подесена нова лозинка на резервна копија"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Новата лозинка и потврдата не се исти"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Неуспешно подесување лозинка на резервна копија"</string> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index d24c79bdfce8..5f6acf10df0e 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -88,7 +88,7 @@ <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"संपर्क सामायिकरणासाठी वापरा"</string> <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"इंटरनेट कनेक्शन शेअररण"</string> <string name="bluetooth_profile_map" msgid="1019763341565580450">"मजकूर मेसेज"</string> - <string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम प्रवेश"</string> + <string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम अॅक्सेस"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ऑडिओ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ऑडिओ"</string> <string name="bluetooth_profile_hearing_aid" msgid="6680721080542444257">"श्रवण यंत्रे"</string> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 451959e86a19..0ca4e3ed7d3e 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -283,7 +283,7 @@ <string name="wait_for_debugger" msgid="1202370874528893091">"ଡିବଗର୍ ପାଇଁ ଅପେକ୍ଷା କରନ୍ତୁ"</string> <string name="wait_for_debugger_summary" msgid="1766918303462746804">"ଡିବଗ୍ ହୋଇଥିବା ଆପ୍ଲିକେସନ୍, ନିଷ୍ପାଦନ ପୂର୍ବରୁ ଆଟାଚ୍ କରିବା ପାଇଁ ଡିବଗର୍କୁ ଅପେକ୍ଷା କରେ"</string> <string name="debug_input_category" msgid="1811069939601180246">"ଇନପୁଟ୍"</string> - <string name="debug_drawing_category" msgid="6755716469267367852">"ଅଙ୍କନ"</string> + <string name="debug_drawing_category" msgid="6755716469267367852">"ଡ୍ରଇଂ"</string> <string name="debug_hw_drawing_category" msgid="6220174216912308658">"ହାର୍ଡୱେର୍ ଆକ୍ସଲରେଟେଡ୍ ରେଣ୍ଡରିଙ୍ଗ"</string> <string name="media_category" msgid="4388305075496848353">"ମିଡିଆ"</string> <string name="debug_monitoring_category" msgid="7640508148375798343">"ମନିଟରିଙ୍ଗ"</string> @@ -407,7 +407,7 @@ <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ଚାର୍ଜ ହେଉଛି"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ଚାର୍ଜ ହେଉନାହିଁ"</string> <string name="battery_info_status_not_charging" msgid="8523453668342598579">"ପ୍ଲଗ୍ରେ ଲାଗିଛି, ହେଲେ ଏବେ ଚାର୍ଜ କରିପାରିବ ନାହିଁ"</string> - <string name="battery_info_status_full" msgid="2824614753861462808">"ଚାର୍ଜ ଅଛି"</string> + <string name="battery_info_status_full" msgid="2824614753861462808">"ଚାର୍ଜ ସମ୍ପୂର୍ଣ୍ଣ"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"ଆଡ୍ମିନ୍ ଦ୍ୱାରା ନିୟନ୍ତ୍ରିତ"</string> <string name="disabled" msgid="9206776641295849915">"ଅକ୍ଷମ ହୋଇଛି"</string> <string name="external_source_trusted" msgid="2707996266575928037">"ଅନୁମୋଦିତ"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 28a91d068f7e..d21e3ade0f7e 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -238,7 +238,7 @@ <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="6893955536658137179">"Sproži kodek LDAC za zvok prek Bluetootha\nIzbira kodeka: kakovost predvajanja"</string> <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Pretočno predvajanje: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> <string name="select_private_dns_configuration_title" msgid="3700456559305263922">"Zasebni strežnik DNS"</string> - <string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Izbira načina zasebnega strežnika DNS"</string> + <string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"Izberite način zasebnega strežnika DNS"</string> <string name="private_dns_mode_off" msgid="8236575187318721684">"Izklopljeno"</string> <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Samodejno"</string> <string name="private_dns_mode_provider" msgid="8354935160639360804">"Ime gostitelja pri ponudniku zasebnega strežnika DNS"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 85c2e2c472ae..0b486f759e5a 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -309,7 +309,7 @@ <string name="debug_layout" msgid="5981361776594526155">"Onyesha mipaka ya mpangilio"</string> <string name="debug_layout_summary" msgid="2001775315258637682">"Onyesha mipaka ya picha, kingo, nk."</string> <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Lazimisha uelekezaji wa muundo wa RTL"</string> - <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Lazimisha uelekezaji wa muundo wa skrini kwa RTL kwa lugha zote"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Lazimisha mkao wa skrini uwe wa kulia kwenda kushoto kwa lugha zote"</string> <string name="force_msaa" msgid="7920323238677284387">"Lazimisha 4x MSAA"</string> <string name="force_msaa_summary" msgid="9123553203895817537">"Wezesha 4x MSAA katika programu za OpenGL ES 2.0"</string> <string name="show_non_rect_clip" msgid="505954950474595172">"Tatua uendeshaji wa klipu usio mstatili"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 8d724703ac51..4f8b9e4aeabf 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -137,7 +137,7 @@ <string name="accessibility_wifi_signal_full" msgid="7061045677694702">"สัญญาณ Wi-Fi เต็ม"</string> <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"เครือข่ายแบบเปิด"</string> <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"เครือข่ายที่ปลอดภัย"</string> - <string name="process_kernel_label" msgid="3916858646836739323">"ระบบปฏิบัติการของ Android"</string> + <string name="process_kernel_label" msgid="3916858646836739323">"ระบบปฏิบัติการ Android"</string> <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"แอปพลิเคชันที่นำออก"</string> <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"แอปพลิเคชันและผู้ใช้ที่นำออก"</string> <string name="data_usage_ota" msgid="5377889154805560860">"การอัปเดตระบบ"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 26fe3e11e935..7afb78a06635 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -282,13 +282,13 @@ <string name="no_application" msgid="2813387563129153880">"Hiçbiri"</string> <string name="wait_for_debugger" msgid="1202370874528893091">"Hata ayıklayıcıyı bekle"</string> <string name="wait_for_debugger_summary" msgid="1766918303462746804">"Hata ayıklanan uygulama, çalıştırılmadan önce hata ayıklayıcının eklenmesini bekler"</string> - <string name="debug_input_category" msgid="1811069939601180246">"Girdi"</string> + <string name="debug_input_category" msgid="1811069939601180246">"Giriş"</string> <string name="debug_drawing_category" msgid="6755716469267367852">"Çizim"</string> <string name="debug_hw_drawing_category" msgid="6220174216912308658">"Donanım hızlandırmalı oluşturma"</string> <string name="media_category" msgid="4388305075496848353">"Medya"</string> <string name="debug_monitoring_category" msgid="7640508148375798343">"İzleme"</string> <string name="strict_mode" msgid="1938795874357830695">"Yüksek düzey modu etkin"</string> - <string name="strict_mode_summary" msgid="142834318897332338">"Uyg. ana işlem parçasında uzun işlem yap. ekr. yakıp söndür"</string> + <string name="strict_mode_summary" msgid="142834318897332338">"Uygulamalar ana iş parçacığında uzun işlem yaparken ekranı yanıp söndür"</string> <string name="pointer_location" msgid="6084434787496938001">"İşaretçi konumu"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Mevcut dokunmatik verilerini gösteren yer paylaşımı"</string> <string name="show_touches" msgid="2642976305235070316">"Dokunmayı göster"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 36a8842cea52..08084561cce8 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -202,13 +202,13 @@ <string name="tethering_settings_not_available" msgid="6765770438438291012">"Цей користувач не може налаштовувати режим модема"</string> <string name="apn_settings_not_available" msgid="7873729032165324000">"Цей користувач не може налаштовувати назву точки доступу"</string> <string name="enable_adb" msgid="7982306934419797485">"Налагодження USB"</string> - <string name="enable_adb_summary" msgid="4881186971746056635">"Увімк. режим налагодження, коли телефон підключено через USB"</string> + <string name="enable_adb_summary" msgid="4881186971746056635">"Вмикати налагодження, коли телефон підключено через USB"</string> <string name="clear_adb_keys" msgid="4038889221503122743">"Скасувати доступ до налагодження USB"</string> <string name="bugreport_in_power" msgid="7923901846375587241">"Ярлик звіту про помилки"</string> <string name="bugreport_in_power_summary" msgid="1778455732762984579">"Показувати в меню живлення кнопку створення звіту про помилки"</string> <string name="keep_screen_on" msgid="1146389631208760344">"Залишати активним"</string> <string name="keep_screen_on_summary" msgid="2173114350754293009">"Екран не засинатиме під час заряджання"</string> - <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Увімкнути журнал відстеження інтерфейсу Bluetooth"</string> + <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Журнал інтерфейсу Bluetooth"</string> <string name="bt_hci_snoop_log_summary" msgid="8857606786588106495">"Отримання пакетів Bluetooth. (Змінивши це налаштування, увімкніть Bluetooth.)"</string> <string name="oem_unlock_enable" msgid="6040763321967327691">"Розблокування виробником"</string> <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Дозволити розблокування завантажувача"</string> @@ -312,7 +312,7 @@ <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Застосовувати макет письма справа наліво для всіх мов"</string> <string name="force_msaa" msgid="7920323238677284387">"Примус. запустити 4x MSAA"</string> <string name="force_msaa_summary" msgid="9123553203895817537">"Увімкнути 4x MSAA в програмах OpenGL ES 2.0"</string> - <string name="show_non_rect_clip" msgid="505954950474595172">"Налагодити операції непрямокутної обрізки"</string> + <string name="show_non_rect_clip" msgid="505954950474595172">"Налагодити непрямокутну обрізку"</string> <string name="track_frame_time" msgid="6094365083096851167">"Обробка HWUI за профілем"</string> <string name="enable_gpu_debug_layers" msgid="3848838293793255097">"Увімкнути шари налагодження ГП"</string> <string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"Дозвольте завантажувати шари налагодження ГП для додатків налагодження"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index b89d1f4c8a50..2ac9a9bc2045 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -154,7 +154,7 @@ <string name="launch_defaults_none" msgid="4241129108140034876">"Chưa đặt mặc định"</string> <string name="tts_settings" msgid="8186971894801348327">"Cài đặt chuyển văn bản sang lời nói"</string> <string name="tts_settings_title" msgid="1237820681016639683">"Đầu ra văn bản thành giọng nói"</string> - <string name="tts_default_rate_title" msgid="6030550998379310088">"Tốc độ nói"</string> + <string name="tts_default_rate_title" msgid="6030550998379310088">"Tốc độ lời nói"</string> <string name="tts_default_rate_summary" msgid="4061815292287182801">"Tốc độ đọc văn bản"</string> <string name="tts_default_pitch_title" msgid="6135942113172488671">"Độ cao"</string> <string name="tts_default_pitch_summary" msgid="1944885882882650009">"Ảnh hưởng đến âm điệu giọng nói được tổng hợp"</string> @@ -207,7 +207,7 @@ <string name="bugreport_in_power" msgid="7923901846375587241">"Phím tắt báo cáo lỗi"</string> <string name="bugreport_in_power_summary" msgid="1778455732762984579">"Hiển thị một nút trong menu nguồn để báo cáo lỗi"</string> <string name="keep_screen_on" msgid="1146389631208760344">"Không khóa màn hình"</string> - <string name="keep_screen_on_summary" msgid="2173114350754293009">"Màn hình sẽ không bao giờ chuyển sang chế độ nghỉ khi sạc"</string> + <string name="keep_screen_on_summary" msgid="2173114350754293009">"Màn hình sẽ không bao giờ chuyển sang chế độ ngủ khi sạc"</string> <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bật nhật ký theo dõi HCI Bluetooth"</string> <string name="bt_hci_snoop_log_summary" msgid="8857606786588106495">"Chụp các gói Bluetooth. (Chuyển đổi Bluetooth sau khi thay đổi tùy chọn cài đặt này)"</string> <string name="oem_unlock_enable" msgid="6040763321967327691">"Mở khóa OEM"</string> @@ -334,9 +334,9 @@ <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Cho phép thay đổi kích thước của tất cả các hoạt động cho nhiều cửa sổ, bất kể giá trị tệp kê khai là gì."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"Bật cửa sổ dạng tự do"</string> <string name="enable_freeform_support_summary" msgid="8247310463288834487">"Bật tính năng hỗ trợ cửa sổ dạng tự do thử nghiệm."</string> - <string name="local_backup_password_title" msgid="3860471654439418822">"Mật khẩu sao lưu của máy tính"</string> - <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Sao lưu toàn bộ máy tính hiện không được bảo vệ"</string> - <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Nhấn để thay đổi hoặc xóa mật khẩu dành cho sao lưu toàn bộ tới máy tính"</string> + <string name="local_backup_password_title" msgid="3860471654439418822">"Mật khẩu sao lưu vào máy tính"</string> + <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Các bản sao lưu đầy đủ vào máy tính hiện không được bảo vệ"</string> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Nhấn để thay đổi hoặc xóa mật khẩu dành cho các bản sao lưu đầy đủ vào máy tính"</string> <string name="local_backup_password_toast_success" msgid="582016086228434290">"Đã đặt mật khẩu sao lưu mới"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Mật khẩu mới và xác nhận không khớp"</string> <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Đặt mật khẩu sao lưu không thành công"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 1dfd3f24b2de..653a39b3b695 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -237,7 +237,7 @@ <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"藍牙音訊 LDAC 編解碼器:播放品質"</string> <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="6893955536658137179">"觸發藍牙音訊 LDAC\n編解碼器選項:播放品質"</string> <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"正在串流:<xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> - <string name="select_private_dns_configuration_title" msgid="3700456559305263922">"不公開的網域名稱系統 (DNS)"</string> + <string name="select_private_dns_configuration_title" msgid="3700456559305263922">"私人 DNS"</string> <string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"選取私人網域名稱系統 (DNS) 模式"</string> <string name="private_dns_mode_off" msgid="8236575187318721684">"停用"</string> <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"自動"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java index cb0b7c2bac83..98eb57300f0b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java +++ b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java @@ -286,8 +286,7 @@ public class SignalDrawable extends DrawableWrapper { /** Returns the state representing empty mobile signal with the given number of levels. */ public static int getEmptyState(int numLevels) { - // TODO empty state == 0 state. does there need to be a new drawable for this? - return getState(0, numLevels, false); + return getState(0, numLevels, true); } /** Returns the state representing carrier change with the given number of levels. */ diff --git a/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java b/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java index b8e1251dd79a..6fd874989c35 100644 --- a/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java +++ b/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java @@ -18,11 +18,11 @@ package com.android.settingslib.location; import android.app.AppOpsManager; import android.content.Context; +import android.content.PermissionChecker; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.graphics.drawable.Drawable; -import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.text.format.DateUtils; @@ -48,10 +48,15 @@ public class RecentLocationApps { private static final long RECENT_TIME_INTERVAL_MILLIS = DateUtils.DAY_IN_MILLIS; @VisibleForTesting - static final int[] LOCATION_OPS = new int[] { + static final int[] LOCATION_REQUEST_OPS = new int[]{ AppOpsManager.OP_MONITOR_LOCATION, AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION, }; + @VisibleForTesting + static final int[] LOCATION_PERMISSION_OPS = new int[]{ + AppOpsManager.OP_FINE_LOCATION, + AppOpsManager.OP_COARSE_LOCATION, + }; private final PackageManager mPackageManager; private final Context mContext; @@ -67,11 +72,13 @@ public class RecentLocationApps { * Fills a list of applications which queried location recently within specified time. * Apps are sorted by recency. Apps with more recent location requests are in the front. */ - public List<Request> getAppList() { + public List<Request> getAppList(boolean showSystemApps) { + // Retrieve a location usage list from AppOps + PackageManager pm = mContext.getPackageManager(); // Retrieve a location usage list from AppOps AppOpsManager aoManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE); - List<AppOpsManager.PackageOps> appOps = aoManager.getPackagesForOps(LOCATION_OPS); + List<AppOpsManager.PackageOps> appOps = aoManager.getPackagesForOps(LOCATION_REQUEST_OPS); final int appOpsCount = appOps != null ? appOps.size() : 0; @@ -83,26 +90,58 @@ public class RecentLocationApps { for (int i = 0; i < appOpsCount; ++i) { AppOpsManager.PackageOps ops = appOps.get(i); - // Don't show the Android System in the list - it's not actionable for the user. - // Also don't show apps belonging to background users except managed users. String packageName = ops.getPackageName(); int uid = ops.getUid(); - int userId = UserHandle.getUserId(uid); - boolean isAndroidOs = - (uid == Process.SYSTEM_UID) && ANDROID_SYSTEM_PACKAGE_NAME.equals(packageName); - if (isAndroidOs || !profiles.contains(new UserHandle(userId))) { + final UserHandle user = UserHandle.getUserHandleForUid(uid); + + // Don't show apps belonging to background users except managed users. + if (!profiles.contains(user)) { continue; } - Request request = getRequestFromOps(now, ops); - if (request != null) { - requests.add(request); + + // Don't show apps that do not have user sensitive location permissions + boolean showApp = true; + if (!showSystemApps) { + for (int op : LOCATION_PERMISSION_OPS) { + final String permission = AppOpsManager.opToPermission(op); + final int permissionFlags = pm.getPermissionFlags(permission, packageName, + user); + if (PermissionChecker.checkPermission(mContext, permission, -1, uid, + packageName) + == PermissionChecker.PERMISSION_GRANTED) { + if ((permissionFlags + & PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED) + == 0) { + showApp = false; + break; + } + } else { + if ((permissionFlags + & PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED) == 0) { + showApp = false; + break; + } + } + } + } + if (showApp) { + Request request = getRequestFromOps(now, ops); + if (request != null) { + requests.add(request); + } } } return requests; } - public List<Request> getAppListSorted() { - List<Request> requests = getAppList(); + /** + * Gets a list of apps that requested for location recently, sorting by recency. + * + * @param showSystemApps whether includes system apps in the list. + * @return the list of apps that recently requested for location. + */ + public List<Request> getAppListSorted(boolean showSystemApps) { + List<Request> requests = getAppList(showSystemApps); // Sort the list of Requests by recency. Most recent request first. Collections.sort(requests, Collections.reverseOrder(new Comparator<Request>() { @Override diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index baa3544bd3fd..e28c612453b4 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -179,7 +179,9 @@ public class AccessPoint implements Comparable<AccessPoint> { public static final int SECURITY_OWE = 4; public static final int SECURITY_SAE = 5; public static final int SECURITY_EAP_SUITE_B = 6; - public static final int SECURITY_MAX_VAL = 7; // Has to be the last + public static final int SECURITY_PSK_SAE_TRANSITION = 7; + public static final int SECURITY_OWE_TRANSITION = 8; + public static final int SECURITY_MAX_VAL = 9; // Has to be the last private static final int PSK_UNKNOWN = 0; private static final int PSK_WPA = 1; @@ -782,7 +784,8 @@ public class AccessPoint implements Comparable<AccessPoint> { ssid = bestResult.SSID; bssid = bestResult.BSSID; security = getSecurity(bestResult); - if (security == SECURITY_PSK || security == SECURITY_SAE) { + if (security == SECURITY_PSK || security == SECURITY_SAE + || security == SECURITY_PSK_SAE_TRANSITION) { pskType = getPskType(bestResult); } if (security == SECURITY_EAP) { @@ -859,6 +862,7 @@ public class AccessPoint implements Comparable<AccessPoint> { return concise ? context.getString(R.string.wifi_security_short_wep) : context.getString(R.string.wifi_security_wep); case SECURITY_SAE: + case SECURITY_PSK_SAE_TRANSITION: if (pskType == PSK_SAE) { return concise ? context.getString(R.string.wifi_security_short_psk_sae) : context.getString(R.string.wifi_security_psk_sae); @@ -866,6 +870,12 @@ public class AccessPoint implements Comparable<AccessPoint> { return concise ? context.getString(R.string.wifi_security_short_sae) : context.getString(R.string.wifi_security_sae); } + case SECURITY_OWE_TRANSITION: + if (mConfig != null && getSecurity(mConfig) == SECURITY_OWE) { + return concise ? context.getString(R.string.wifi_security_short_owe) : + context.getString(R.string.wifi_security_owe); + } + return concise ? "" : context.getString(R.string.wifi_security_none); case SECURITY_OWE: return concise ? context.getString(R.string.wifi_security_short_owe) : context.getString(R.string.wifi_security_owe); @@ -1150,7 +1160,7 @@ public class AccessPoint implements Comparable<AccessPoint> { if (networkId != WifiConfiguration.INVALID_NETWORK_ID) { return networkId == info.getNetworkId(); } else if (config != null) { - return TextUtils.equals(getKey(config), getKey()); + return isKeyEqual(getKey(config)); } else { // Might be an ephemeral connection with no WifiConfiguration. Try matching on SSID. // (Note that we only do this if the WifiConfiguration explicitly equals INVALID). @@ -1176,7 +1186,8 @@ public class AccessPoint implements Comparable<AccessPoint> { * Can only be called for unsecured networks. */ public void generateOpenNetworkConfig() { - if ((security != SECURITY_NONE) && (security != SECURITY_OWE)) { + if ((security != SECURITY_NONE) && (security != SECURITY_OWE) + && (security != SECURITY_OWE_TRANSITION)) { throw new IllegalStateException(); } if (mConfig != null) @@ -1184,7 +1195,7 @@ public class AccessPoint implements Comparable<AccessPoint> { mConfig = new WifiConfiguration(); mConfig.SSID = AccessPoint.convertToQuotedString(ssid); - if (security == SECURITY_NONE) { + if (security == SECURITY_NONE || !getWifiManager().isEasyConnectSupported()) { mConfig.allowedKeyManagement.set(KeyMgmt.NONE); } else { mConfig.allowedKeyManagement.set(KeyMgmt.OWE); @@ -1223,6 +1234,37 @@ public class AccessPoint implements Comparable<AccessPoint> { mAccessPointListener = listener; } + private static final String sPskSuffix = "," + String.valueOf(SECURITY_PSK); + private static final String sSaeSuffix = "," + String.valueOf(SECURITY_SAE); + private static final String sPskSaeSuffix = "," + String.valueOf(SECURITY_PSK_SAE_TRANSITION); + private static final String sOweSuffix = "," + String.valueOf(SECURITY_OWE); + private static final String sOpenSuffix = "," + String.valueOf(SECURITY_NONE); + private static final String sOweTransSuffix = "," + String.valueOf(SECURITY_OWE_TRANSITION); + + private boolean isKeyEqual(String compareTo) { + if (mKey == null) { + return false; + } + + if (compareTo.endsWith(sPskSuffix) || compareTo.endsWith(sSaeSuffix)) { + if (mKey.endsWith(sPskSaeSuffix)) { + // Special handling for PSK-SAE transition mode. If the AP has advertised both, + // we compare the key with both PSK and SAE for a match. + return TextUtils.equals(mKey.substring(0, mKey.lastIndexOf(',')), + compareTo.substring(0, compareTo.lastIndexOf(','))); + } + } + if (compareTo.endsWith(sOpenSuffix) || compareTo.endsWith(sOweSuffix)) { + if (mKey.endsWith(sOweTransSuffix)) { + // Special handling for OWE/Open networks. If AP advertises OWE in transition mode + // and we have an Open network saved, allow this connection to be established. + return TextUtils.equals(mKey.substring(0, mKey.lastIndexOf(',')), + compareTo.substring(0, compareTo.lastIndexOf(','))); + } + } + return mKey.equals(compareTo); + } + /** * Sets {@link #mScanResults} to the given collection and updates info based on the best RSSI * scan result. @@ -1240,7 +1282,7 @@ public class AccessPoint implements Comparable<AccessPoint> { if (mKey != null && !isPasspoint() && !isOsuProvider()) { for (ScanResult result : scanResults) { String scanResultKey = AccessPoint.getKey(result); - if (mKey != null && !mKey.equals(scanResultKey)) { + if (!isKeyEqual(scanResultKey)) { Log.d(TAG, String.format( "ScanResult %s\nkey of %s did not match current AP key %s", result, scanResultKey, mKey)); @@ -1546,6 +1588,8 @@ public class AccessPoint implements Comparable<AccessPoint> { private static int getSecurity(ScanResult result) { if (result.capabilities.contains("WEP")) { return SECURITY_WEP; + } else if (result.capabilities.contains("PSK+SAE")) { + return SECURITY_PSK_SAE_TRANSITION; } else if (result.capabilities.contains("SAE")) { return SECURITY_SAE; } else if (result.capabilities.contains("PSK")) { @@ -1554,10 +1598,11 @@ public class AccessPoint implements Comparable<AccessPoint> { return SECURITY_EAP_SUITE_B; } else if (result.capabilities.contains("EAP")) { return SECURITY_EAP; + } else if (result.capabilities.contains("OWE_TRANSITION")) { + return SECURITY_OWE_TRANSITION; } else if (result.capabilities.contains("OWE")) { return SECURITY_OWE; } - return SECURITY_NONE; } @@ -1601,6 +1646,10 @@ public class AccessPoint implements Comparable<AccessPoint> { return "SUITE_B"; } else if (security == SECURITY_OWE) { return "OWE"; + } else if (security == SECURITY_PSK_SAE_TRANSITION) { + return "PSK+SAE"; + } else if (security == SECURITY_OWE_TRANSITION) { + return "OWE_TRANSITION"; } return "NONE"; } diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java index 6269a717b333..dae546497aba 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java @@ -201,7 +201,8 @@ public class AccessPointPreference extends Preference { return; } if ((mAccessPoint.getSecurity() != AccessPoint.SECURITY_NONE) - && (mAccessPoint.getSecurity() != AccessPoint.SECURITY_OWE)) { + && (mAccessPoint.getSecurity() != AccessPoint.SECURITY_OWE) + && (mAccessPoint.getSecurity() != AccessPoint.SECURITY_OWE_TRANSITION)) { mFrictionSld.setState(STATE_SECURED); } else if (mAccessPoint.isMetered()) { mFrictionSld.setState(STATE_METERED); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAppsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAppsTest.java index 8bd5fd2163ae..7a553fc91ff6 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAppsTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/location/RecentLocationAppsTest.java @@ -16,8 +16,8 @@ import android.content.res.Resources; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; - import android.util.LongSparseLongArray; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -75,7 +75,8 @@ public class RecentLocationAppsTest { long[] testRequestTime = {ONE_MIN_AGO, TWENTY_THREE_HOURS_AGO, TWO_DAYS_AGO}; List<PackageOps> appOps = createTestPackageOpsList(TEST_PACKAGE_NAMES, testRequestTime); - when(mAppOpsManager.getPackagesForOps(RecentLocationApps.LOCATION_OPS)).thenReturn(appOps); + when(mAppOpsManager.getPackagesForOps(RecentLocationApps.LOCATION_REQUEST_OPS)).thenReturn( + appOps); mockTestApplicationInfos(mTestUserId, TEST_PACKAGE_NAMES); mRecentLocationApps = new RecentLocationApps(mContext); @@ -83,7 +84,7 @@ public class RecentLocationAppsTest { @Test public void testGetAppList_shouldFilterRecentApps() { - List<RecentLocationApps.Request> requests = mRecentLocationApps.getAppList(); + List<RecentLocationApps.Request> requests = mRecentLocationApps.getAppList(true); // Only two of the apps have requested location within 15 min. assertThat(requests).hasSize(2); // Make sure apps are ordered by recency @@ -107,11 +108,12 @@ public class RecentLocationAppsTest { {ONE_MIN_AGO, TWENTY_THREE_HOURS_AGO, TWO_DAYS_AGO, ONE_MIN_AGO}; List<PackageOps> appOps = createTestPackageOpsList(TEST_PACKAGE_NAMES, testRequestTime); appOps.add(androidSystemPackageOps); - when(mAppOpsManager.getPackagesForOps(RecentLocationApps.LOCATION_OPS)).thenReturn(appOps); + when(mAppOpsManager.getPackagesForOps(RecentLocationApps.LOCATION_REQUEST_OPS)).thenReturn( + appOps); mockTestApplicationInfos( Process.SYSTEM_UID, RecentLocationApps.ANDROID_SYSTEM_PACKAGE_NAME); - List<RecentLocationApps.Request> requests = mRecentLocationApps.getAppList(); + List<RecentLocationApps.Request> requests = mRecentLocationApps.getAppList(true); // Android OS shouldn't show up in the list of apps. assertThat(requests).hasSize(2); // Make sure apps are ordered by recency @@ -133,7 +135,7 @@ public class RecentLocationAppsTest { private List<PackageOps> createTestPackageOpsList(String[] packageNameList, long[] time) { List<PackageOps> packageOpsList = new ArrayList<>(); - for (int i = 0; i < packageNameList.length ; i++) { + for (int i = 0; i < packageNameList.length; i++) { PackageOps packageOps = createPackageOps( packageNameList[i], TEST_UID, @@ -156,11 +158,11 @@ public class RecentLocationAppsTest { private OpEntry createOpEntryWithTime(int op, long time, int duration) { final LongSparseLongArray accessTimes = new LongSparseLongArray(); accessTimes.put(AppOpsManager.makeKey(AppOpsManager.UID_STATE_TOP, - AppOpsManager.OP_FLAG_SELF), time); + AppOpsManager.OP_FLAG_SELF), time); final LongSparseLongArray durations = new LongSparseLongArray(); durations.put(AppOpsManager.makeKey(AppOpsManager.UID_STATE_TOP, - AppOpsManager.OP_FLAG_SELF), duration); + AppOpsManager.OP_FLAG_SELF), duration); return new OpEntry(op, false, AppOpsManager.MODE_ALLOWED, accessTimes, - null /*rejectTimes*/, durations, null /* proxyUids */, null /* proxyPackages */); + null /*rejectTimes*/, durations, null /* proxyUids */, null /* proxyPackages */); } } diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index 715e1ebe31ac..dd72d5779c19 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -225,7 +225,7 @@ <bool name="def_charging_sounds_enabled">true</bool> <!-- Default for Settings.Secure.NOTIFICATION_BUBBLES --> - <bool name="def_notification_bubbles">true</bool> + <bool name="def_notification_bubbles">false</bool> <!-- Default for Settings.Secure.AWARE_ENABLED --> <bool name="def_aware_enabled">false</bool> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 82592ceeb710..6558c87aaf3a 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -3237,7 +3237,7 @@ public class SettingsProvider extends ContentProvider { } private final class UpgradeController { - private static final int SETTINGS_VERSION = 179; + private static final int SETTINGS_VERSION = 180; private final int mUserId; @@ -4387,6 +4387,19 @@ public class SettingsProvider extends ContentProvider { currentVersion = 179; } + if (currentVersion == 179) { + // Version 178: Reset the default for Secure Settings: NOTIFICATION_BUBBLES + // This is originally set in version 173, however, the default value changed + // so this step is to ensure the value is updated to the correct defaulte + final SettingsState secureSettings = getSecureSettingsLocked(userId); + + secureSettings.insertSettingLocked(Secure.NOTIFICATION_BUBBLES, + getContext().getResources().getBoolean( + R.bool.def_notification_bubbles) ? "1" : "0", null, + true, SettingsState.SYSTEM_PACKAGE_NAME); + + currentVersion = 180; + } // vXXX: Add new settings above this point. diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index c2495b586144..94259416d274 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -58,6 +58,7 @@ android_library { "androidx.arch.core_core-runtime", "androidx.lifecycle_lifecycle-extensions", "androidx.dynamicanimation_dynamicanimation", + "iconloader_base", "SystemUI-tags", "SystemUI-proto", "dagger2-2.19", diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 02d826f5790c..4b4912cb1e8a 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -444,7 +444,7 @@ <activity android:name=".media.MediaProjectionPermissionActivity" android:exported="true" - android:theme="@style/Theme.MediaProjectionAlertDialog" + android:theme="@style/Theme.SystemUI.MediaProjectionAlertDialog" android:finishOnCloseSystemDialogs="true" android:launchMode="singleTop" android:excludeFromRecents="true" diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml index 29376ce01e4f..796123db7c79 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml @@ -38,6 +38,7 @@ android:clipChildren="false" android:clipToPadding="false" android:padding="0dp" + android:fitsSystemWindows="true" android:layout_gravity="center"> <com.android.keyguard.KeyguardSecurityViewFlipper android:id="@+id/view_flipper" diff --git a/packages/SystemUI/res/drawable-night/ic_media_projection_permission.xml b/packages/SystemUI/res/drawable-night/ic_media_projection_permission.xml new file mode 100644 index 000000000000..f20babff24c8 --- /dev/null +++ b/packages/SystemUI/res/drawable-night/ic_media_projection_permission.xml @@ -0,0 +1,26 @@ +<!-- +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. +--> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:insetLeft="2.5dp" + android:insetRight="2.5dp"> + <vector android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path android:fillColor="#FFFFFFFF" android:pathData="M1,18v3h3C4,19.34 2.66,18 1,18zM1,14v2c2.76,0 5,2.24 5,5h2C8,17.13 4.87,14 1,14zM1,10v2c4.97,0 9,4.03 9,9h2C12,14.92 7.07,10 1,10zM21,3H3C1.9,3 1,3.9 1,5v3h2V5h18v14h-7v2h7c1.1,0 2,-0.9 2,-2V5C23,3.9 22.1,3 21,3z"/> + <path android:fillColor="#FF0000" android:pathData="M19,7H5v1.63c3.96,1.28 7.09,4.41 8.37,8.37H19V7z"/> + </vector> +</inset> diff --git a/packages/SystemUI/res/drawable/bubble_flyout.xml b/packages/SystemUI/res/drawable/bubble_flyout.xml deleted file mode 100644 index afe5372d38d8..000000000000 --- a/packages/SystemUI/res/drawable/bubble_flyout.xml +++ /dev/null @@ -1,30 +0,0 @@ -<!-- - ~ Copyright (C) 2019 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License - --> -<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > - <item> - <shape android:shape="rectangle"> - <solid android:color="?android:attr/colorBackgroundFloating" /> - <corners - android:bottomLeftRadius="?android:attr/dialogCornerRadius" - android:topLeftRadius="?android:attr/dialogCornerRadius" - android:bottomRightRadius="?android:attr/dialogCornerRadius" - android:topRightRadius="?android:attr/dialogCornerRadius" /> - <padding - android:left="@dimen/bubble_flyout_pointer_size" - android:right="@dimen/bubble_flyout_pointer_size" /> - </shape> - </item> -</layer-list>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/biometric_dialog.xml b/packages/SystemUI/res/layout/biometric_dialog.xml index 1abb8735ddab..c560d7e8f126 100644 --- a/packages/SystemUI/res/layout/biometric_dialog.xml +++ b/packages/SystemUI/res/layout/biometric_dialog.xml @@ -37,7 +37,8 @@ android:id="@+id/space" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="1" /> + android:layout_weight="1" + android:contentDescription="@string/biometric_dialog_empty_space_description"/> <ScrollView android:layout_width="match_parent" diff --git a/packages/SystemUI/res/layout/bubble_flyout.xml b/packages/SystemUI/res/layout/bubble_flyout.xml index 0e4d2985e775..5f773f462deb 100644 --- a/packages/SystemUI/res/layout/bubble_flyout.xml +++ b/packages/SystemUI/res/layout/bubble_flyout.xml @@ -13,18 +13,13 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<FrameLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingLeft="@dimen/bubble_flyout_pointer_size" - android:paddingRight="@dimen/bubble_flyout_pointer_size"> +<merge xmlns:android="http://schemas.android.com/apk/res/android"> <FrameLayout - android:id="@+id/bubble_flyout" + android:id="@+id/bubble_flyout_text_container" android:layout_height="wrap_content" android:layout_width="wrap_content" - android:background="@drawable/bubble_flyout" + android:clipToPadding="false" android:paddingLeft="@dimen/bubble_flyout_padding_x" android:paddingRight="@dimen/bubble_flyout_padding_x" android:paddingTop="@dimen/bubble_flyout_padding_y" @@ -41,4 +36,4 @@ </FrameLayout> -</FrameLayout>
\ No newline at end of file +</merge>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/media_projection_dialog_title.xml b/packages/SystemUI/res/layout/media_projection_dialog_title.xml index c4d784ba23f7..b9e39dae13dc 100644 --- a/packages/SystemUI/res/layout/media_projection_dialog_title.xml +++ b/packages/SystemUI/res/layout/media_projection_dialog_title.xml @@ -15,25 +15,26 @@ limitations under the License. --> -<RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" +<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android" - android:theme="@style/Theme.MediaProjectionAlertDialog" + android:theme="@style/Theme.SystemUI.MediaProjectionAlertDialog" android:paddingStart="?android:attr/dialogPreferredPadding" android:paddingEnd="?android:attr/dialogPreferredPadding" - android:paddingTop="?android:attr/dialogPreferredPadding"> + android:orientation="vertical"> <ImageView android:id="@+id/dialog_icon" android:src="@drawable/ic_media_projection_permission" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:layout_marginBottom="20dp" - android:layout_centerInParent="true"/> + android:layout_height="24dp" + android:layout_width="24dp" + android:layout_marginTop="18dp" + android:layout_marginBottom="12dp" + android:layout_gravity="center_horizontal" /> <TextView android:id="@+id/dialog_title" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_below="@id/dialog_icon" - android:textColor="?android:attr/colorPrimary" + android:textSize="20sp" + android:textColor="?android:attr/textColorPrimary" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Title" /> -</RelativeLayout> +</LinearLayout> diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml index 4cf5f850285e..a91493003bb5 100644 --- a/packages/SystemUI/res/layout/super_status_bar.xml +++ b/packages/SystemUI/res/layout/super_status_bar.xml @@ -69,7 +69,7 @@ android:layout_height="match_parent" android:importantForAccessibility="no" sysui:ignoreRightInset="true" - /> + /> <LinearLayout android:id="@+id/lock_icon_container" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 895c2fed70f1..aa545faef921 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aan om <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Tot <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Donker-tema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is gedeaktiveer"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is geaktiveer"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Moenie weer wys nie"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Vee alles uit"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Bestuur"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Ligte kennigewings"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Vee alle ligte kennisgewings uit"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Kennisgewings onderbreek deur Moenie Steur Nie"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Begin nou"</string> <string name="empty_shade_text" msgid="708135716272867002">"Geen kennisgewings nie"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Hierdie kennisgewings kan nie gewysig word nie."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Hierdie groep kennisgewings kan nie hier opgestel word nie"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Instaanbediener-kennisgewing"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Hierdie program gebruik tans die kamera."</string> <string name="appops_microphone" msgid="741508267659494555">"Hierdie program gebruik tans die mikrofoon."</string> <string name="appops_overlay" msgid="6165912637560323464">"Hierdie program wys tans bo-oor ander programme op jou skerm."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Beweeg na regs bo"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Beweeg na links onder"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Beweeg na regs onder"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 7522c6f942fd..dfe34c73dcfa 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> ላይ ይበራል"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"እስከ <xliff:g id="TIME">%s</xliff:g> ድረስ"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ጨለማ ገጽታ"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"ኤንኤፍሲ"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"ኤንኤፍሲ ተሰናክሏል"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"ኤንኤፍሲ ነቅቷል"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"ዳግመኛ አታሳይ"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"ሁሉንም አጽዳ"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"ያቀናብሩ"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"ገር ማሳወቂያዎች"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"ረጋ ያሉትን ማሳወቂያዎች በሙሉ ያጽዱ"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"ማሳወቂያዎች በአትረብሽ ባሉበት ቆመዋል"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"አሁን ጀምር"</string> <string name="empty_shade_text" msgid="708135716272867002">"ምንም ማሳወቂያ የለም"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"የማሳወቂያዎች ይህ ቡድን እዚህ ላይ ሊዋቀር አይችልም"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"ተኪ ማሳወቂያ"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"ይህ መተግበሪያ ካሜራውን እየተጠቀመ ነው።"</string> <string name="appops_microphone" msgid="741508267659494555">"ይህ መተግበሪያ ማይክሮፎኑን እየተጠቀመ ነው።"</string> <string name="appops_overlay" msgid="6165912637560323464">"ይህ መተግበሪያ በማያ ገጽዎ ላይ ባሉ ሌሎች መተግበሪያዎች ላይ እያሳየ ነው።"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"ወደ ላይኛው ቀኝ አንቀሳቅስ"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"የግርጌውን ግራ አንቀሳቅስ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ታችኛውን ቀኝ ያንቀሳቅሱ"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 618ef0f54b9e..87842172a4fd 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -377,6 +377,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"تفعيل الإعداد في <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"حتى <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"مظهر الألوان الداكنة"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"الاتصالات قصيرة المدى (NFC)"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"تم إيقاف الاتصال القريب المدى"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"تم تفعيل الاتصال القريب المدى"</string> @@ -460,10 +462,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"عدم الإظهار مرة أخرى"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"محو الكل"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"إدارة"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"إشعارات بسيطة"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"محو جميع الإشعارات البسيطة"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"تم إيقاف الإشعارات مؤقتًا وفقًا لإعداد \"الرجاء عدم الإزعاج\""</string> <string name="media_projection_action_text" msgid="8470872969457985954">"البدء الآن"</string> <string name="empty_shade_text" msgid="708135716272867002">"ليس هناك أي اشعارات"</string> @@ -663,6 +663,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"يتعذّر تعديل هذه الإشعارات."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"يتعذّر ضبط مجموعة الإشعارات هذه هنا."</string> <string name="notification_delegate_header" msgid="2857691673814814270">"إشعار مستند إلى خادم وكيل"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"يستخدم هذا التطبيق الكاميرا."</string> <string name="appops_microphone" msgid="741508267659494555">"يستخدم هذا التطبيق الميكروفون."</string> <string name="appops_overlay" msgid="6165912637560323464">"يتم عرض هذا التطبيق فوق التطبيقات الأخرى على شاشتك."</string> @@ -946,4 +950,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"الانتقال إلى أعلى اليسار"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"نقل إلى أسفل يمين الشاشة"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"نقل إلى أسفل اليسار"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 813581814803..c2fbda5b7fe1 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>ত অন কৰক"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> পৰ্যন্ত"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"গাঢ় ৰঙৰ থীম"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC নিষ্ক্ৰিয় হৈ আছে"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC সক্ষম হৈ আছে"</string> @@ -651,6 +653,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"এই ধৰণৰ জাননীবোৰ ইয়াত কনফিগাৰ কৰিব পৰা নাযায়"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"প্ৰক্সি হিচাপে পঠিওৱা জাননী"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"এই এপে কেমেৰা ব্য়ৱহাৰ কৰি আছে।"</string> <string name="appops_microphone" msgid="741508267659494555">"এই এপে মাইক্ৰ\'ফ\'ন ব্য়ৱহাৰ কৰি আছে।"</string> <string name="appops_overlay" msgid="6165912637560323464">"এই এপটো আপোনাৰ স্ক্ৰীণত থকা অন্য় এপৰ ওপৰত প্ৰদৰ্শিত হৈ আছে।"</string> @@ -926,4 +932,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"শীৰ্ষৰ সোঁফালে নিয়ক"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"বুটামটো বাওঁফালে নিয়ক"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"তলৰ সোঁফালে নিয়ক"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 72242f9dcc52..5fab3d679b89 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> olduqda aktiv ediləcək"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> vaxtına qədər"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tünd Tema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC deaktiv edilib"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC aktiv edilib"</string> @@ -649,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Bu bildirişlər dəyişdirilə bilməz."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Bu bildiriş qrupunu burada konfiqurasiya etmək olmaz"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Proksi bildirişi"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Bu tətbiq kameradan istifadə edir."</string> <string name="appops_microphone" msgid="741508267659494555">"Bu tətbiq mikrofondan istifadə edir."</string> <string name="appops_overlay" msgid="6165912637560323464">"Bu tətbiqdə ekranda digər tətbiqlərin üzərində göstərilir."</string> @@ -924,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Yuxarıya sağa köçürün"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Aşağıya sola köçürün"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Aşağıya sağa köçürün"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 67a92d36ce81..421fc7608553 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -371,6 +371,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tamna tema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string> @@ -451,10 +453,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Ne prikazuj ponovo"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Obriši sve"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Upravljajte"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Diskretna obaveštenja"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Obrišite sva diskretna obaveštenja"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Obaveštenja su pauzirana režimom Ne uznemiravaj"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Započni odmah"</string> <string name="empty_shade_text" msgid="708135716272867002">"Nema obaveštenja"</string> @@ -654,6 +654,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Ova obaveštenja ne mogu da se menjaju."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Ova grupa obaveštenja ne može da se konfiguriše ovde"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Obaveštenje preko proksija"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Ova aplikacija koristi kameru."</string> <string name="appops_microphone" msgid="741508267659494555">"Ova aplikacija koristi mikrofon."</string> <string name="appops_overlay" msgid="6165912637560323464">"Ova aplikacija se prikazuje preko drugih aplikacija na ekranu."</string> @@ -931,4 +935,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Premesti gore desno"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Premesti dole levo"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Premesti dole desno"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 22bdd271a3c2..0da78b693b6e 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -375,6 +375,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Уключыць у <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Да <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Цёмная тэма"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC адключаны"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC уключаны"</string> @@ -456,10 +458,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Не паказваць зноў"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Ачысціць усё"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Кіраваць"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Апавяшчэнні ў ціхім рэжыме"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Выдаліць усе апавяшчэнні ў ціхім рэжыме"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Паказ апавяшчэнняў прыпынены ў рэжыме \"Не турбаваць\""</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Пачаць зараз"</string> <string name="empty_shade_text" msgid="708135716272867002">"Апавяшчэнняў няма"</string> @@ -539,7 +539,7 @@ <string name="screen_pinning_title" msgid="3273740381976175811">"Экран замацаваны"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, краніце і ўтрымлівайце кнопкі \"Назад\" і \"Агляд\"."</string> <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, націсніце і ўтрымлівайце кнопкі \"Назад\" і \"Галоўны экран\"."</string> - <string name="screen_pinning_description_gestural" msgid="1191513974909607884">"Будзе паказвацца, пакуль не адмацуеце Каб адмацаваць, прагартайце, утрымліваючы палец на экране"</string> + <string name="screen_pinning_description_gestural" msgid="1191513974909607884">"Будзе паказвацца, пакуль не адмацуеце Каб адмацаваць, прагартайце ўверх, утрымліваючы палец на экране"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, краніце і ўтрымлівайце кнопку \"Агляд\"."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, націсніце і ўтрымлівайце кнопку \"Галоўны экран\"."</string> <string name="screen_pinning_toast" msgid="2266705122951934150">"Каб адмацаваць гэты экран, націсніце і ўтрымлівайце кнопкі \"Назад\" і \"Агляд\""</string> @@ -659,6 +659,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Гэтыя апавяшчэнні нельга змяніць."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Тут канфігурыраваць гэту групу апавяшчэнняў забаронена"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Праксіраванае апавяшчэнне"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Гэта праграма выкарыстоўвае камеру."</string> <string name="appops_microphone" msgid="741508267659494555">"Гэта праграма выкарыстоўвае мікрафон."</string> <string name="appops_overlay" msgid="6165912637560323464">"Гэта праграма паказваецца на экране паверх іншых праграм."</string> @@ -938,4 +942,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Перамясціце правей і вышэй"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Перамясціць лявей і ніжэй"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Перамясціць правей і ніжэй"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index b905cbc50f0d..40148d4a8bea 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ще се включи в <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Тъмна тема"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"КБП"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"КБП е деактивирана"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"КБП е активирана"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Да не се показва отново"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Изчистване на всички"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Управление"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Ненатрапчиви известия"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Изчистване на всички ненатрапчиви известия"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Известията са поставени на пауза от режима „Не безпокойте“"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Стартиране сега"</string> <string name="empty_shade_text" msgid="708135716272867002">"Няма известия"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Тези известия не могат да бъдат променяни."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Тази група от известия не може да бъде конфигурирана тук"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Известие, получено чрез делегиране"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Това приложение използва камерата."</string> <string name="appops_microphone" msgid="741508267659494555">"Това приложение използва микрофона."</string> <string name="appops_overlay" msgid="6165912637560323464">"Това приложение се показва върху други приложения на екрана."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Преместване горе вдясно"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Преместване долу вляво"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Преместване долу вдясно"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index e2f42708797b..56bb9e7b6fd5 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> এ চালু হবে"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> পর্যন্ত"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"গাঢ় থিম"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC অক্ষম করা আছে"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC সক্ষম করা আছে"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"আর দেখাবেন না"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"সবকিছু সাফ করুন"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"পরিচালনা করুন"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"সাইলেন্ট মোডের বিজ্ঞপ্তি"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"সাইলেন্ট মোডের বিজ্ঞপ্তি মুছুন"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"\'বিরক্ত করবেন না\' দিয়ে বিজ্ঞপ্তি পজ করা হয়েছে"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"এখন শুরু করুন"</string> <string name="empty_shade_text" msgid="708135716272867002">"কোনো বিজ্ঞপ্তি নেই"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"এই সমস্ত বিজ্ঞপ্তিকে এখানে কনফিগার করা যাবে না"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"প্রক্সি করা বিজ্ঞপ্তি"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"এই অ্যাপটি ক্যামেরা ব্যবহার করছে।"</string> <string name="appops_microphone" msgid="741508267659494555">"এই অ্যাপটি মাইক্রোফোন ব্যবহার করছে।"</string> <string name="appops_overlay" msgid="6165912637560323464">"এই অ্যাপটি স্ক্রিনে অন্যান্য অ্যাপের উপরে দেখানো হচ্ছে।"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"উপরে ডানদিকে সরান"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"নিচে বাঁদিকে সরান"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"নিচে ডান দিকে সরান"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index c26e2a3c9f13..443e64766798 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -371,6 +371,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tamna tema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string> @@ -451,8 +453,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Ne prikazuj opet"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Očisti sve"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Upravljaj"</string> - <string name="notification_section_header_gentle" msgid="8356064473678167305">"Neupadljive obavijesti"</string> - <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Izbrišite sve neupadljive obavijesti"</string> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Diskretna obavještenja"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Obriši sva diskretna obavještenja"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Obavještenja su pauzirana načinom rada Ne ometaj"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Započni odmah"</string> <string name="empty_shade_text" msgid="708135716272867002">"Nema obavještenja"</string> @@ -654,6 +656,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Ta obavještenja se ne mogu izmijeniti."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Ovdje nije moguće konfigurirati ovu grupu obavještenja"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Obavještenje preko proksi servera"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Ova aplikacija koristi kameru."</string> <string name="appops_microphone" msgid="741508267659494555">"Ova aplikacija koristi mikrofon."</string> <string name="appops_overlay" msgid="6165912637560323464">"Ova aplikacija prekriva druge aplikacije na ekranu."</string> @@ -931,4 +937,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Pomjerite gore desno"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Pomjeri dolje lijevo"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Pomjerite dolje desno"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 2056212cd97e..a4f6fb4d1996 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"S\'activarà a les <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Fins a les <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema fosc"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"L\'NFC està desactivada"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"L\'NFC està activada"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"No ho tornis a mostrar"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Esborra-ho tot"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Gestió"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Notificacions discretes"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Esborra totes les notificacions discretes"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notificacions pausades pel mode No molestis"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Comença ara"</string> <string name="empty_shade_text" msgid="708135716272867002">"Cap notificació"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Aquestes notificacions no es poden modificar."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Aquest grup de notificacions no es pot configurar aquí"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Notificació mitjançant aplicació intermediària"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Aquesta aplicació utilitza la càmera."</string> <string name="appops_microphone" msgid="741508267659494555">"Aquesta aplicació utilitza el micròfon."</string> <string name="appops_overlay" msgid="6165912637560323464">"Aquesta aplicació es mostra sobre altres aplicacions a la pantalla."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Mou a dalt a la dreta"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mou a baix a l\'esquerra"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mou a baix a la dreta"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 5976839224f1..9b2684fdbc9c 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -39,7 +39,7 @@ <string name="battery_saver_start_action" msgid="8187820911065797519">"Zapnout spořič baterie"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nastavení"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Autom. otočení obrazovky"</string> + <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Automatické otočení obrazovky"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ZTLUM."</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string> <string name="status_bar_settings_notifications" msgid="397146176280905137">"Oznámení"</string> @@ -373,6 +373,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Zapnout v <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tmavé téma"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je vypnuto"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je zapnuto"</string> @@ -454,10 +456,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Tuto zprávu příště nezobrazovat"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Smazat vše"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Spravovat"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Vlídná oznámení"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Vymazat všechna vlídná oznámení"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Oznámení jsou pozastavena režimem Nerušit"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Spustit"</string> <string name="empty_shade_text" msgid="708135716272867002">"Žádná oznámení"</string> @@ -657,6 +657,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Tato oznámení nelze upravit."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Tuto skupinu oznámení tady nelze nakonfigurovat"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Zprostředkované oznámení"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Tato aplikace využívá fotoaparát."</string> <string name="appops_microphone" msgid="741508267659494555">"Tato aplikace využívá mikrofon."</string> <string name="appops_overlay" msgid="6165912637560323464">"Tato aplikace se zobrazuje přes ostatní aplikace na obrazovce."</string> @@ -936,4 +940,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Přesunout vpravo nahoru"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Přesunout vlevo dolů"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Přesunout vpravo dolů"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 7bb720fcc735..61b9fff10542 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Tænd kl. <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Indtil <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Mørkt tema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC er deaktiveret"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC er aktiveret"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Vis ikke igen"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Ryd alt"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Administrer"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Diskrete underretninger"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Ryd alle diskrete notifikationer"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notifikationer er sat på pause af Forstyr ikke"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Start nu"</string> <string name="empty_shade_text" msgid="708135716272867002">"Ingen notifikationer"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Disse notifikationer kan ikke redigeres."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Du kan ikke konfigurere denne gruppe notifikationer her"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Proxyforbundet notifikation"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Denne app anvender kameraet."</string> <string name="appops_microphone" msgid="741508267659494555">"Denne app anvender mikrofonen."</string> <string name="appops_overlay" msgid="6165912637560323464">"Denne app vises over andre apps på din skærm."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Flyt op til højre"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Flyt ned til venstre"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Flyt ned til højre"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 7632c1848728..604a5760ed93 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -373,6 +373,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"An um <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Bis <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dunkles Design"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ist deaktiviert"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ist aktiviert"</string> @@ -452,10 +454,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Nicht mehr anzeigen"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Alle löschen"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Verwalten"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Stumme Benachrichtigungen"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Alle stummen Benachrichtigungen löschen"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Benachrichtigungen durch \"Bitte nicht stören\" pausiert"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Jetzt starten"</string> <string name="empty_shade_text" msgid="708135716272867002">"Keine Benachrichtigungen"</string> @@ -655,6 +655,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Diese Benachrichtigungen können nicht geändert werden."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Die Benachrichtigungsgruppe kann hier nicht konfiguriert werden"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Weitergeleitete Benachrichtigung"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Diese App verwendet die Kamera."</string> <string name="appops_microphone" msgid="741508267659494555">"Diese App verwendet das Mikrofon."</string> <string name="appops_overlay" msgid="6165912637560323464">"Diese App wird über anderen Apps auf dem Bildschirm angezeigt."</string> @@ -930,4 +934,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Nach rechts oben verschieben"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Nach unten links verschieben"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Nach unten rechts verschieben"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 308cd32c508e..130934fc3c86 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ενεργοποίηση στις <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Έως τις <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Σκούρο θέμα"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Το NFC είναι απενεργοποιημένο"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Το NFC είναι ενεργοποιημένο"</string> @@ -649,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Δεν είναι δυνατή η διαμόρφωση αυτής της ομάδας ειδοποιήσεων εδώ"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Ειδοποίηση μέσω διακομιστή μεσολάβησης"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Αυτή η εφαρμογή χρησιμοποιεί την κάμερα."</string> <string name="appops_microphone" msgid="741508267659494555">"Αυτή η εφαρμογή χρησιμοποιεί το μικρόφωνο."</string> <string name="appops_overlay" msgid="6165912637560323464">"Αυτή η εφαρμογή εμφανίζεται πάνω σε άλλες εφαρμογές στην οθόνη σας."</string> @@ -924,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Μετακίνηση επάνω δεξιά"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Μετακίνηση κάτω αριστερά"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Μετακίνηση κάτω δεξιά"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 21c3bea81c6c..e047482b57f3 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dark Theme"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Manage"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Gentle notifications"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Clear all gentle notifications"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notifications paused by Do Not Disturb"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Start now"</string> <string name="empty_shade_text" msgid="708135716272867002">"No notifications"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"These notifications can\'t be modified."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"This group of notifications cannot be configured here"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Proxied notification"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string> <string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string> <string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Move top right"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Move bottom left"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Move bottom right"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index b8898cf6adb9..a55615fa1137 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dark Theme"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Manage"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Gentle notifications"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Clear all gentle notifications"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notifications paused by Do Not Disturb"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Start now"</string> <string name="empty_shade_text" msgid="708135716272867002">"No notifications"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"These notifications can\'t be modified."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"This group of notifications cannot be configured here"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Proxied notification"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string> <string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string> <string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Move top right"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Move bottom left"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Move bottom right"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 21c3bea81c6c..e047482b57f3 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dark Theme"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Manage"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Gentle notifications"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Clear all gentle notifications"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notifications paused by Do Not Disturb"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Start now"</string> <string name="empty_shade_text" msgid="708135716272867002">"No notifications"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"These notifications can\'t be modified."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"This group of notifications cannot be configured here"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Proxied notification"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string> <string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string> <string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Move top right"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Move bottom left"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Move bottom right"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 21c3bea81c6c..e047482b57f3 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dark Theme"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Don\'t show again"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Clear all"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Manage"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Gentle notifications"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Clear all gentle notifications"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notifications paused by Do Not Disturb"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Start now"</string> <string name="empty_shade_text" msgid="708135716272867002">"No notifications"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"These notifications can\'t be modified."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"This group of notifications cannot be configured here"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Proxied notification"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string> <string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string> <string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Move top right"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Move bottom left"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Move bottom right"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 5cdb4aedaac8..7aa44bf4d31d 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -369,6 +369,7 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"On at <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Until <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dark Theme"</string> + <string name="quick_settings_ui_mode_night_label_battery_saver" msgid="3496696903886673256">"Dark Theme\nBattery saver"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string> @@ -649,6 +650,8 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"These notifications can\'t be modified."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"This group of notifications cannot be configured here"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Proxied notification"</string> + <string name="notification_channel_dialog_title" msgid="5745335243729167866">"All <xliff:g id="APP_NAME">%1$s</xliff:g> notifications"</string> + <string name="see_more_title" msgid="5358726697042112726">"See more"</string> <string name="appops_camera" msgid="8100147441602585776">"This app is using the camera."</string> <string name="appops_microphone" msgid="741508267659494555">"This app is using the microphone."</string> <string name="appops_overlay" msgid="6165912637560323464">"This app is displaying over other apps on your screen."</string> @@ -924,4 +927,5 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Move top right"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Move bottom left"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Move bottom right"</string> + <string name="bubble_dismiss_text" msgid="8028337712674081668">"Dismiss"</string> </resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 91d3ed45117e..95fcbe5e60fd 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"A la(s) <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hasta <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema oscuro"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"La tecnología NFC está inhabilitada"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"La tecnología NFC está habilitada"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"No volver a mostrar"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Borrar todo"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Administrar"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Notificaciones discretas"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Borrar todas las notificaciones discretas"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notificaciones pausadas por el modo \"No interrumpir\""</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Comenzar ahora"</string> <string name="empty_shade_text" msgid="708135716272867002">"No hay notificaciones"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"No se pueden modificar estas notificaciones."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"No se puede configurar aquí este grupo de notificaciones"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Notificación almacenada en proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Esta app está usando la cámara."</string> <string name="appops_microphone" msgid="741508267659494555">"Esta app está usando el micrófono."</string> <string name="appops_overlay" msgid="6165912637560323464">"Esta app se muestra sobre otras apps en la pantalla."</string> @@ -716,7 +720,7 @@ <string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"Recientes"</string> <string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Atrás"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notificaciones"</string> - <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Combinación de teclas"</string> + <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Ver combinaciones de teclas"</string> <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Cambiar diseño del teclado"</string> <string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplicaciones"</string> <string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Asistencia"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Ubicar arriba a la derecha"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Ubicar abajo a la izquierda"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Ubicar abajo a la derecha"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index cae53bd1723d..a55b4d6265f1 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Hora: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hasta las <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema oscuro"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"La conexión NFC está inhabilitada"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"La conexión NFC está habilitada"</string> @@ -418,7 +420,7 @@ <string name="guest_new_guest" msgid="600537543078847803">"Añadir invitado"</string> <string name="guest_exit_guest" msgid="7187359342030096885">"Quitar invitado"</string> <string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"¿Quitar invitado?"</string> - <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"Se eliminarán las aplicaciones y los datos de esta sesión."</string> + <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"Se eliminarán todas las aplicaciones y datos de esta sesión."</string> <string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"Quitar"</string> <string name="guest_wipe_session_title" msgid="6419439912885956132">"Hola de nuevo, invitado"</string> <string name="guest_wipe_session_message" msgid="8476238178270112811">"¿Quieres continuar con la sesión?"</string> @@ -438,7 +440,7 @@ <item quantity="one">Solo se puede crear un usuario.</item> </plurals> <string name="user_remove_user_title" msgid="4681256956076895559">"¿Quitar usuario?"</string> - <string name="user_remove_user_message" msgid="1453218013959498039">"Se eliminarán todas las aplicaciones y todos los datos de este usuario."</string> + <string name="user_remove_user_message" msgid="1453218013959498039">"Se eliminarán todas las aplicaciones y datos de este usuario."</string> <string name="user_remove_user_remove" msgid="7479275741742178297">"Quitar"</string> <string name="battery_saver_notification_title" msgid="8614079794522291840">"Ahorro de batería activado"</string> <string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce el rendimiento y los datos en segundo plano"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"No volver a mostrar"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Borrar todo"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Gestionar"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Notificaciones discretas"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Borrar todas las notificaciones discretas"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notificaciones pausadas por el modo No molestar"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Iniciar ahora"</string> <string name="empty_shade_text" msgid="708135716272867002">"No hay notificaciones"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Estas notificaciones no se pueden modificar."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Este grupo de notificaciones no se puede configurar aquí"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Notificación mediante proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Esta aplicación está usando la cámara."</string> <string name="appops_microphone" msgid="741508267659494555">"Esta aplicación está usando el micrófono."</string> <string name="appops_overlay" msgid="6165912637560323464">"Esta aplicación se está mostrando sobre otras aplicaciones en tu pantalla."</string> @@ -716,7 +720,7 @@ <string name="keyboard_shortcut_group_system_recents" msgid="3154851905021926744">"Recientes"</string> <string name="keyboard_shortcut_group_system_back" msgid="2207004531216446378">"Atrás"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="8366964080041773224">"Notificaciones"</string> - <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Combinaciones de teclas"</string> + <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4892255911160332762">"Ver combinaciones de teclas"</string> <string name="keyboard_shortcut_group_system_switch_input" msgid="8413348767825486492">"Cambiar diseño del teclado"</string> <string name="keyboard_shortcut_group_applications" msgid="9129465955073449206">"Aplicaciones"</string> <string name="keyboard_shortcut_group_applications_assist" msgid="9095441910537146013">"Asistencia"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Mover arriba a la derecha"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mover abajo a la izquierda."</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mover abajo a la derecha"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 7c68cce3c516..b03fb6b738ac 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Sisselülitam. kell <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Kuni <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tume teema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC on keelatud"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC on lubatud"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Ära kuva uuesti"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Tühjenda kõik"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Haldamine"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Leebed märguanded"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Kustuta kõik leebed märguanded"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Režiim Mitte segada peatas märguanded"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Alusta kohe"</string> <string name="empty_shade_text" msgid="708135716272867002">"Märguandeid pole"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Neid märguandeid ei saa muuta."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Seda märguannete rühma ei saa siin seadistada"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Puhvriga märguanne"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"See rakendus kasutab kaamerat."</string> <string name="appops_microphone" msgid="741508267659494555">"See rakendus kasutab mikrofoni."</string> <string name="appops_overlay" msgid="6165912637560323464">"See rakendus kuvatakse teie ekraanil muude rakenduste peal."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Teisalda üles paremale"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Teisalda alla vasakule"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Teisalda alla paremale"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 1dac8adf80d9..33ab838eb997 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aktibatze-ordua: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> arte"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Gai iluna"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Desgaituta dago NFC"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Gaituta dago NFC"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Ez erakutsi berriro"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Garbitu guztiak"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Kudeatu"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Soinurik gabeko jakinarazpenak"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Garbitu soinurik gabeko jakinarazpen guztiak"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"\"Ez molestatu\" moduak pausatu egin ditu jakinarazpenak"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Hasi"</string> <string name="empty_shade_text" msgid="708135716272867002">"Ez dago jakinarazpenik"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Jakinarazpen horiek ezin dira aldatu."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Jakinarazpen talde hau ezin da konfiguratu hemen"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Proxy bidezko jakinarazpena"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Kamera erabiltzen ari da aplikazioa."</string> <string name="appops_microphone" msgid="741508267659494555">"Mikrofonoa erabiltzen ari da aplikazioa."</string> <string name="appops_overlay" msgid="6165912637560323464">"Pantailako beste aplikazioen gainean agertzen da aplikazioa."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Eraman goialdera, eskuinetara"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Eraman behealdera, ezkerretara"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Eraman behealdera, eskuinetara"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index a98054fab063..70fab45afab3 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ساعت <xliff:g id="TIME">%s</xliff:g> روشن میشود"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"تا <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"طرح زمینه تیره"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC غیرفعال است"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC فعال است"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"دوباره نشان داده نشود"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"پاک کردن همه موارد"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"مدیریت"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"اعلانهای ملایم"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"پاک کردن همه اعلانهای ملایم"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"اعلانها توسط «مزاحم نشوید» موقتاً متوقف شدند"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"اکنون شروع شود"</string> <string name="empty_shade_text" msgid="708135716272867002">"اعلانی موجود نیست"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"این اعلانها قابل اصلاح نیستند."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"نمیتوانید این گروه اعلانها را در اینجا پیکربندی کنید"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"اعلانهای دارای پراکسی"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"این برنامه از دوربین استفاده میکند."</string> <string name="appops_microphone" msgid="741508267659494555">"این برنامه از میکروفون استفاده میکند."</string> <string name="appops_overlay" msgid="6165912637560323464">"این برنامه روی برنامههای دیگر در صفحهنمایش نشان داده میشود."</string> @@ -814,7 +818,7 @@ <string name="accessibility_quick_settings_expand" msgid="2375165227880477530">"باز کردن تنظیمات سریع."</string> <string name="accessibility_quick_settings_collapse" msgid="1792625797142648105">"بستن تنظیمات سریع."</string> <string name="accessibility_quick_settings_alarm_set" msgid="1863000242431528676">"تنظیم زنگ ساعت."</string> - <string name="accessibility_quick_settings_user" msgid="1567445362870421770">"با <xliff:g id="ID_1">%s</xliff:g> به سیستم وارد شدهاید"</string> + <string name="accessibility_quick_settings_user" msgid="1567445362870421770">"بهعنوان <xliff:g id="ID_1">%s</xliff:g> به سیستم وارد شدهاید"</string> <string name="data_connection_no_internet" msgid="4503302451650972989">"عدم اتصال به اینترنت"</string> <string name="accessibility_quick_settings_open_details" msgid="4230931801728005194">"باز کردن جزئیات."</string> <string name="accessibility_quick_settings_not_available" msgid="4190068184294019846">"بهدلیل <xliff:g id="REASON">%s</xliff:g> دردسترس نیست"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"انتقال به بالا سمت چپ"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"انتقال به پایین سمت راست"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"انتقال به پایین سمت چپ"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 84f05b75c2d5..5e9ae3047dbb 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Käyttöön klo <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> saakka"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tumma teema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC on poistettu käytöstä"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC on käytössä"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Älä näytä uudelleen"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Poista kaikki"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Muuta asetuksia"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Varovaiset ilmoitukset"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Tyhjennä kaikki varovaiset ilmoitukset"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Älä häiritse ‑tila keskeytti ilmoitukset"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Aloita nyt"</string> <string name="empty_shade_text" msgid="708135716272867002">"Ei ilmoituksia"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Näitä ilmoituksia ei voi muokata"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Tätä ilmoitusryhmää ei voi määrittää tässä"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Välitetty ilmoitus"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Tämä sovellus käyttää kameraa."</string> <string name="appops_microphone" msgid="741508267659494555">"Tämä sovellus käyttää mikrofonia."</string> <string name="appops_overlay" msgid="6165912637560323464">"Tämä sovellus näkyy näytöllä muiden sovellusten päällä."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Siirrä oikeaan yläreunaan"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Siirrä vasempaan alareunaan"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Siirrä oikeaan alareunaan"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 245ee403d24f..6d5777ae7f39 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Actif à <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Thème sombre"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC désactivée"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC activée"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Ne plus afficher"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Tout effacer"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Gérer"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Notifications discrètes"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Effacer toutes les notifications discrètes"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Les notifications sont suspendues par le mode Ne pas déranger"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Commencer"</string> <string name="empty_shade_text" msgid="708135716272867002">"Aucune notification"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Ces notifications ne peuvent pas être modifiées"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Ce groupe de notifications ne peut pas être configuré ici"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Notification par mandataire"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Cette application utilise l\'appareil photo."</string> <string name="appops_microphone" msgid="741508267659494555">"Cette application utilise le microphone."</string> <string name="appops_overlay" msgid="6165912637560323464">"Cette application superpose du contenu par-dessus d\'autres applications à l\'écran."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Déplacer dans coin sup. droit"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Déplacer dans coin inf. gauche"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Déplacer dans coin inf. droit"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 6ccc27b08500..5d1e86327990 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"À partir de <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Thème foncé"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"La technologie NFC est désactivée"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"La technologie NFC est activée"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Ne plus afficher"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Tout effacer"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Gérer"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Notifications discrètes"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Effacer toutes les notifications discrètes"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notifications suspendues par le mode Ne pas déranger"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Commencer"</string> <string name="empty_shade_text" msgid="708135716272867002">"Aucune notification"</string> @@ -643,7 +643,7 @@ <string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer d\'afficher les notifications de cette application ?"</string> <string name="notification_silence_title" msgid="7352089096356977930">"Discret"</string> <string name="notification_alert_title" msgid="3966526305405016221">"Prioritaire"</string> - <string name="notification_channel_summary_low" msgid="1065819618107531284">"Vous aide à rester concentré en ne s\'affichant que dans le volet des notifications. Toujours silencieux."</string> + <string name="notification_channel_summary_low" msgid="1065819618107531284">"Vous aide à vous concentrer en affichant les notifications seulement dans le volet déroulant. Toujours silencieux."</string> <string name="notification_channel_summary_low_status" msgid="2702170424808743755">"S\'affiche sous les notifications prioritaires. Toujours silencieux."</string> <string name="notification_channel_summary_low_lock" msgid="7966605244472624458">"S\'affiche sous les notifications prioritaires. Toujours silencieux."</string> <string name="notification_channel_summary_low_status_lock" msgid="7012562768950012739">"S\'affiche sous les notifications prioritaires. Toujours silencieux."</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Impossible de modifier ces notifications."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Vous ne pouvez pas configurer ce groupe de notifications ici"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Notification de proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Cette application utilise la caméra."</string> <string name="appops_microphone" msgid="741508267659494555">"Cette application utilise le micro."</string> <string name="appops_overlay" msgid="6165912637560323464">"Cette application se superpose aux autres applications sur l\'écran."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Déplacer en haut à droite"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Déplacer en bas à gauche"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Déplacer en bas à droite"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index c9386980d923..f6f87e0ec7ac 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Desde: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Ata: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema escuro"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"A opción NFC está desactivada"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"A opción NFC está activada"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Non mostrar outra vez"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Eliminar todas"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Xestionar"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Notificacións discretas"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Borra todas as notificacións discretas"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"O modo Non molestar puxo en pausa as notificacións"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Iniciar agora"</string> <string name="empty_shade_text" msgid="708135716272867002">"Non hai notificacións"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Estas notificacións non se poden modificar."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Aquí non se pode configurar este grupo de notificacións"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Notificación mediante proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Esta aplicación está utilizando a cámara."</string> <string name="appops_microphone" msgid="741508267659494555">"Esta aplicación está utilizando o micrófono."</string> <string name="appops_overlay" msgid="6165912637560323464">"Esta aplicación móstrase sobre outras aplicacións da pantalla."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Mover á parte superior dereita"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mover á parte infer. esquerda"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mover á parte inferior dereita"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 3f36a3013d43..e5a742404929 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> વાગ્યે"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> સુધી"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ઘેરી થીમ"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC અક્ષમ કરેલ છે"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC સક્ષમ કરેલ છે"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"ફરીથી બતાવશો નહીં"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"બધુ સાફ કરો"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"મેનેજ કરો"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"સામાન્ય નોટિફિકેશન"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"બધા સામાન્ય નોટિફિકેશન સાફ કરો"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"ખલેલ પાડશો નહીં દ્વારા થોભાવેલ નોટિફિકેશન"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"હવે પ્રારંભ કરો"</string> <string name="empty_shade_text" msgid="708135716272867002">"કોઈ સૂચનાઓ નથી"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"નોટિફિકેશનના આ ગ્રૂપની ગોઠવણી અહીં કરી શકાશે નહીં"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"પ્રૉક્સી નોટિફિકેશન"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"આ ઍપ કૅમેરાનો ઉપયોગ કરી રહી છે."</string> <string name="appops_microphone" msgid="741508267659494555">"આ ઍપ માઇક્રોફોનનો ઉપયોગ કરી રહી છે."</string> <string name="appops_overlay" msgid="6165912637560323464">"આ ઍપ તમારી સ્ક્રીન પરની અન્ય ઍપની ઉપર પ્રદર્શિત થઈ રહી છે."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"ઉપર જમણે ખસેડો"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"નીચે ડાબે ખસેડો"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"નીચે જમણે ખસેડો"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 4dca269c5176..17c26810a05f 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> पर चालू की जाएगी"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> तक"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"गहरे रंग वाली थीम"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"एनएफ़सी"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC बंद है"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC चालू है"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"फिर से न दिखाएं"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"सभी को हटाएं"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"प्रबंधित करें"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"बिना आवाज़ वाली सूचनाएं"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"बिना आवाज़ वाली सभी सूचनाएं हटाएं"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"\'परेशान न करें\' सुविधा के ज़रिए कुछ समय के लिए सूचनाएं दिखाना रोक दिया गया है"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"अब शुरू करें"</string> <string name="empty_shade_text" msgid="708135716272867002">"कोई सूचना नहीं मिली"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ये सूचनाएं नहीं बदली जा सकती हैं."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"सूचनाओं के इस समूह को यहां कॉन्फ़िगर नहीं किया जा सकता"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"प्रॉक्सी सूचना"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"यह ऐप्लिकेशन कैमरे का इस्तेमाल कर रहा है."</string> <string name="appops_microphone" msgid="741508267659494555">"यह ऐप्लिकेशन माइक्रोफ़ोन का इस्तेमाल कर रहा है."</string> <string name="appops_overlay" msgid="6165912637560323464">"यह ऐप्लिकेशन आपकी स्क्रीन पर इस्तेमाल हो रहे दूसरे ऐप्लिकेशन के ऊपर दिखाया जा रहा है."</string> @@ -915,8 +919,7 @@ <string name="bubbles_deep_link_button_description" msgid="8895837143057564517">"<xliff:g id="APP_NAME">%1$s</xliff:g> खोलें"</string> <string name="bubbles_settings_button_description" msgid="2970630476657287189">"<xliff:g id="APP_NAME">%1$s</xliff:g> बबल की सेटिंग"</string> <string name="bubbles_prompt" msgid="8807968030159469710">"<xliff:g id="APP_NAME">%1$s</xliff:g> से बबल की अनुमति दें?"</string> - <!-- no translation found for manage_bubbles_text (7027739766859191408) --> - <skip /> + <string name="manage_bubbles_text" msgid="7027739766859191408">"प्रबंधित करें"</string> <string name="no_bubbles" msgid="337101288173078247">"अनुमति न दें"</string> <string name="yes_bubbles" msgid="668809525728633841">"अनुमति दें"</string> <string name="ask_me_later_bubbles" msgid="2147688438402939029">"मुझसे बाद में पूछें"</string> @@ -927,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"सबसे ऊपर दाईं ओर ले जाएं"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"बाईं ओर सबसे नीचे ले जाएं"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"सबसे नीचे दाईं ओर ले जाएं"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index c7b68d9f2146..cea05292fa71 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -371,6 +371,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tamna tema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string> @@ -652,6 +654,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Te se obavijesti ne mogu izmijeniti."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Ta se grupa obavijesti ne može konfigurirati ovdje"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Obavijest poslana putem proxyja"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Ova aplikacija upotrebljava kameru."</string> <string name="appops_microphone" msgid="741508267659494555">"Ova aplikacija upotrebljava mikrofon."</string> <string name="appops_overlay" msgid="6165912637560323464">"Ova se aplikacija prikazuje preko drugih aplikacija na zaslonu."</string> @@ -929,4 +935,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Premjesti u gornji desni kut"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Premjesti u donji lijevi kut"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Premjestite u donji desni kut"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 7b97961287d3..cc0c07d283a3 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Bekapcsolás: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Eddig: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Sötét téma"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Az NFC ki van kapcsolva"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Az NFC be van kapcsolva"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Ne jelenjen meg többé"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Az összes törlése"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Kezelés"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Diszkrét értesítések"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Az összes diszkrét értesítés törlése"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Ne zavarjanak funkcióval szüneteltetett értesítések"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Indítás most"</string> <string name="empty_shade_text" msgid="708135716272867002">"Nincs értesítés"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Ezeket az értesítéseket nem lehet módosítani."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Az értesítések jelen csoportját itt nem lehet beállítani"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Továbbított értesítés"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Ez az alkalmazás használja a kamerát."</string> <string name="appops_microphone" msgid="741508267659494555">"Ez az alkalmazás használja a mikrofont."</string> <string name="appops_overlay" msgid="6165912637560323464">"Ez az alkalmazás a képernyőn lévő egyéb alkalmazások előtt jelenik meg."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Áthelyezés fel és jobbra"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Áthelyezés le és balra"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Áthelyezés le és jobbra"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 1cb5a7bb8071..c6faea52ae11 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -292,7 +292,7 @@ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Լրացուցիչ կարգավորումները բացելու համար հպեք և պահեք պատկերակները"</string> <string name="quick_settings_dnd_label" msgid="7112342227663678739">"Չանհանգստացնել"</string> - <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Միայն կարևոր ծանուցումների դեպքում"</string> + <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Միայն կարևոր ծանուցումներ"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Միայն զարթուցիչ"</string> <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"Կատարյալ լռություն"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Կմիացվի ժամը <xliff:g id="TIME">%s</xliff:g>-ին"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Մինչև <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Մուգ թեմա"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC-ն անջատված է"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC-ն միացված է"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Այլևս ցույց չտալ"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Մաքրել բոլորը"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Կառավարել"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Չհոգնեցնող ծանուցումներ"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Ջնջել բոլոր չհոգնեցնող ծանուցումները"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Ծանուցումները չեն ցուցադրվի «Չանհանգստացնել» ռեժիմում"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Սկսել հիմա"</string> <string name="empty_shade_text" msgid="708135716272867002">"Ծանուցումներ չկան"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Այս ծանուցումները չեն կարող փոփոխվել:"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Ծանուցումների տվյալ խումբը հնարավոր չէ կարգավորել այստեղ"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Ծանուցումն ուղարկվել է պրոքսի սերվերի միջոցով"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Այս հավելվածն օգտագործում է տեսախցիկը:"</string> <string name="appops_microphone" msgid="741508267659494555">"Այս հավելվածն օգտագործում է խոսափողը:"</string> <string name="appops_overlay" msgid="6165912637560323464">"Այս հավելվածը ցուցադրվում է մյուս հավելվածների վրայից:"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Տեղափոխել վերև՝ աջ"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Տեղափոխել ներքև՝ ձախ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Տեղափոխել ներքև՝ աջ"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index cb1769b96b42..ac4d2c76bcf9 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aktif pada <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hingga <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema Gelap"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC dinonaktifkan"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC diaktifkan"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Jangan tampilkan lagi"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Hapus semua"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Kelola"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Notifikasi senyap"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Hapus semua notifikasi senyap"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notifikasi dijeda oleh mode Jangan Ganggu"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Mulai sekarang"</string> <string name="empty_shade_text" msgid="708135716272867002">"Tidak ada notifikasi"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Notifikasi ini tidak dapat diubah."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Grup notifikasi ini tidak dapat dikonfigurasi di sini"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Notifikasi proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Aplikasi ini sedang menggunakan kamera."</string> <string name="appops_microphone" msgid="741508267659494555">"Aplikasi ini sedang menggunakan mikrofon."</string> <string name="appops_overlay" msgid="6165912637560323464">"Aplikasi ini ditampilkan di atas aplikasi lain di layar."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Pindahkan ke kanan atas"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Pindahkan ke kiri bawah"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Pindahkan ke kanan bawah"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 31f6546f12ff..88b091aa048f 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Kveikt klukkan <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Til klukkan <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Dökkt þema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Slökkt á NFC"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Kveikt á NFC"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Ekki sýna þetta aftur"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Hreinsa allt"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Stjórna"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Lágstemmdar tilkynningar"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Hreinsa allar lágstemmdar tilkynningar"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Hlé gert á tilkynningum þar sem stillt er á „Ónáðið ekki“"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Byrja núna"</string> <string name="empty_shade_text" msgid="708135716272867002">"Engar tilkynningar"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Ekki er hægt að breyta þessum tilkynningum."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Ekki er hægt að stilla þessar tilkynningar hér"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Staðgengilstilkynning"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Þetta forrit er að nota myndavélina."</string> <string name="appops_microphone" msgid="741508267659494555">"Þetta forrit er að nota hljóðnemann."</string> <string name="appops_overlay" msgid="6165912637560323464">"Þetta forrit er að birta efni yfir öðrum forritum á skjánum þínum."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Færa efst til hægri"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Færa neðst til vinstri"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Færðu neðst til hægri"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 85c2242f4c29..e1ff5dd73652 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Dalle <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Fino alle <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema scuro"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC non attiva"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC attiva"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Non mostrare più"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Cancella tutto"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Gestisci"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Notifiche senza avvisi"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Cancella tutte le notifiche senza avvisi"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notifiche messe in pausa in base alla modalità Non disturbare"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Avvia adesso"</string> <string name="empty_shade_text" msgid="708135716272867002">"Nessuna notifica"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Impossibile modificare queste notifiche."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Qui non è possibile configurare questo gruppo di notifiche"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Notifica inviata al proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Questa app sta utilizzando la fotocamera."</string> <string name="appops_microphone" msgid="741508267659494555">"Questa app sta utilizzando il microfono."</string> <string name="appops_overlay" msgid="6165912637560323464">"Questa app è visualizzata sopra altre app sullo schermo."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Sposta in alto a destra"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Sposta in basso a sinistra"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Sposta in basso a destra"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index c2469e634845..894a30ca9681 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -373,6 +373,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"מופעל בשעה <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"עד <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"עיצוב כהה"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC מושבת"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC מופעל"</string> @@ -657,6 +659,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"לא ניתן לשנות את ההתראות האלה."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"לא ניתן להגדיר כאן את קבוצת ההתראות הזו"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"התראה דרך שרת proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"האפליקציה הזו משתמשת במצלמה."</string> <string name="appops_microphone" msgid="741508267659494555">"האפליקציה הזו משתמשת במיקרופון."</string> <string name="appops_overlay" msgid="6165912637560323464">"האפליקציה הזו מוצגת מעל אפליקציות אחרות במסך."</string> @@ -936,4 +942,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"העברה לפינה הימנית העליונה"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"העברה לפינה השמאלית התחתונה"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"העברה לפינה הימנית התחתונה"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 327bfff56532..3f589289f35c 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> に ON"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> まで"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ダークテーマ"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC は無効です"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC は有効です"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"次回から表示しない"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"すべて消去"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"管理"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"控えめな通知"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"控えめな通知がすべて消去されます"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"サイレント モードにより通知は一時停止中です"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"今すぐ開始"</string> <string name="empty_shade_text" msgid="708135716272867002">"通知はありません"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"これらの通知は変更できません。"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"このグループの通知はここでは設定できません"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"代理通知"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"このアプリはカメラを使用しています。"</string> <string name="appops_microphone" msgid="741508267659494555">"このアプリはマイクを使用しています。"</string> <string name="appops_overlay" msgid="6165912637560323464">"このアプリは画面上で他のアプリの上に重ねて表示されます。"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"右上に移動"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"左下に移動"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"右下に移動"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index e21f8e7f54c8..9d45b3a0027c 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ჩაირთოს <xliff:g id="TIME">%s</xliff:g>-ზე"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g>-მდე"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"მუქი თემა"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC გათიშულია"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ჩართულია"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"აღარ მაჩვენო"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"ყველას გასუფთავება"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"მართვა"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"მსუბუქი შეტყობინებები"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"ყველა მსუბუქი შეტყობინების გასუფთავება"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"შეტყობინებები დაპაუზდა „არ შემაწუხოთ“ რეჟიმის მეშვეობით"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"დაწყება ახლავე"</string> <string name="empty_shade_text" msgid="708135716272867002">"შეტყობინებები არ არის."</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ამ შეტყობინებების შეცვლა შეუძლებელია."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"შეტყობინებების ამ ჯგუფის კონფიგურირება აქ შეუძლებელია"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"პროქსირებული შეტყობინება"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"ეს აპი იყენებს კამერას."</string> <string name="appops_microphone" msgid="741508267659494555">"ეს აპი იყენებს მიკროფონს."</string> <string name="appops_overlay" msgid="6165912637560323464">"ეს აპი თქვენს ეკრანზე ფარავს სხვა აპებს."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"გადაანაცვლეთ ზევით და მარჯვნივ"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ქვევით და მარცხნივ გადატანა"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"გადაანაცვ. ქვემოთ და მარჯვნივ"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index a9bcd217483c..e5322e80d13a 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Қосылу уақыты: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> дейін"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Қараңғы тақырып"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC өшірулі"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC қосулы"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Қайта көрсетпеу"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Барлығын тазалау"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Басқару"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Дыбыссыз хабарландырулар"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Дыбыссыз хабарландырулардың барлығын өшіру"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Хабарландырулар \"Мазаламау\" режимінде кідіртілді"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Қазір бастау"</string> <string name="empty_shade_text" msgid="708135716272867002">"Хабарландырулар жоқ"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Бұл хабарландыруларды өзгерту мүмкін емес."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Мұндай хабарландырулар бұл жерде конфигурацияланбайды."</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Прокси-сервер арқылы жіберілген хабарландыру"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Бұл қолданба камераны пайдалануда."</string> <string name="appops_microphone" msgid="741508267659494555">"Бұл қолданба микрофонды пайдалануда."</string> <string name="appops_overlay" msgid="6165912637560323464">"Бұл қолданба экранда басқа қолданбалардың үстінен көрсетіліп тұр."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Жоғары оң жаққа жылжыту"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Төменгі сол жаққа жылжыту"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Төменгі оң жаққа жылжыту"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 13f32b1ff63c..58cfbe44f3ed 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"បើកនៅម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"រហូតដល់ម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"រចនាប័ទ្មងងឹត"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"បានបិទ NFC"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"បានបើក NFC"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"កុំបង្ហាញម្ដងទៀត"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"សម្អាតទាំងអស់"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"គ្រប់គ្រង"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"ការជូនដំណឹងស្ងាត់ៗ"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"សម្អាតការជូនដំណឹងស្ងាត់ៗទាំងអស់"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"ការជូនដំណឹងបានផ្អាកដោយមុខងារកុំរំខាន"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"ចាប់ផ្ដើមឥឡូវ"</string> <string name="empty_shade_text" msgid="708135716272867002">"គ្មានការជូនដំណឹង"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"មិនអាចកែប្រែការជូនដំណឹងទាំងនេះបានទេ។"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"មិនអាចកំណត់រចនាសម្ព័ន្ធក្រុមការជូនដំណឹងនេះនៅទីនេះបានទេ"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"ការជូនដំណឹងជាប្រូកស៊ី"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"កម្មវិធីនេះកំពុងប្រើកាមេរ៉ា។"</string> <string name="appops_microphone" msgid="741508267659494555">"កម្មវិធីនេះកំពុងប្រើមីក្រូហ្វូន។"</string> <string name="appops_overlay" msgid="6165912637560323464">"កម្មវិធីនេះកំពុងបង្ហាញពីលើកម្មវិធីផ្សេងទៀតនៅលើអេក្រង់របស់អ្នក។"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"ផ្លាស់ទីទៅផ្នែកខាងលើខាងស្ដាំ"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ផ្លាស់ទីទៅផ្នែកខាងក្រោមខាងឆ្វេង"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ផ្លាស់ទីទៅផ្នែកខាងក្រោមខាងស្ដាំ"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 92403f15bcd8..9f02f785d62f 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> ಸಮಯದಲ್ಲಿ"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> ವರೆಗೂ"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ಡಾರ್ಕ್ ಥೀಮ್"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ಸಕ್ರಿಯಗೊಂಡಿದೆ"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"ಮತ್ತೊಮ್ಮೆ ತೋರಿಸದಿರು"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸು"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"ನಿರ್ವಹಿಸಿ"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"ಸಾಮಾನ್ಯ ಅಧಿಸೂಚನೆಗಳು"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"ಎಲ್ಲಾ ಸಾಮಾನ್ಯ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಎನ್ನುವ ಮೂಲಕ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"ಈಗ ಪ್ರಾರಂಭಿಸಿ"</string> <string name="empty_shade_text" msgid="708135716272867002">"ಯಾವುದೇ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"ಈ ಗುಂಪಿನ ಅಧಿಸೂಚನೆಗಳನ್ನು ಇಲ್ಲಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿರುವುದಿಲ್ಲ"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"ಪ್ರಾಕ್ಸಿ ಮಾಡಿದ ಅಧಿಸೂಚನೆಗಳು"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸುತ್ತಿದೆ."</string> <string name="appops_microphone" msgid="741508267659494555">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ಬಳಸುತ್ತಿದೆ."</string> <string name="appops_overlay" msgid="6165912637560323464">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಮೇಲಿಂದ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"ಬಲ ಮೇಲ್ಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ಸ್ಕ್ರೀನ್ನ ಎಡ ಕೆಳಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ಕೆಳಗಿನ ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 79ca42ebe4b1..e6d3283a07db 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>에"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g>까지"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"어두운 테마"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 사용 중지됨"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 사용 설정됨"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"다시 표시 안함"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"모두 지우기"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"관리"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"조용한 알림"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"조용한 알림 모두 삭제"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"방해 금지 모드로 일시중지된 알림"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"시작하기"</string> <string name="empty_shade_text" msgid="708135716272867002">"알림 없음"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"이 알림은 수정할 수 없습니다."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"이 알림 그룹은 여기에서 설정할 수 없습니다."</string> <string name="notification_delegate_header" msgid="2857691673814814270">"프록시를 통한 알림"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"앱이 카메라를 사용 중입니다."</string> <string name="appops_microphone" msgid="741508267659494555">"앱이 마이크를 사용 중입니다."</string> <string name="appops_overlay" msgid="6165912637560323464">"앱이 화면의 다른 앱 위에 표시되고 있습니다."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"오른쪽 상단으로 이동"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"왼쪽 하단으로 이동"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"오른쪽 하단으로 이동"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 2b589e202522..ff421cb829b9 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -292,7 +292,7 @@ <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Кошумча параметрлерди ачуу үчүн сүрөтчөлөрдү басып, кармап туруңуз"</string> <string name="quick_settings_dnd_label" msgid="7112342227663678739">"Тынчымды алба"</string> - <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Шашылыш эскертмелер гана"</string> + <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Шашылыш билдирүүлөр гана"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Ойготкуч гана"</string> <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"Тымтырс"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Саат <xliff:g id="TIME">%s</xliff:g> күйөт"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> чейин"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Түнкү режим"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC өчүрүлгөн"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC иштетилген"</string> @@ -399,7 +401,7 @@ <string name="camera_hint" msgid="7939688436797157483">"Сүрөтчөнү серпип камерага өтүңүз"</string> <string name="interruption_level_none_with_warning" msgid="5114872171614161084">"Толук жымжырттык талап кылынат. Бул экрандагыны окугучтарды да тынчтандырат."</string> <string name="interruption_level_none" msgid="6000083681244492992">"Тымтырс"</string> - <string name="interruption_level_priority" msgid="6426766465363855505">"Шашылыш эскертмелер гана"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Шашылыш билдирүүлөр гана"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Ойготкуч гана"</string> <string name="interruption_level_none_twoline" msgid="3957581548190765889">"Тым-\nтырс"</string> <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Артыкчылыктуу\nгана"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Экинчи көрсөтүлбөсүн"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Бардыгын тазалап салуу"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Башкаруу"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Маанилүү эмес билдирмелер"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Бардык маанилүү эмес билдирмелерди тазалоо"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"\"Тынчымды алба\" режиминде билдирмелер тындырылды"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Азыр баштоо"</string> <string name="empty_shade_text" msgid="708135716272867002">"Билдирме жок"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Бул билдирмелерди өзгөртүүгө болбойт."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Бул билдирмелердин тобун бул жерде конфигурациялоого болбойт"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Прокси билдирмеси"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Бул колдонмо камераны колдонууда."</string> <string name="appops_microphone" msgid="741508267659494555">"Бул колдонмо микрофонду колдонууда."</string> <string name="appops_overlay" msgid="6165912637560323464">"Бул колдонмо экрандагы башка терезелердин үстүнөн көрсөтүлүүдө."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Жогорку оң жакка жылдырыңыз"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Төмөнкү сол жакка жылдыруу"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Төмөнкү оң жакка жылдырыңыз"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 999472910b9e..5acef8df3a36 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ເປີດຕອນ <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"ຈົນກວ່າຈະຮອດ <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ຮູບແບບສີສັນມືດ"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string> @@ -649,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"ບໍ່ສາມາດຕັ້ງຄ່າກຸ່ມການແຈ້ງເຕືອນນີ້ຢູ່ບ່ອນນີ້ໄດ້"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"ການແຈ້ງເຕືອນແບບພຣັອກຊີ"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"ແອັບນີ້ກຳລັງໃຊ້ກ້ອງຢູ່."</string> <string name="appops_microphone" msgid="741508267659494555">"ແອັບນີ້ກຳລັງໃຊ້ໄມໂຄຣໂຟນຢູ່."</string> <string name="appops_overlay" msgid="6165912637560323464">"ແອັບນີ້ກຳລັງສະແດງຜົນບັງແອັບອື່ນຢູ່ໜ້າຈໍຂອງທ່ານ."</string> @@ -924,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"ຍ້າຍຂວາເທິງ"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ຍ້າຍຊ້າຍລຸ່ມ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ຍ້າຍຂວາລຸ່ມ"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index e8cda2a21c53..3bb42122d4ed 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -373,6 +373,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Iki <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tamsioji tema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"ALR"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"ALR išjungtas"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"ALR įjungtas"</string> @@ -454,10 +456,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Daugiau neberodyti"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Viską išvalyti"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Tvarkyti"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Taktiški pranešimai"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Išvalyti visus taktiškus pranešimus"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Pranešimai pristabdyti naudojant netrukdymo režimą"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Pradėti dabar"</string> <string name="empty_shade_text" msgid="708135716272867002">"Nėra įspėjimų"</string> @@ -537,8 +537,7 @@ <string name="screen_pinning_title" msgid="3273740381976175811">"Ekranas prisegtas"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Apžvalga“, kad atsegtumėte."</string> <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Pagrindinis ekranas“, kad atsegtumėte."</string> - <!-- no translation found for screen_pinning_description_gestural (1191513974909607884) --> - <skip /> + <string name="screen_pinning_description_gestural" msgid="1191513974909607884">"Tai bus rodoma, kol atsegsite. Perbraukite aukštyn ir palaikykite, kad atsegtumėte."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Apžvalga“, kad atsegtumėte."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Pagrindinis ekranas“, kad atsegtumėte."</string> <string name="screen_pinning_toast" msgid="2266705122951934150">"Kad atsegtumėte šį ekraną, palieskite ir palaikykite mygtukus „Atgal“ ir „Apžvalga“"</string> @@ -658,6 +657,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Šių pranešimų keisti negalima."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Šios grupės pranešimai čia nekonfigūruojami"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Per tarpinį serverį gautas pranešimas"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Ši programa naudoja fotoaparatą."</string> <string name="appops_microphone" msgid="741508267659494555">"Ši programa naudoja mikrofoną."</string> <string name="appops_overlay" msgid="6165912637560323464">"Ši programa rodoma ekrane virš kitų programų."</string> @@ -937,4 +940,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Perkelti į viršų dešinėje"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Perkelti į apačią kairėje"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Perkelti į apačią dešinėje"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index b2bcbb09a6e7..2b529ae71592 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -371,6 +371,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Plkst. <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Līdz <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tumšais motīvs"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ir atspējoti"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ir iespējoti"</string> @@ -451,10 +453,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Vairs nerādīt"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Dzēst visu"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Pārvaldīt"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Neuzkrītoši paziņojumi"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Notīrīt visus neuzkrītošos paziņojumus"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Paziņojumi pārtraukti, izmantojot iestatījumu “Netraucēt”"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Sākt tūlīt"</string> <string name="empty_shade_text" msgid="708135716272867002">"Nav paziņojumu"</string> @@ -654,6 +654,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Šos paziņojumus nevar modificēt."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Šeit nevar konfigurēt šo paziņojumu grupu."</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Starpniekservera paziņojums"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Šajā lietotnē tiek izmantota kamera."</string> <string name="appops_microphone" msgid="741508267659494555">"Šajā lietotnē tiek izmantots mikrofons."</string> <string name="appops_overlay" msgid="6165912637560323464">"Šī lietotne tiek rādīta ekrānā pāri citām lietotnēm."</string> @@ -931,4 +935,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Pārvietot augšpusē pa labi"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Pārvietot apakšpusē pa kreisi"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Pārvietot apakšpusē pa labi"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index bfeaf3d3925e..69d648b82996 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ќе се вклучи во <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Темна тема"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC е оневозможено"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC е овозможено"</string> @@ -449,7 +451,7 @@ <string name="clear_all_notifications_text" msgid="814192889771462828">"Исчисти сè"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Управувајте"</string> <string name="notification_section_header_gentle" msgid="8356064473678167305">"Нежни известувања"</string> - <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Исчисти ги сите тивки известувања"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Исчисти ги сите нежни известувања"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Известувањата се паузирани од „Не вознемирувај“"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Започни сега"</string> <string name="empty_shade_text" msgid="708135716272867002">"Нема известувања"</string> @@ -641,7 +643,7 @@ <string name="inline_keep_showing_app" msgid="1723113469580031041">"Дали да продолжат да се прикажуваат известувања од апликацијава?"</string> <string name="notification_silence_title" msgid="7352089096356977930">"Тивко"</string> <string name="notification_alert_title" msgid="3966526305405016221">"Приоритетно"</string> - <string name="notification_channel_summary_low" msgid="1065819618107531284">"Не ви го одвлекува вниманието прикажувајќи известувања само во паѓачки список во сенка. Секогаш безгласно."</string> + <string name="notification_channel_summary_low" msgid="1065819618107531284">"Не ви го одвлекува вниманието прикажувајќи известувања само во списокот со известувања. Секогаш безгласно."</string> <string name="notification_channel_summary_low_status" msgid="2702170424808743755">"Се прикажува под приоритетните известувања. Секогаш безгласно."</string> <string name="notification_channel_summary_low_lock" msgid="7966605244472624458">"Се прикажува под приоритетните известувања. Секогаш безгласно."</string> <string name="notification_channel_summary_low_status_lock" msgid="7012562768950012739">"Се прикажува под приоритетните известувања. Секогаш безгласно."</string> @@ -649,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Овие известувања не може да се изменат"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Оваа група известувања не може да се конфигурира тука"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Известување преку прокси"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Апликацијава ја користи камерата."</string> <string name="appops_microphone" msgid="741508267659494555">"Апликацијава го користи микрофонот."</string> <string name="appops_overlay" msgid="6165912637560323464">"Апликацијава се прикажува врз други апликации на вашиот екран."</string> @@ -924,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Премести горе десно"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Премести долу лево"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Премести долу десно"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index be7ae17c8daa..0cc0aef19e61 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>-ന്"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> വരെ"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ഇരുണ്ട തീം"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC പ്രവർത്തനരഹിതമാക്കി"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC പ്രവർത്തനക്ഷമമാക്കി"</string> @@ -651,6 +653,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"അറിയിപ്പുകളുടെ ഈ ഗ്രൂപ്പ് ഇവിടെ കോണ്ഫിഗര് ചെയ്യാൻ കഴിയില്ല"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"പ്രോക്സി അറിയിപ്പ്"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"ഈ ആപ്പ് ക്യാമറ ഉപയോഗിക്കുന്നുണ്ട്."</string> <string name="appops_microphone" msgid="741508267659494555">"ഈ ആപ്പ് മൈക്രോഫോൺ ഉപയോഗിക്കുന്നു."</string> <string name="appops_overlay" msgid="6165912637560323464">"ഈ ആപ്പ് നിങ്ങളുടെ സ്ക്രീനിലെ മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു."</string> @@ -926,4 +932,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"മുകളിൽ വലതുഭാഗത്തേക്ക് നീക്കുക"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ചുവടെ ഇടതുഭാഗത്തേക്ക് നീക്കുക"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ചുവടെ വലതുഭാഗത്തേക്ക് നീക്കുക"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 3a6943aa46bf..af58d4bb920f 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>-д"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> хүртэл"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Бараан загвар"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC-г цуцалсан"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC-г идэвхжүүлсэн"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Дахиж үл харуулах"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Бүгдийг арилгах"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Удирдах"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Эелдэг мэдэгдэл"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Бүх эелдэг мэдэгдлийг устгах"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Бүү саад бол горимын түр зогсоосон мэдэгдэл"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Одоо эхлүүлэх"</string> <string name="empty_shade_text" msgid="708135716272867002">"Мэдэгдэл байхгүй"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Эдгээр мэдэгдлийг өөрчлөх боломжгүй."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Энэ бүлэг мэдэгдлийг энд тохируулах боломжгүй байна"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Прокси хийсэн мэдэгдэл"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Энэ апп камерыг ашиглаж байна."</string> <string name="appops_microphone" msgid="741508267659494555">"Энэ апп микрофоныг ашиглаж байна."</string> <string name="appops_overlay" msgid="6165912637560323464">"Энэ аппыг таны дэлгэцэд бусад аппын дээр харуулж байна."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Баруун дээш зөөх"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Зүүн доош зөөх"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Баруун доош зөөх"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 84d701b5e06c..ad56eb6ab346 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> वाजता चालू"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> पर्यंत"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"गडद थीम"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC अक्षम केले आहे"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC सक्षम केले आहे"</string> @@ -651,6 +653,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"या सूचनांचा संच येथे कॉन्फिगर केला जाऊ शकत नाही"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"प्रॉक्सी केलेल्या सूचना"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"हे अॅप कॅमेरा वापरत आहे."</string> <string name="appops_microphone" msgid="741508267659494555">"हे अॅप मायक्रोफोन वापरत आहे."</string> <string name="appops_overlay" msgid="6165912637560323464">"हे अॅप स्क्रीनवरील इतर अॅप्स वर प्रदर्शित होत आहे."</string> @@ -926,4 +932,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"वर उजवीकडे हलवा"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"तळाशी डावीकडे हलवा"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"तळाशी उजवीकडे हलवा"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index c95310033250..93b4fccb3029 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Dihidupkan pada <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hingga <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema Gelap"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC dilumpuhkan"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC didayakan"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Jangan tunjukkan lagi"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Kosongkan semua"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Urus"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Pemberitahuan lembut"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Kosongkan semua pemberitahuan lembut"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Pemberitahuan dijeda oleh Jangan Ganggu"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Mulakan sekarang"</string> <string name="empty_shade_text" msgid="708135716272867002">"Tiada pemberitahuan"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Pemberitahuan ini tidak boleh diubah suai."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Kumpulan pemberitahuan ini tidak boleh dikonfigurasikan di sini"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Pemberitahuan berproksi"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Apl ini sedang menggunakan kamera."</string> <string name="appops_microphone" msgid="741508267659494555">"Apl ini sedang menggunakan mikrofon."</string> <string name="appops_overlay" msgid="6165912637560323464">"Apl ini dipaparkan di atas apl lain pada skrin anda."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Alihkan ke atas sebelah kanan"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Alihkan ke bawah sebelah kiri"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Alihkan ke bawah sebelah kanan"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 4c1b8b18b3ba..f058f92b00b8 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> တွင် ဖွင့်ရန်"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> အထိ"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"မှောင်သည့် အပြင်အဆင်"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ကို ပိတ်ထားသည်"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ကို ဖွင့်ထားသည်"</string> @@ -649,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"ဤအကြောင်းကြားချက်အုပ်စုကို ဤနေရာတွင် စီစဉ်သတ်မှတ်၍ မရပါ"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"ပရောက်စီထည့်ထားသော အကြောင်းကြားချက်"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"ဤအက်ပ်က ကင်မရာကို အသုံးပြုနေသည်။"</string> <string name="appops_microphone" msgid="741508267659494555">"ဤအက်ပ်က မိုက်ခရိုဖုန်းကို အသုံးပြုနေသည်။"</string> <string name="appops_overlay" msgid="6165912637560323464">"ဤအက်ပ်က ဖန်သားမျက်နှာပြင်ပေါ်ရှိ အခြားအက်ပ်များ အပေါ်မှ ထပ်ပြီး ပြသနေပါသည်။"</string> @@ -924,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"ညာဘက်ထိပ်သို့ ရွှေ့ပါ"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ဘယ်အောက်ခြေသို့ ရွှေ့ရန်"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ညာအောက်ခြေသို့ ရွှေ့ပါ"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 2b84fa812b95..aaff2fa8e9ee 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"På kl. <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Til <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Mørkt tema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC er slått av"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC er slått på"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Ikke vis igjen"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Fjern alt"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Administrer"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Diskré varsler"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Fjern alle diskré varsler"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Varsler er satt på pause av «Ikke forstyrr»"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Start nå"</string> <string name="empty_shade_text" msgid="708135716272867002">"Ingen varsler"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Disse varslene kan ikke endres."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Denne varselgruppen kan ikke konfigureres her"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Omdirigert varsel"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Denne appen bruker kameraet."</string> <string name="appops_microphone" msgid="741508267659494555">"Denne appen bruker mikrofonen."</string> <string name="appops_overlay" msgid="6165912637560323464">"Denne appen vises over andre apper på skjermen."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Flytt til øverst til høyre"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Flytt til nederst til venstre"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Flytt til nederst til høyre"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 89037ee84523..5807b9dae6ed 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> मा सक्रिय"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> सम्म"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"अँध्यारो विषयवस्तु"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC लाई असक्षम पारिएको छ"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC लाई सक्षम पारिएको छ"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"फेरि नदेखाउनुहोस्"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"सबै हटाउनुहोस्"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"व्यवस्थित गर्नुहोस्"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"सामान्य सूचनाहरू"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"सबै सामान्य सूचनाहरू खाली गर्नुहोस्"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"बाधा नपुऱ्याउनुहोस् नामक मोडमार्फत पज पारिएका सूचनाहरू"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"अहिले सुरु गर्नुहोस्"</string> <string name="empty_shade_text" msgid="708135716272867002">"कुनै सूचनाहरू छैनन्"</string> @@ -482,8 +482,8 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN असक्षम गर्नुहोस्"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"विच्छेद VPN"</string> <string name="monitoring_button_view_policies" msgid="100913612638514424">"नीतिहरू हेर्नुहोस्"</string> - <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ले तपाईंको यन्त्रको व्यवस्थापन गर्छ।BREAK\n\nतपाईंका प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोगहरू, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थान सम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> - <string name="monitoring_description_management" msgid="4573721970278370790">"तपाईंको संगठनले तपाईंको यन्त्रको व्यवस्थापन गर्छ।\n\nतपाईंका प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोगहरू, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थान सम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> + <string name="monitoring_description_named_management" msgid="5281789135578986303">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ले तपाईंको यन्त्रको व्यवस्थापन गर्छ।BREAK\n\nतपाईंका प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोगहरू, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थानसम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> + <string name="monitoring_description_management" msgid="4573721970278370790">"तपाईंको संगठनले तपाईंको यन्त्रको व्यवस्थापन गर्छ।\n\nतपाईंका प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोगहरू, तपाईंको यन्त्रसँग सम्बन्धित डेटा र तपाईंको यन्त्रको स्थानसम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> <string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापित गऱ्यो। तपाईंको सुरक्षित नेटवर्क ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string> <string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"तपाईंको संगठनले तपाईंको कार्य प्रोफाइलमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापना गरेको छ। तपाईंको सुरक्षित नेटवर्क ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string> <string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"यस यन्त्रमा एउटा प्रमाणपत्र सम्बन्धी अख्तियार सुविधा स्थापना गरिएको छ। तपाईंको सुरक्षित नेटवर्कको ट्राफिकको अनुगमन वा परिमार्जन हुनसक्छ।"</string> @@ -494,7 +494,7 @@ <string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"तपाईंको व्यक्तिगत प्रोफाइल इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्कको गतिविधिको अनुगमन गर्नसक्ने <xliff:g id="VPN_APP">%1$s</xliff:g> मा जडान छ।"</string> <string name="monitoring_description_do_header_generic" msgid="96588491028288691">"तपाईंको यन्त्र <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> द्वारा व्यवस्थापन गरिएको छ।"</string> <string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> ले तपाईंको यन्त्रको व्यवस्थापन गर्न <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> को प्रयोग गर्दछ।"</string> - <string name="monitoring_description_do_body" msgid="3639594537660975895">"तपाईँको प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोग, तपाईँको यन्त्रसँग सम्बन्धित डेटा र तपाईँको यन्त्रको स्थान सम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।"</string> + <string name="monitoring_description_do_body" msgid="3639594537660975895">"तपाईँको प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोग, तपाईँको यन्त्रसँग सम्बन्धित डेटा र तपाईँको यन्त्रको स्थानसम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।"</string> <string name="monitoring_description_do_learn_more_separator" msgid="3785251953067436862">" "</string> <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"थप जान्नुहोस्"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"तपाईं <xliff:g id="VPN_APP">%1$s</xliff:g> मा जोडिनुभएको छ जसले इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्क सम्बन्धी गतिविधिको अनुगमन गर्न सक्छ।"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"यी सूचनाहरू परिमार्जन गर्न मिल्दैन।"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"यहाँबाट सूचनाहरूको यो समूह कन्फिगर गर्न सकिँदैन"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"प्रोक्सीमार्फत आउने सूचना"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"यो अनुप्रयोगले क्यामेराको प्रयोग गर्दै छ।"</string> <string name="appops_microphone" msgid="741508267659494555">"यो अनुप्रयोगले माइक्रोफोनको प्रयोग गर्दै छ।"</string> <string name="appops_overlay" msgid="6165912637560323464">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य अनुप्रयोगहरूमाथि प्रदर्शन गर्दै छ।"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"सिरानमा दायाँतिर सार्नुहोस्"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"पुछारमा बायाँतिर सार्नुहोस्"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"पुछारमा दायाँतिर सार्नुहोस्"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index d07562c2f204..2538f52451ea 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aan om <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Tot <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Donker thema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is uitgeschakeld"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is ingeschakeld"</string> @@ -649,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Deze meldingen kunnen niet worden aangepast."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Deze groep meldingen kan hier niet worden geconfigureerd"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Melding via proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Deze app gebruikt de camera."</string> <string name="appops_microphone" msgid="741508267659494555">"Deze app gebruikt de microfoon."</string> <string name="appops_overlay" msgid="6165912637560323464">"Deze app wordt over andere apps op je scherm heen weergegeven."</string> @@ -924,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Naar rechtsboven verplaatsen"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Naar linksonder verplaatsen"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Naar rechtsonder verplaatsen"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 0fa40431d725..39714cf70d74 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>ରେ ଅନ୍ ହେବ"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> ପର୍ଯ୍ୟନ୍ତ"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ଗାଢ଼ା ଥିମ୍"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ଅକ୍ଷମ କରାଯାଇଛି"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ସକ୍ଷମ କରାଯାଇଛି"</string> @@ -651,6 +653,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"ଏଠାରେ ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଗ୍ରୁପ୍ କନଫ୍ୟୁଗର୍ କରାଯାଇପାରିବ ନାହିଁ"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"ବିଜ୍ଞପ୍ତି ପ୍ରକ୍ସୀ ହୋଇଛି"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"ଏହି ଆପ୍ କ୍ୟାମେରା ବ୍ୟବହାର କରୁଛି।"</string> <string name="appops_microphone" msgid="741508267659494555">"ଏହି ଆପ୍, ମାଇକ୍ରୋଫୋନ୍ ବ୍ୟବହାର କରୁଛି।"</string> <string name="appops_overlay" msgid="6165912637560323464">"ଏହି ଆପ୍, ଆପଣଙ୍କର ସ୍କ୍ରୀନ୍ ଉପରେ ଥିବା ଅନ୍ୟ ଆପ୍ ଉପରେ ପ୍ରଦର୍ଶିତ ହେଉଛି।"</string> @@ -926,4 +932,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"ଉପର-ଡାହାଣକୁ ନିଅନ୍ତୁ"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ତଳ ବାମକୁ ନିଅନ୍ତୁ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ତଳ ଡାହାଣକୁ ନିଅନ୍ତୁ"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 78ff73c1d306..fcabbaf019b0 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> ਵਜੇ ਚਾਲੂ"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> ਤੱਕ"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ਗੂੜ੍ਹਾ ਥੀਮ"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ਨੂੰ ਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"ਸਰਲ ਸੂਚਨਾਵਾਂ"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"ਸਾਰੀਆਂ ਸਰਲ ਸੂਚਨਾਵਾਂ ਕਲੀਅਰ ਕਰੋ"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵੱਲੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੋਕਿਆ ਗਿਆ"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"ਹੁਣ ਚਾਲੂ ਕਰੋ"</string> <string name="empty_shade_text" msgid="708135716272867002">"ਕੋਈ ਸੂਚਨਾਵਾਂ ਨਹੀਂ"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"ਇਹ ਸੂਚਨਾਵਾਂ ਦਾ ਗਰੁੱਪ ਇੱਥੇ ਸੰਰੂਪਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"ਇੱਕ ਐਪ ਦੀ ਥਾਂ \'ਤੇ ਦੂਜੀ ਐਪ ਰਾਹੀਂ ਦਿੱਤੀ ਗਈ ਸੂਚਨਾ"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"ਇਹ ਐਪ ਕੈਮਰੇ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।"</string> <string name="appops_microphone" msgid="741508267659494555">"ਇਹ ਐਪ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।"</string> <string name="appops_overlay" msgid="6165912637560323464">"ਇਹ ਐਪ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਹੋਰਾਂ ਐਪਾਂ ਉੱਪਰ ਦਿਖਾਈ ਜਾ ਰਹੀ ਹੈ।"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"ਉੱਪਰ ਵੱਲ ਸੱਜੇ ਲਿਜਾਓ"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ਹੇਠਾਂ ਵੱਲ ਖੱਬੇ ਲਿਜਾਓ"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ਹੇਠਾਂ ਵੱਲ ਸੱਜੇ ਲਿਜਾਓ"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 9fc1c4a5acf7..ed792f2abced 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -375,6 +375,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Włącz o <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Ciemny motyw"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"Komunikacja NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Komunikacja NFC jest wyłączona"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Komunikacja NFC jest włączona"</string> @@ -456,10 +458,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Nie pokazuj ponownie"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Ukryj wszystkie"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Zarządzaj"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Subtelne powiadomienia"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Wyczyść wszystkie subtelne powiadomienia"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Powiadomienia wstrzymane przez tryb Nie przeszkadzać"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Rozpocznij teraz"</string> <string name="empty_shade_text" msgid="708135716272867002">"Brak powiadomień"</string> @@ -659,6 +659,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Tych powiadomień nie można zmodyfikować."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Tej grupy powiadomień nie można tu skonfigurować"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Powiadomienie w zastępstwie"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Ta aplikacja używa aparatu."</string> <string name="appops_microphone" msgid="741508267659494555">"Ta aplikacja używa mikrofonu."</string> <string name="appops_overlay" msgid="6165912637560323464">"Ta aplikacja wyświetla się nad innymi aplikacjami na ekranie."</string> @@ -938,4 +942,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Przenieś w prawy górny róg"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Przenieś w lewy dolny róg"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Przenieś w prawy dolny róg"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index a2441768477e..cfca7980f409 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ativado às <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Até <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema escuro"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"A NFC está desativada"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"A NFC está ativada"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Não mostrar novamente"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Limpar tudo"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Gerenciar"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Notificações discretas"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Limpar todas as notificações discretas"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notificações pausadas pelo modo \"Não perturbe\""</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Iniciar agora"</string> <string name="empty_shade_text" msgid="708135716272867002">"Sem notificações"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Não é possível modificar essas notificações."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Não é possível configurar esse grupo de notificações aqui"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Notificação salva no proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Este app está usando a câmera."</string> <string name="appops_microphone" msgid="741508267659494555">"Este app está usando o microfone."</string> <string name="appops_overlay" msgid="6165912637560323464">"Este app está sobreposto a outros apps na sua tela."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Mover para canto superior direito"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mover para canto inferior esquerdo"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mover para canto inferior direito"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 557760f94199..328c1fd73af5 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ativada à(s) <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Até à(s) <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema escuro"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"O NFC está desativado"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"O NFC está ativado"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Não mostrar de novo"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Limpar tudo"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Gerir"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Notificações discretas"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Limpar todas as notificações discretas"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notificações colocadas em pausa pelo modo Não incomodar."</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Começar agora"</string> <string name="empty_shade_text" msgid="708135716272867002">"Sem notificações"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Não é possível modificar estas notificações."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Não é possível configurar este grupo de notificações aqui."</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Notificação de aplicação proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Esta aplicação está a utilizar a câmara."</string> <string name="appops_microphone" msgid="741508267659494555">"Esta aplicação está a utilizar o microfone."</string> <string name="appops_overlay" msgid="6165912637560323464">"Esta aplicação está a sobrepor-se a outras aplicações no ecrã."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Mover parte superior direita"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mover p/ parte infer. esquerda"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mover parte inferior direita"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index a2441768477e..cfca7980f409 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Ativado às <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Até <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema escuro"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"A NFC está desativada"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"A NFC está ativada"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Não mostrar novamente"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Limpar tudo"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Gerenciar"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Notificações discretas"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Limpar todas as notificações discretas"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notificações pausadas pelo modo \"Não perturbe\""</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Iniciar agora"</string> <string name="empty_shade_text" msgid="708135716272867002">"Sem notificações"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Não é possível modificar essas notificações."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Não é possível configurar esse grupo de notificações aqui"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Notificação salva no proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Este app está usando a câmera."</string> <string name="appops_microphone" msgid="741508267659494555">"Este app está usando o microfone."</string> <string name="appops_overlay" msgid="6165912637560323464">"Este app está sobreposto a outros apps na sua tela."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Mover para canto superior direito"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mover para canto inferior esquerdo"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mover para canto inferior direito"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 4979069d9164..d673743605fa 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -371,6 +371,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Activată la <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Până la <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Temă întunecată"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Serviciul NFC este dezactivat"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Serviciul NFC este activat"</string> @@ -451,10 +453,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Nu se mai afișează"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Ștergeți toate notificările"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Gestionați"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Notificări discrete"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Ștergeți toate notificările discrete"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Notificări întrerupte prin „Nu deranja”"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Începeți acum"</string> <string name="empty_shade_text" msgid="708135716272867002">"Nicio notificare"</string> @@ -654,6 +654,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Aceste notificări nu pot fi modificate."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Acest grup de notificări nu poate fi configurat aici"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Notificare prin proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Această aplicație folosește camera foto."</string> <string name="appops_microphone" msgid="741508267659494555">"Această aplicație folosește microfonul."</string> <string name="appops_overlay" msgid="6165912637560323464">"Această aplicație se afișează pe alte aplicații de pe ecran."</string> @@ -931,4 +935,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Mutați în dreapta sus"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Mutați în stânga jos"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Mutați în dreapta jos"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 5a799686bc3c..9593e4f1e561 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -373,6 +373,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Включить в <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Тёмная тема"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"Модуль NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Модуль NFC отключен"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Модуль NFC включен"</string> @@ -454,10 +456,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Больше не показывать"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Очистить все"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Настроить"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Беззвучные уведомления"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Отклонить все беззвучные уведомления"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"В режиме \"Не беспокоить\" уведомления заблокированы"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Начать"</string> <string name="empty_shade_text" msgid="708135716272867002">"Нет уведомлений"</string> @@ -657,6 +657,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Эти уведомления нельзя изменить."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Эту группу уведомлений нельзя настроить здесь."</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Уведомление отправлено через прокси-сервер."</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Это приложение использует камеру."</string> <string name="appops_microphone" msgid="741508267659494555">"Это приложение использует микрофон."</string> <string name="appops_overlay" msgid="6165912637560323464">"Это приложение располагается поверх других приложений."</string> @@ -936,4 +940,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Перенести в правый верхний угол"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Перенести в левый нижний угол"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Перенести в правый нижний угол"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 09755bbfe522..4d3f5dcb680e 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>ට ක්රියාත්මකයි"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> තෙක්"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"අඳුරු තේමාව"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC අබලයි"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC සබලයි"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"නැවත නොපෙන්වන්න"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"සියල්ල හිස් කරන්න"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"කළමනාකරණය කරන්න"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"මෘදු දැනුම්දීම්"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"සියලු මෘදු දැනුම්දීම් හිස් කරන්න"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"බාධා නොකරන්න මගින් විරාම කරන ලද දැනුම්දීම්"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"දැන් අරඹන්න"</string> <string name="empty_shade_text" msgid="708135716272867002">"දැනුම්දීම් නැත"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"මෙම දැනුම්දීම් වෙනස් කළ නොහැක."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"මෙම දැනුම්දීම් සමූහය මෙහි වින්යාස කළ නොහැක"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"ප්රොක්සි කළ දැනුම්දීම"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"මෙම යෙදුම කැමරාව භාවිතා කරයි."</string> <string name="appops_microphone" msgid="741508267659494555">"මෙම යෙදුම මයික්රෆෝනය භාවිතා කරයි."</string> <string name="appops_overlay" msgid="6165912637560323464">"මෙම යෙදුම් ඔබගේ තිරය මත අනෙකුත් යෙදුම්වලට උඩින් සංදර්ශනය වේ."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"ඉහළ දකුණට ගෙන යන්න"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"පහළ වමට ගෙන යන්න"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"පහළ දකුණට ගෙන යන්න"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index ae8e0220201d..720b256f2e81 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -373,6 +373,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Od <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tmavý motív"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je deaktivované"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je aktivované"</string> @@ -454,10 +456,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Nabudúce nezobrazovať"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Vymazať všetko"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Spravovať"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Nenápadné upozornenia"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Vymazať všetky nenápadné upozornenia"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Upozornenia sú pozastavené režimom bez vyrušení"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Spustiť"</string> <string name="empty_shade_text" msgid="708135716272867002">"Žiadne upozornenia"</string> @@ -657,6 +657,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Tieto upozornenia sa nedajú upraviť."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Túto skupinu upozornení nejde na tomto mieste konfigurovať"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Približné upozornenie"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Táto aplikácia používa fotoaparát."</string> <string name="appops_microphone" msgid="741508267659494555">"Táto aplikácia používa mikrofón."</string> <string name="appops_overlay" msgid="6165912637560323464">"Táto aplikácia sa zobrazuje cez ďalšie aplikácie na obrazovke."</string> @@ -936,4 +940,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Presunúť doprava nahor"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Presunúť doľava nadol"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Presunúť doprava nadol"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 584e4c83906c..d0a5f50b2028 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -373,6 +373,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Vklop ob <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Temna tema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Tehnologija NFC je onemogočena"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Tehnologija NFC je omogočena"</string> @@ -454,10 +456,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Tega ne prikaži več"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Izbriši vse"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Upravljanje"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Diskretna obvestila"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Počisti vsa diskretna obvestila"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Prikazovanje obvestil je začasno zaustavljeno z načinom »ne moti«"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Začni zdaj"</string> <string name="empty_shade_text" msgid="708135716272867002">"Ni obvestil"</string> @@ -657,6 +657,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Za ta obvestila ni mogoče spremeniti nastavitev."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Te skupine obvestil ni mogoče konfigurirati tukaj"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Posredovano obvestilo"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Ta aplikacija uporablja fotoaparat."</string> <string name="appops_microphone" msgid="741508267659494555">"Ta aplikacija uporablja mikrofon."</string> <string name="appops_overlay" msgid="6165912637560323464">"Ta aplikacija prekriva druge aplikacije na zaslonu."</string> @@ -936,4 +940,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Premakni zgoraj desno"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Premakni spodaj levo"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Premakni spodaj desno"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index dae69b2c866d..b4ec0669f649 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aktive në <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Deri në <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tema e errët"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC është çaktivizuar"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC është aktivizuar"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Mos e shfaq sërish"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Pastroji të gjitha"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Menaxho"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Njoftimet me rëndësi të ulët"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Pastro të gjitha njoftimet me rëndësi të ulët"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Njoftimet janë vendosur në pauzë nga modaliteti \"Mos shqetëso\""</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Fillo tani"</string> <string name="empty_shade_text" msgid="708135716272867002">"Asnjë njoftim"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Këto njoftime nuk mund të modifikohen."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Ky grup njoftimesh nuk mund të konfigurohet këtu"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Njoftim i dërguar me përfaqësues"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Ky aplikacion po përdor kamerën."</string> <string name="appops_microphone" msgid="741508267659494555">"Ky aplikacion po përdor mikrofonin."</string> <string name="appops_overlay" msgid="6165912637560323464">"Ky aplikacion po shfaqet mbi aplikacionet e tjera në ekran."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Lëviz lart djathtas"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Zhvendos poshtë majtas"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Lëvize poshtë djathtas"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 39e3677267f2..afdedc26b027 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -371,6 +371,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Укључује се у <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Тамна тема"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC је онемогућен"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC је омогућен"</string> @@ -451,10 +453,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Не приказуј поново"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Обриши све"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Управљајте"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Дискретна обавештења"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Обришите сва дискретна обавештења"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Обавештења су паузирана режимом Не узнемиравај"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Започни одмах"</string> <string name="empty_shade_text" msgid="708135716272867002">"Нема обавештења"</string> @@ -654,6 +654,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Ова обавештења не могу да се мењају."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Ова група обавештења не може да се конфигурише овде"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Обавештење преко проксија"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Ова апликација користи камеру."</string> <string name="appops_microphone" msgid="741508267659494555">"Ова апликација користи микрофон."</string> <string name="appops_overlay" msgid="6165912637560323464">"Ова апликација се приказује преко других апликација на екрану."</string> @@ -931,4 +935,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Премести горе десно"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Премести доле лево"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Премести доле десно"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 83ec18fabaaf..5c3f2f41bc3f 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"På från <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Till <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Mörkt tema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC är inaktiverat"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC är aktiverat"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Visa inte igen"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Rensa alla"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Hantera"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Aviseringar utan avbrott"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Rensa alla aviseringar utan avbrott"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Aviseringar har pausats via Stör ej"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Starta nu"</string> <string name="empty_shade_text" msgid="708135716272867002">"Inga aviseringar"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Det går inte att ändra de här aviseringarna."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Den här aviseringsgruppen kan inte konfigureras här"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Avisering via proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Kameran används av appen."</string> <string name="appops_microphone" msgid="741508267659494555">"Mikrofonen används av appen."</string> <string name="appops_overlay" msgid="6165912637560323464">"Appen visas över andra appar på skärmen."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Flytta högst upp till höger"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Flytta längst ned till vänster"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Flytta längst ned till höger"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 4652dc7d8557..a772af2168cf 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Itawashwa saa <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hadi <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Mandhari Meusi"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC imezimwa"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC imewashwa"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Usionyeshe tena"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Futa zote"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Dhibiti"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Arifa zisizo na sauti"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Futa arifa zote zisizo na sauti"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Kipengele cha Usinisumbue kimesitisha arifa"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Anza sasa"</string> <string name="empty_shade_text" msgid="708135716272867002">"Hakuna arifa"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Arifa hizi haziwezi kubadilishwa."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Kikundi hiki cha arifa hakiwezi kuwekewa mipangilio hapa"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Arifa wakilishi"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Programu hii inatumia kamera."</string> <string name="appops_microphone" msgid="741508267659494555">"Programu hii inatumia maikrofoni."</string> <string name="appops_overlay" msgid="6165912637560323464">"Programu hii inachomoza kwenye programu zingine zilizo katika skrini yako."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Sogeza juu kulia"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Sogeza chini kushoto"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Sogeza chini kulia"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 6088b52974cf..6124f079b343 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>க்கு ஆன் செய்"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> வரை"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"டார்க் தீம்"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC முடக்கப்பட்டது"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC இயக்கப்பட்டது"</string> @@ -652,6 +654,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"இந்த அறிவிப்புகளை மாற்ற இயலாது."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"இந்த அறிவுப்புக் குழுக்களை இங்கே உள்ளமைக்க இயலாது"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"ப்ராக்ஸியான அறிவிப்பு"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"இந்த ஆப்ஸானது கேமராவை உபயோகிக்கிறது."</string> <string name="appops_microphone" msgid="741508267659494555">"இந்த ஆப்ஸானது, மைக்ரோஃபோனை உபயோகிக்கிறது."</string> <string name="appops_overlay" msgid="6165912637560323464">"இந்த ஆப்ஸானது, உங்கள் திரையில் பிற ஆப்ஸின் இடைமுகத்தின் மேல் தோன்றுகிறது."</string> @@ -928,4 +934,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"மேலே வலப்புறமாக நகர்த்து"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"கீழே இடப்புறமாக நகர்த்து"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"கீழே வலதுபுறமாக நகர்த்து"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index bb8c3d115067..d2b117cc4f15 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>కి"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> వరకు"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ముదురు రంగు థీమ్"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC నిలిపివేయబడింది"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ప్రారంభించబడింది"</string> @@ -651,6 +653,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ఈ నోటిఫికేషన్లను సవరించడం వీలుపడదు."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"ఈ నోటిఫికేషన్ల సమూహాన్ని ఇక్కడ కాన్ఫిగర్ చేయలేము"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"ప్రాక్సీ చేయబడిన నోటిఫికేషన్"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"ఈ యాప్ ఈ కెమెరాను ఉపయోగిస్తోంది."</string> <string name="appops_microphone" msgid="741508267659494555">"ఈ యాప్ మైక్రోఫోన్ను ఉపయోగిస్తుంది."</string> <string name="appops_overlay" msgid="6165912637560323464">"ఈ యాప్ మీ స్క్రీన్లోని ఇతర యాప్లపై ప్రదర్శించబడుతోంది."</string> @@ -926,4 +932,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"ఎగువ కుడివైపునకు జరుపు"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"దిగువ ఎడమవైపునకు తరలించు"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"దిగవు కుడివైపునకు జరుపు"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 5e3359c23c36..5d50b16cf9ff 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -185,7 +185,7 @@ <string name="not_default_data_content_description" msgid="9194667237765917844">"ไม่ได้ตั้งค่าให้ใช้อินเทอร์เน็ตมือถือ"</string> <string name="cell_data_off" msgid="1051264981229902873">"ปิด"</string> <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"การปล่อยสัญญาณบลูทูธ"</string> - <string name="accessibility_airplane_mode" msgid="834748999790763092">"โหมดใช้งานบนเครื่องบิน"</string> + <string name="accessibility_airplane_mode" msgid="834748999790763092">"โหมดบนเครื่องบิน"</string> <string name="accessibility_vpn_on" msgid="5993385083262856059">"VPN เปิดอยู่"</string> <string name="accessibility_no_sims" msgid="3957997018324995781">"ไม่มีซิมการ์ด"</string> <string name="carrier_network_change_mode" msgid="8149202439957837762">"การเปลี่ยนเครือข่ายผู้ให้บริการ"</string> @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"เปิดเวลา <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"จนถึง <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"ธีมสีเข้ม"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ถูกปิดใช้งาน"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"เปิดใช้งาน NFC แล้ว"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"ไม่ต้องแสดงข้อความนี้อีก"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"ล้างทั้งหมด"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"จัดการ"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"การแจ้งเตือนช่วยจำ"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"ล้างการแจ้งเตือนช่วยจำทั้งหมด"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"หยุดการแจ้งเตือนชั่วคราวโดย \"ห้ามรบกวน\""</string> <string name="media_projection_action_text" msgid="8470872969457985954">"เริ่มเลย"</string> <string name="empty_shade_text" msgid="708135716272867002">"ไม่มีการแจ้งเตือน"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"การแจ้งเตือนกลุ่มนี้กำหนดค่าที่นี่ไม่ได้"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"การแจ้งเตือนที่ผ่านพร็อกซี"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"แอปนี้กำลังใช้กล้อง"</string> <string name="appops_microphone" msgid="741508267659494555">"แอปนี้กำลังใช้ไมโครโฟน"</string> <string name="appops_overlay" msgid="6165912637560323464">"แอปนี้กำลังแสดงทับแอปอื่นๆ ในหน้าจอ"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"ย้ายไปด้านขวาบน"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"ย้ายไปด้านซ้ายล่าง"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"ย้ายไปด้านขาวล่าง"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 88ae2513ec59..5be6a3bf12bc 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Mao-on sa ganap na <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hanggang <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Madilim na Tema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Naka-disable ang NFC"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Naka-enable ang NFC"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Huwag ipakitang muli"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"I-clear lahat"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Pamahalaan"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Mga banayad na notification"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"I-clear ang lahat ng banayad na notification"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Mga notification na na-pause ng Huwag Istorbohin"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Magsimula ngayon"</string> <string name="empty_shade_text" msgid="708135716272867002">"Walang mga notification"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Hindi puwedeng baguhin ang mga notification na ito."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Hindi mako-configure dito ang pangkat na ito ng mga notification"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Na-proxy na notification"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Ginagamit ng app na ito ang camera."</string> <string name="appops_microphone" msgid="741508267659494555">"Ginagamit ng app na ito ang mikropono."</string> <string name="appops_overlay" msgid="6165912637560323464">"Ipinapakita ang app na ito sa ibabaw ng iba pang app sa iyong screen."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Ilipat sa kanan sa itaas"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Ilipat sa kaliwa sa ibaba"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Ilipat sa kanan sa ibaba"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 6f5346283b68..7cfbb13e3600 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Şu saatte açılacak: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Şu saate kadar: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Koyu Tema"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC devre dışı"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC etkin"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Bir daha gösterme"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Tümünü temizle"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Yönet"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Sessiz bildirimler"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Sessiz bildirimlerin tümünü temizle"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Bildirimler, Rahatsız Etmeyin özelliği tarafından duraklatıldı"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Şimdi başlat"</string> <string name="empty_shade_text" msgid="708135716272867002">"Bildirim yok"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Bu bildirimler değiştirilemez."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Bu bildirim grubu burada yapılandırılamaz"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Proxy uygulanan bildirim"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Bu uygulama kamerayı kullanıyor."</string> <string name="appops_microphone" msgid="741508267659494555">"Bu uygulama mikrofonu kullanıyor."</string> <string name="appops_overlay" msgid="6165912637560323464">"Bu uygulama, ekranınızdaki diğer uygulamaların üzerinde görüntüleniyor."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Sağ üste taşı"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Sol alta taşı"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Sağ alta taşı"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 404caabbb778..9858a2cb7cfa 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -373,6 +373,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Вмикається о <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"До <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Темна тема"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC вимкнено"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ввімкнено"</string> @@ -454,10 +456,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Більше не показувати"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Очистити все"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Керувати"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Тихі сповіщення"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Очистити всі тихі сповіщення"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Режим \"Не турбувати\" призупинив сповіщення"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Почати зараз"</string> <string name="empty_shade_text" msgid="708135716272867002">"Сповіщень немає"</string> @@ -657,6 +657,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Ці сповіщення не можна змінити."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Цю групу сповіщень не можна налаштувати тут"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Проксі-сповіщення"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Цей додаток використовує камеру."</string> <string name="appops_microphone" msgid="741508267659494555">"Цей додаток використовує мікрофон."</string> <string name="appops_overlay" msgid="6165912637560323464">"Цей додаток відображається поверх інших додатків на екрані."</string> @@ -936,4 +940,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Перемістити праворуч угору"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Перемістити ліворуч униз"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Перемістити праворуч униз"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 7ddd28eb7f34..4c1be1b2199a 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"آن ہوگی بوقت <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> تک"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"گہری تھیم"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC غیر فعال ہے"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC فعال ہے"</string> @@ -651,6 +653,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"ان اطلاعات کی ترمیم نہیں کی جا سکتی۔"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"اطلاعات کے اس گروپ کو یہاں کنفیگر نہیں کیا جا سکتا"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"پراکسی اطلاع"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"یہ ایپ کیمرے کا استعمال کر رہی ہے۔"</string> <string name="appops_microphone" msgid="741508267659494555">"یہ ایپ مائیکروفون کا استعمال کر رہی ہے۔"</string> <string name="appops_overlay" msgid="6165912637560323464">"یہ ایپ آپ کی اسکرین پر دیگر ایپس پر ڈسپلے کر رہی ہے۔"</string> @@ -926,4 +932,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"اوپر دائیں جانب لے جائيں"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"نیچے بائیں جانب لے جائیں"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"نیچے دائیں جانب لے جائیں"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 1314bae7b40f..52ca26382f5e 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> da yoqish"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> gacha"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Tungi mavzu"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC o‘chiq"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC yoniq"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Boshqa ko‘rsatilmasin"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Hammasini tozalash"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Boshqarish"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Tovushsiz bildirishnomalar"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Barcha tovushsiz bildirishnomalarni tozalash"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Bezovta qilinmasin rejimida bildirishnomalar pauza qilingan"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Boshlash"</string> <string name="empty_shade_text" msgid="708135716272867002">"Bildirishnomalar yo‘q"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Bu bildirishnomalarni tahrirlash imkonsiz."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Ushbu bildirishnomalar guruhi bu yerda sozlanmaydi"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Ishonchli bildirishnoma"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Bu ilova kameradan foydalanmoqda."</string> <string name="appops_microphone" msgid="741508267659494555">"Bu ilova mikrofondan foydalanmoqda."</string> <string name="appops_overlay" msgid="6165912637560323464">"Bu ilova ekranda boshqa ilovalar ustidan ochilgan."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Yuqori oʻngga surish"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Quyi chapga surish"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Quyi oʻngga surish"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 0d6f4efc9599..1150e16a0186 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Bật vào lúc <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Cho đến <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Giao diện tối"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC đã được tắt"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC đã được bật"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Không hiển thị lại"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Xóa tất cả"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Quản lý"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Thông báo nhẹ nhàng"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Xóa tất cả thông báo nhẹ nhàng"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Chế độ Không làm phiền đã tạm dừng thông báo"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Bắt đầu ngay"</string> <string name="empty_shade_text" msgid="708135716272867002">"Không có thông báo nào"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Không thể sửa đổi các thông báo này."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Không thể định cấu hình nhóm thông báo này tại đây"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Thông báo đã xử lý qua máy chủ proxy"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Ứng dụng này đang sử dụng máy ảnh."</string> <string name="appops_microphone" msgid="741508267659494555">"Ứng dụng này đang sử dụng micrô."</string> <string name="appops_overlay" msgid="6165912637560323464">"Ứng dụng này đang hiển thị chồng lên các ứng dụng khác trên màn hình."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Chuyển lên trên cùng bên phải"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Chuyển tới dưới cùng bên trái"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Chuyển tới dưới cùng bên phải"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 23c0339b6568..5f1b4ad9d4ed 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"在<xliff:g id="TIME">%s</xliff:g> 开启"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"直到<xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"深色主题背景"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已启用"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"不再显示"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"全部清除"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"管理"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"无声通知"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"清除所有无声通知"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"勿扰模式暂停的通知"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"立即开始"</string> <string name="empty_shade_text" msgid="708135716272867002">"没有通知"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"无法修改这些通知。"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"您无法在此处配置这组通知"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"代理通知"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"此应用正在使用摄像头。"</string> <string name="appops_microphone" msgid="741508267659494555">"此应用正在使用麦克风。"</string> <string name="appops_overlay" msgid="6165912637560323464">"此应用正显示在屏幕上其他应用的上层。"</string> @@ -915,8 +919,7 @@ <string name="bubbles_deep_link_button_description" msgid="8895837143057564517">"打开<xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="bubbles_settings_button_description" msgid="2970630476657287189">"<xliff:g id="APP_NAME">%1$s</xliff:g>气泡的相关设置"</string> <string name="bubbles_prompt" msgid="8807968030159469710">"要允许来自<xliff:g id="APP_NAME">%1$s</xliff:g>的气泡吗?"</string> - <!-- no translation found for manage_bubbles_text (7027739766859191408) --> - <skip /> + <string name="manage_bubbles_text" msgid="7027739766859191408">"管理"</string> <string name="no_bubbles" msgid="337101288173078247">"拒绝"</string> <string name="yes_bubbles" msgid="668809525728633841">"允许"</string> <string name="ask_me_later_bubbles" msgid="2147688438402939029">"以后再说"</string> @@ -927,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"移至右上角"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"移至左下角"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"移至右下角"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index a0d35dc134af..b3e48aed24ee 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> 開啟"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"直到<xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"深色主題背景"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已啟用"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"不用再顯示"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"全部清除"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"管理"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"低重要性通知"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"清除所有低重要性通知"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"「請勿騷擾」模式已將通知暫停"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"立即開始"</string> <string name="empty_shade_text" msgid="708135716272867002">"沒有通知"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"無法修改這些通知。"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"無法在此設定這組通知"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"代理通知"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"此應用程式目前使用相機。"</string> <string name="appops_microphone" msgid="741508267659494555">"此應用程式目前使用麥克風。"</string> <string name="appops_overlay" msgid="6165912637560323464">"此應用程式目前透過其他應用程式在畫面上顯示內容。"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"移去右上角"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"移去左下角"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"移去右下角"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 96eb28eb11a8..46d22853348c 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> 開啟"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> 關閉"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"深色主題"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC 已停用"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC 已啟用"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"不要再顯示"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"全部清除"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"管理"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"無聲通知"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"清除所有無聲通知"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"「零打擾」模式已將通知設為暫停"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"立即開始"</string> <string name="empty_shade_text" msgid="708135716272867002">"沒有通知"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"無法修改這些通知。"</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"無法在這裡設定這個通知群組"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"經過 Proxy 處理的通知"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"這個應用程式正在使用相機。"</string> <string name="appops_microphone" msgid="741508267659494555">"這個應用程式正在使用麥克風。"</string> <string name="appops_overlay" msgid="6165912637560323464">"這個應用程式顯示在畫面上其他應用程式的上層。"</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"移至右上方"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"移至左下方"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"移至右下方"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 9c760edb8a52..066e1596ef85 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -369,6 +369,8 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Kuvulwe ngo-<xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Kuze kube ngu-<xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="512534812963862137">"Itimu emnyama"</string> + <!-- no translation found for quick_settings_ui_mode_night_label_battery_saver (3496696903886673256) --> + <skip /> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"I-NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"I-NFC ikhutshaziwe"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"I-NFC inikwe amandla"</string> @@ -448,10 +450,8 @@ <string name="media_projection_remember_text" msgid="3103510882172746752">"Ungabonisi futhi"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"Sula konke"</string> <string name="manage_notifications_text" msgid="2386728145475108753">"Phatha"</string> - <!-- no translation found for notification_section_header_gentle (8356064473678167305) --> - <skip /> - <!-- no translation found for accessibility_notification_section_header_gentle_clear_all (4270384919249494640) --> - <skip /> + <string name="notification_section_header_gentle" msgid="8356064473678167305">"Izaziso ezimnene"</string> + <string name="accessibility_notification_section_header_gentle_clear_all" msgid="4270384919249494640">"Sula zonke izaziso ezimnene"</string> <string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Izaziso zimiswe okwesikhashana ukungaphazamisi"</string> <string name="media_projection_action_text" msgid="8470872969457985954">"Qala manje"</string> <string name="empty_shade_text" msgid="708135716272867002">"Azikho izaziso"</string> @@ -651,6 +651,10 @@ <string name="notification_unblockable_desc" msgid="4556908766584964102">"Lezi zaziso azikwazi ukushintshwa."</string> <string name="notification_multichannel_desc" msgid="4695920306092240550">"Leli qembu lezaziso alikwazi ukulungiselelwa lapha"</string> <string name="notification_delegate_header" msgid="2857691673814814270">"Isaziso sommeli"</string> + <!-- no translation found for notification_channel_dialog_title (5745335243729167866) --> + <skip /> + <!-- no translation found for see_more_title (5358726697042112726) --> + <skip /> <string name="appops_camera" msgid="8100147441602585776">"Lolu hlelo lokusebenza lusebenzisa ikhamera."</string> <string name="appops_microphone" msgid="741508267659494555">"Lolu hlelo lokusebenza lusebenzisa imakrofoni."</string> <string name="appops_overlay" msgid="6165912637560323464">"Lolu hlelo lokusebenza luboniswa ngaphezulu kwezinye izinhlelo zokusebenza kusikrini sakho."</string> @@ -926,4 +930,6 @@ <string name="bubble_accessibility_action_move_top_right" msgid="1671844272347036806">"Hambisa phezulu ngakwesokudla"</string> <string name="bubble_accessibility_action_move_bottom_left" msgid="206369104473183217">"Hambisa inkinobho ngakwesokunxele"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="8705660152384312329">"Hambisa inkinobho ngakwesokudla"</string> + <!-- no translation found for bubble_dismiss_text (8028337712674081668) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index fbb439af7c51..62974238cd9f 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -252,6 +252,9 @@ <!-- size at which Notification icons will be drawn on Ambient Display --> <dimen name="status_bar_icon_drawing_size_dark">@*android:dimen/notification_header_icon_size_ambient</dimen> + <!-- size of notification icons on AOD --> + <dimen name="dark_shelf_icon_size">16dp</dimen> + <!-- opacity at which Notification icons will be drawn in the status bar --> <item type="dimen" name="status_bar_icon_drawing_alpha">90%</item> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 26432210e233..f33974a553e3 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -288,8 +288,10 @@ <!-- Message shown when a biometric is authenticated, asking the user to confirm authentication [CHAR LIMIT=30] --> <string name="biometric_dialog_confirm">Confirm</string> - <!-- Button name on BiometricPrompt shown when a biometric is detected but not authenticated. Tapping the button resumes authentication [CHAR_LIMIT=30] --> + <!-- Button name on BiometricPrompt shown when a biometric is detected but not authenticated. Tapping the button resumes authentication [CHAR LIMIT=30] --> <string name="biometric_dialog_try_again">Try again</string> + <!-- Content description for empty spaces that are not taken by the biometric dialog. Clicking on these areas will cancel authentication and dismiss the biometric dialog [CHAR LIMIT=NONE] --> + <string name="biometric_dialog_empty_space_description">Empty region, tap to cancel authentication</string> <!-- Message shown when the system-provided fingerprint dialog is shown, asking for authentication --> <string name="fingerprint_dialog_touch_sensor">Touch the fingerprint sensor</string> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 16328f8f299f..59ed5cea2169 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -349,7 +349,7 @@ <style name="AutoSizingList"> <item name="enableAutoSizing">true</item> </style> - <style name="Theme.MediaProjectionAlertDialog" parent="android:Theme.DeviceDefault"> + <style name="Theme.SystemUI.MediaProjectionAlertDialog"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowContentOverlay">@null</item> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl index 670980420a57..577e3bbefdad 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl @@ -134,9 +134,4 @@ oneway interface IOverviewProxy { * Sent when some system ui state changes. */ void onSystemUiStateChanged(int stateFlags) = 16; - - /** - * Sent when the scrim colors (based on wallpaper) change. - */ - void onScrimColorsChanged(int color, int type) = 17; } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index d051defc1f25..0914fb8330be 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -20,6 +20,7 @@ import android.app.AlertDialog; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.res.ColorStateList; +import android.graphics.Rect; import android.metrics.LogMaker; import android.os.UserHandle; import android.util.AttributeSet; @@ -139,7 +140,6 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe getSecurityView(mCurrentSecuritySelection).onResume(reason); } updateBiometricRetry(); - updatePaddings(); } @Override @@ -180,7 +180,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe } int index = event.findPointerIndex(mActivePointerId); int touchSlop = mViewConfiguration.getScaledTouchSlop(); - if (mCurrentSecurityView != null + if (mCurrentSecurityView != null && index != -1 && mStartTouchY - event.getY(index) > touchSlop) { mIsDragging = true; return true; @@ -319,17 +319,11 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe } @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - updatePaddings(); - } - - private void updatePaddings() { - int bottomPadding = getRootWindowInsets().getSystemWindowInsets().bottom; - if (getPaddingBottom() == bottomPadding) { - return; - } - setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), bottomPadding); + protected boolean fitSystemWindows(Rect insets) { + // Consume bottom insets because we're setting the padding locally (for IME and navbar.) + setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), insets.bottom); + insets.bottom = 0; + return false; } private void showDialog(String title, String message) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java index f99587b6cdc2..a70ebb38944e 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java @@ -33,7 +33,6 @@ import android.util.DisplayMetrics; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; @@ -228,9 +227,6 @@ public abstract class BiometricDialogView extends LinearLayout { showTryAgainButton(false /* show */); mCallback.onTryAgainPressed(); }); - - mLayout.setFocusableInTouchMode(true); - mLayout.requestFocus(); } public void onSaveState(Bundle bundle) { @@ -278,7 +274,6 @@ public abstract class BiometricDialogView extends LinearLayout { mTitleText.setVisibility(View.VISIBLE); mTitleText.setText(titleText); - mTitleText.setSelected(true); final CharSequence subtitleText = mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE); if (TextUtils.isEmpty(subtitleText)) { @@ -323,11 +318,10 @@ public abstract class BiometricDialogView extends LinearLayout { private void setDismissesDialog(View v) { v.setClickable(true); - v.setOnTouchListener((View view, MotionEvent event) -> { + v.setOnClickListener(v1 -> { if (mState != STATE_AUTHENTICATED && shouldGrayAreaDismissDialog()) { mCallback.onUserCanceled(); } - return true; }); } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BadgeRenderer.java b/packages/SystemUI/src/com/android/systemui/bubbles/BadgeRenderer.java index 845b08483064..74ad0faca6d3 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BadgeRenderer.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BadgeRenderer.java @@ -18,12 +18,15 @@ package com.android.systemui.bubbles; import static android.graphics.Paint.ANTI_ALIAS_FLAG; import static android.graphics.Paint.FILTER_BITMAP_FLAG; +import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.util.Log; +import com.android.systemui.R; + // XXX: Mostly opied from launcher code / can we share? /** * Contains parameters necessary to draw a badge for an icon (e.g. the size of the badge). @@ -32,20 +35,31 @@ public class BadgeRenderer { private static final String TAG = "BadgeRenderer"; - // The badge sizes are defined as percentages of the app icon size. + /** The badge sizes are defined as percentages of the app icon size. */ private static final float SIZE_PERCENTAGE = 0.38f; - // Extra scale down of the dot + /** Extra scale down of the dot. */ private static final float DOT_SCALE = 0.6f; private final float mDotCenterOffset; private final float mCircleRadius; private final Paint mCirclePaint = new Paint(ANTI_ALIAS_FLAG | FILTER_BITMAP_FLAG); - public BadgeRenderer(int iconSizePx) { - mDotCenterOffset = SIZE_PERCENTAGE * iconSizePx; - int size = (int) (DOT_SCALE * mDotCenterOffset); - mCircleRadius = size / 2f; + public BadgeRenderer(Context context) { + mDotCenterOffset = getDotCenterOffset(context); + mCircleRadius = getDotRadius(mDotCenterOffset); + } + + /** Space between the center of the dot and the top or left of the bubble stack. */ + static float getDotCenterOffset(Context context) { + final int iconSizePx = + context.getResources().getDimensionPixelSize(R.dimen.individual_bubble_size); + return SIZE_PERCENTAGE * iconSizePx; + } + + static float getDotRadius(float dotCenterOffset) { + int size = (int) (DOT_SCALE * dotCenterOffset); + return size / 2f; } /** diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java index f15e8e47649c..783780f8819c 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BadgedImageView.java @@ -57,7 +57,7 @@ public class BadgedImageView extends ImageView { int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); mIconSize = getResources().getDimensionPixelSize(R.dimen.individual_bubble_size); - mDotRenderer = new BadgeRenderer(mIconSize); + mDotRenderer = new BadgeRenderer(getContext()); TypedArray ta = context.obtainStyledAttributes( new int[] {android.R.attr.colorBackgroundFloating}); @@ -83,6 +83,10 @@ public class BadgedImageView extends ImageView { invalidate(); } + public boolean getDotPosition() { + return mOnLeft; + } + /** * Set whether the dot should show or not. */ diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java index ac4a93ba7fb0..8aad0f8bd831 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java @@ -83,7 +83,7 @@ class Bubble { public void updateDotVisibility() { if (iconView != null) { - iconView.updateDotVisibility(); + iconView.updateDotVisibility(true /* animate */); } } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleFlyoutView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleFlyoutView.java new file mode 100644 index 000000000000..71f68c16bd8d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleFlyoutView.java @@ -0,0 +1,412 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.bubbles; + +import static android.graphics.Paint.ANTI_ALIAS_FLAG; +import static android.graphics.Paint.FILTER_BITMAP_FLAG; + +import android.animation.ArgbEvaluator; +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.Outline; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PointF; +import android.graphics.RectF; +import android.graphics.drawable.ShapeDrawable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewOutlineProvider; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.dynamicanimation.animation.DynamicAnimation; +import androidx.dynamicanimation.animation.SpringAnimation; + +import com.android.systemui.R; +import com.android.systemui.recents.TriangleShape; + +/** + * Flyout view that appears as a 'chat bubble' alongside the bubble stack. The flyout can visually + * transform into the 'new' dot, which is used during flyout dismiss animations/gestures. + */ +public class BubbleFlyoutView extends FrameLayout { + /** Max width of the flyout, in terms of percent of the screen width. */ + private static final float FLYOUT_MAX_WIDTH_PERCENT = .6f; + + private final int mFlyoutPadding; + private final int mFlyoutSpaceFromBubble; + private final int mPointerSize; + private final int mBubbleSize; + private final int mFlyoutElevation; + private final int mBubbleElevation; + private final int mFloatingBackgroundColor; + private final float mCornerRadius; + + private final ViewGroup mFlyoutTextContainer; + private final TextView mFlyoutText; + /** Spring animation for the flyout. */ + private final SpringAnimation mFlyoutSpring = + new SpringAnimation(this, DynamicAnimation.TRANSLATION_X); + + /** Values related to the 'new' dot which we use to figure out where to collapse the flyout. */ + private final float mNewDotRadius; + private final float mNewDotSize; + private final float mNewDotOffsetFromBubbleBounds; + + /** + * The paint used to draw the background, whose color changes as the flyout transitions to the + * tinted 'new' dot. + */ + private final Paint mBgPaint = new Paint(ANTI_ALIAS_FLAG | FILTER_BITMAP_FLAG); + private final ArgbEvaluator mArgbEvaluator = new ArgbEvaluator(); + + /** + * Triangular ShapeDrawables used for the triangle that points from the flyout to the bubble + * stack (a chat-bubble effect). + */ + private final ShapeDrawable mLeftTriangleShape; + private final ShapeDrawable mRightTriangleShape; + + /** Whether the flyout arrow is on the left (pointing left) or right (pointing right). */ + private boolean mArrowPointingLeft = true; + + /** Color of the 'new' dot that the flyout will transform into. */ + private int mDotColor; + + /** The outline of the triangle, used for elevation shadows. */ + private final Outline mTriangleOutline = new Outline(); + + /** The bounds of the flyout background, kept up to date as it transitions to the 'new' dot. */ + private final RectF mBgRect = new RectF(); + + /** + * Percent progress in the transition from flyout to 'new' dot. These two values are the inverse + * of each other (if we're 40% transitioned to the dot, we're 60% flyout), but it makes the code + * much more readable. + */ + private float mPercentTransitionedToDot = 1f; + private float mPercentStillFlyout = 0f; + + /** + * The difference in values between the flyout and the dot. These differences are gradually + * added over the course of the animation to transform the flyout into the 'new' dot. + */ + private float mFlyoutToDotWidthDelta = 0f; + private float mFlyoutToDotHeightDelta = 0f; + private float mFlyoutToDotCornerRadiusDelta; + + /** The translation values when the flyout is completely transitioned into the dot. */ + private float mTranslationXWhenDot = 0f; + private float mTranslationYWhenDot = 0f; + + /** + * The current translation values applied to the flyout background as it transitions into the + * 'new' dot. + */ + private float mBgTranslationX; + private float mBgTranslationY; + + /** The flyout's X translation when at rest (not animating or dragging). */ + private float mRestingTranslationX = 0f; + + /** Callback to run when the flyout is hidden. */ + private Runnable mOnHide; + + public BubbleFlyoutView(Context context) { + super(context); + LayoutInflater.from(context).inflate(R.layout.bubble_flyout, this, true); + + mFlyoutTextContainer = findViewById(R.id.bubble_flyout_text_container); + mFlyoutText = mFlyoutTextContainer.findViewById(R.id.bubble_flyout_text); + + final Resources res = getResources(); + mFlyoutPadding = res.getDimensionPixelSize(R.dimen.bubble_flyout_padding_x); + mFlyoutSpaceFromBubble = res.getDimensionPixelSize(R.dimen.bubble_flyout_space_from_bubble); + mPointerSize = res.getDimensionPixelSize(R.dimen.bubble_flyout_pointer_size); + mBubbleSize = res.getDimensionPixelSize(R.dimen.individual_bubble_size); + mBubbleElevation = res.getDimensionPixelSize(R.dimen.bubble_elevation); + mFlyoutElevation = res.getDimensionPixelSize(R.dimen.bubble_flyout_elevation); + mNewDotOffsetFromBubbleBounds = BadgeRenderer.getDotCenterOffset(context); + mNewDotRadius = BadgeRenderer.getDotRadius(mNewDotOffsetFromBubbleBounds); + mNewDotSize = mNewDotRadius * 2f; + + final TypedArray ta = mContext.obtainStyledAttributes( + new int[] { + android.R.attr.colorBackgroundFloating, + android.R.attr.dialogCornerRadius}); + mFloatingBackgroundColor = ta.getColor(0, Color.WHITE); + mCornerRadius = ta.getDimensionPixelSize(1, 0); + mFlyoutToDotCornerRadiusDelta = mNewDotRadius - mCornerRadius; + ta.recycle(); + + // Add padding for the pointer on either side, onDraw will draw it in this space. + setPadding(mPointerSize, 0, mPointerSize, 0); + setWillNotDraw(false); + setClipChildren(false); + setTranslationZ(mFlyoutElevation); + setOutlineProvider(new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + BubbleFlyoutView.this.getOutline(outline); + } + }); + + mBgPaint.setColor(mFloatingBackgroundColor); + + mLeftTriangleShape = + new ShapeDrawable(TriangleShape.createHorizontal( + mPointerSize, mPointerSize, true /* isPointingLeft */)); + mLeftTriangleShape.setBounds(0, 0, mPointerSize, mPointerSize); + mLeftTriangleShape.getPaint().setColor(mFloatingBackgroundColor); + + mRightTriangleShape = + new ShapeDrawable(TriangleShape.createHorizontal( + mPointerSize, mPointerSize, false /* isPointingLeft */)); + mRightTriangleShape.setBounds(0, 0, mPointerSize, mPointerSize); + mRightTriangleShape.getPaint().setColor(mFloatingBackgroundColor); + } + + @Override + protected void onDraw(Canvas canvas) { + renderBackground(canvas); + invalidateOutline(); + super.onDraw(canvas); + } + + /** Configures the flyout and animates it in. */ + void showFlyout( + CharSequence updateMessage, PointF stackPos, float parentWidth, + boolean arrowPointingLeft, int dotColor, Runnable onHide) { + mArrowPointingLeft = arrowPointingLeft; + mDotColor = dotColor; + mOnHide = onHide; + + setCollapsePercent(0f); + setAlpha(0f); + setVisibility(VISIBLE); + + // Set the flyout TextView's max width in terms of percent, and then subtract out the + // padding so that the entire flyout view will be the desired width (rather than the + // TextView being the desired width + extra padding). + mFlyoutText.setMaxWidth( + (int) (parentWidth * FLYOUT_MAX_WIDTH_PERCENT) - mFlyoutPadding * 2); + mFlyoutText.setText(updateMessage); + + // Wait for the TextView to lay out so we know its line count. + post(() -> { + // Multi line flyouts get top-aligned to the bubble. + if (mFlyoutText.getLineCount() > 1) { + setTranslationY(stackPos.y); + } else { + // Single line flyouts are vertically centered with respect to the bubble. + setTranslationY( + stackPos.y + (mBubbleSize - mFlyoutTextContainer.getHeight()) / 2f); + } + + // Calculate the translation required to position the flyout next to the bubble stack, + // with the desired padding. + mRestingTranslationX = mArrowPointingLeft + ? stackPos.x + mBubbleSize + mFlyoutSpaceFromBubble + : stackPos.x - getWidth() - mFlyoutSpaceFromBubble; + + // Translate towards the stack slightly. + setTranslationX( + mRestingTranslationX + (arrowPointingLeft ? -mBubbleSize : mBubbleSize)); + + // Fade in the entire flyout and spring it to its normal position. + animate().alpha(1f); + mFlyoutSpring.animateToFinalPosition(mRestingTranslationX); + + // Calculate the difference in size between the flyout and the 'dot' so that we can + // transform into the dot later. + mFlyoutToDotWidthDelta = getWidth() - mNewDotSize; + mFlyoutToDotHeightDelta = getHeight() - mNewDotSize; + + // Calculate the translation values needed to be in the correct 'new dot' position. + final float distanceFromFlyoutLeftToDotCenterX = + mFlyoutSpaceFromBubble + mNewDotOffsetFromBubbleBounds / 2; + if (mArrowPointingLeft) { + mTranslationXWhenDot = -distanceFromFlyoutLeftToDotCenterX - mNewDotRadius; + } else { + mTranslationXWhenDot = + getWidth() + distanceFromFlyoutLeftToDotCenterX - mNewDotRadius; + } + + mTranslationYWhenDot = + getHeight() / 2f + - mNewDotRadius + - mBubbleSize / 2f + + mNewDotOffsetFromBubbleBounds / 2; + }); + } + + /** + * Hides the flyout and runs the optional callback passed into showFlyout. The flyout has been + * animated into the 'new' dot by the time we call this, so no animations are needed. + */ + void hideFlyout() { + if (mOnHide != null) { + mOnHide.run(); + mOnHide = null; + } + + setVisibility(GONE); + } + + /** Sets the percentage that the flyout should be collapsed into dot form. */ + void setCollapsePercent(float percentCollapsed) { + mPercentTransitionedToDot = Math.max(0f, Math.min(percentCollapsed, 1f)); + mPercentStillFlyout = (1f - mPercentTransitionedToDot); + + // Move and fade out the text. + mFlyoutText.setTranslationX( + (mArrowPointingLeft ? -getWidth() : getWidth()) * mPercentTransitionedToDot); + mFlyoutText.setAlpha(clampPercentage( + (mPercentStillFlyout - (1f - BubbleStackView.FLYOUT_DRAG_PERCENT_DISMISS)) + / BubbleStackView.FLYOUT_DRAG_PERCENT_DISMISS)); + + // Reduce the elevation towards that of the topmost bubble. + setTranslationZ( + mFlyoutElevation + - (mFlyoutElevation - mBubbleElevation) * mPercentTransitionedToDot); + invalidate(); + } + + /** Return the flyout's resting X translation (translation when not dragging or animating). */ + float getRestingTranslationX() { + return mRestingTranslationX; + } + + /** Clamps a float to between 0 and 1. */ + private float clampPercentage(float percent) { + return Math.min(1f, Math.max(0f, percent)); + } + + /** + * Renders the background, which is either the rounded 'chat bubble' flyout, or some state + * between that and the 'new' dot over the bubbles. + */ + private void renderBackground(Canvas canvas) { + // Calculate the width, height, and corner radius of the flyout given the current collapsed + // percentage. + final float width = getWidth() - (mFlyoutToDotWidthDelta * mPercentTransitionedToDot); + final float height = getHeight() - (mFlyoutToDotHeightDelta * mPercentTransitionedToDot); + final float cornerRadius = mCornerRadius + - (mFlyoutToDotCornerRadiusDelta * mPercentTransitionedToDot); + + // Translate the flyout background towards the collapsed 'dot' state. + mBgTranslationX = mTranslationXWhenDot * mPercentTransitionedToDot; + mBgTranslationY = mTranslationYWhenDot * mPercentTransitionedToDot; + + // Set the bounds of the rounded rectangle that serves as either the flyout background or + // the collapsed 'dot'. These bounds will also be used to provide the outline for elevation + // shadows. In the expanded flyout state, the left and right bounds leave space for the + // pointer triangle - as the flyout collapses, this space is reduced since the triangle + // retracts into the flyout. + mBgRect.set( + mPointerSize * mPercentStillFlyout /* left */, + 0 /* top */, + width - mPointerSize * mPercentStillFlyout /* right */, + height /* bottom */); + + mBgPaint.setColor( + (int) mArgbEvaluator.evaluate( + mPercentTransitionedToDot, mFloatingBackgroundColor, mDotColor)); + + canvas.save(); + canvas.translate(mBgTranslationX, mBgTranslationY); + renderPointerTriangle(canvas, width, height); + canvas.drawRoundRect(mBgRect, cornerRadius, cornerRadius, mBgPaint); + canvas.restore(); + } + + /** Renders the 'pointer' triangle that points from the flyout to the bubble stack. */ + private void renderPointerTriangle( + Canvas canvas, float currentFlyoutWidth, float currentFlyoutHeight) { + canvas.save(); + + // Translation to apply for the 'retraction' effect as the flyout collapses. + final float retractionTranslationX = + (mArrowPointingLeft ? 1 : -1) * (mPercentTransitionedToDot * mPointerSize * 2f); + + // Place the arrow either at the left side, or the far right, depending on whether the + // flyout is on the left or right side. + final float arrowTranslationX = + mArrowPointingLeft + ? retractionTranslationX + : currentFlyoutWidth - mPointerSize + retractionTranslationX; + + // Vertically center the arrow at all times. + final float arrowTranslationY = currentFlyoutHeight / 2f - mPointerSize / 2f; + + // Draw the appropriate direction of arrow. + final ShapeDrawable relevantTriangle = + mArrowPointingLeft ? mLeftTriangleShape : mRightTriangleShape; + canvas.translate(arrowTranslationX, arrowTranslationY); + relevantTriangle.setAlpha((int) (255f * mPercentStillFlyout)); + relevantTriangle.draw(canvas); + + // Save the triangle's outline for use in the outline provider, offsetting it to reflect its + // current position. + relevantTriangle.getOutline(mTriangleOutline); + mTriangleOutline.offset((int) arrowTranslationX, (int) arrowTranslationY); + + canvas.restore(); + } + + /** Builds an outline that includes the transformed flyout background and triangle. */ + private void getOutline(Outline outline) { + if (!mTriangleOutline.isEmpty()) { + // Draw the rect into the outline as a path so we can merge the triangle path into it. + final Path rectPath = new Path(); + rectPath.addRoundRect(mBgRect, mCornerRadius, mCornerRadius, Path.Direction.CW); + outline.setConvexPath(rectPath); + + // Get rid of the triangle path once it has disappeared behind the flyout. + if (mPercentStillFlyout > 0.5f) { + outline.mPath.addPath(mTriangleOutline.mPath); + } + + // Translate the outline to match the background's position. + final Matrix outlineMatrix = new Matrix(); + outlineMatrix.postTranslate(getLeft() + mBgTranslationX, getTop() + mBgTranslationY); + + // At the very end, retract the outline into the bubble so the shadow will be pulled + // into the flyout-dot as it (visually) becomes part of the bubble. We can't do this by + // animating translationZ to zero since then it'll go under the bubbles, which have + // elevation. + if (mPercentTransitionedToDot > 0.98f) { + final float percentBetween99and100 = (mPercentTransitionedToDot - 0.98f) / .02f; + final float percentShadowVisible = 1f - percentBetween99and100; + + // Keep it centered. + outlineMatrix.postTranslate( + mNewDotRadius * percentBetween99and100, + mNewDotRadius * percentBetween99and100); + outlineMatrix.preScale(percentShadowVisible, percentShadowVisible); + } + + outline.mPath.transform(outlineMatrix); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 2b1742592fba..4fef157183c2 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -25,8 +25,6 @@ import android.animation.ValueAnimator; import android.annotation.NonNull; import android.content.Context; import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Color; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Outline; @@ -35,8 +33,6 @@ import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; -import android.graphics.drawable.LayerDrawable; -import android.graphics.drawable.ShapeDrawable; import android.os.Bundle; import android.os.VibrationEffect; import android.os.Vibrator; @@ -56,11 +52,11 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.FrameLayout; -import android.widget.TextView; import androidx.annotation.MainThread; import androidx.annotation.Nullable; import androidx.dynamicanimation.animation.DynamicAnimation; +import androidx.dynamicanimation.animation.FloatPropertyCompat; import androidx.dynamicanimation.animation.SpringAnimation; import androidx.dynamicanimation.animation.SpringForce; @@ -70,7 +66,6 @@ import com.android.systemui.R; import com.android.systemui.bubbles.animation.ExpandedAnimationController; import com.android.systemui.bubbles.animation.PhysicsAnimationLayout; import com.android.systemui.bubbles.animation.StackAnimationController; -import com.android.systemui.recents.TriangleShape; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import java.math.BigDecimal; @@ -86,12 +81,21 @@ public class BubbleStackView extends FrameLayout { private static final String TAG = "BubbleStackView"; private static final boolean DEBUG = false; + /** How far the flyout needs to be dragged before it's dismissed regardless of velocity. */ + static final float FLYOUT_DRAG_PERCENT_DISMISS = 0.25f; + + /** Velocity required to dismiss the flyout via drag. */ + private static final float FLYOUT_DISMISS_VELOCITY = 2000f; + + /** + * Factor for attenuating translation when the flyout is overscrolled (8f = flyout moves 1 pixel + * for every 8 pixels overscrolled). + */ + private static final float FLYOUT_OVERSCROLL_ATTENUATION_FACTOR = 8f; + /** Duration of the flyout alpha animations. */ private static final int FLYOUT_ALPHA_ANIMATION_DURATION = 100; - /** Max width of the flyout, in terms of percent of the screen width. */ - private static final float FLYOUT_MAX_WIDTH_PERCENT = .6f; - /** Percent to darken the bubbles when they're in the dismiss target. */ private static final float DARKEN_PERCENT = 0.3f; @@ -152,17 +156,9 @@ public class BubbleStackView extends FrameLayout { private FrameLayout mExpandedViewContainer; - private FrameLayout mFlyoutContainer; - private FrameLayout mFlyout; - private TextView mFlyoutText; - private ShapeDrawable mLeftFlyoutTriangle; - private ShapeDrawable mRightFlyoutTriangle; - /** Spring animation for the flyout. */ - private SpringAnimation mFlyoutSpring; + private BubbleFlyoutView mFlyout; /** Runnable that fades out the flyout and then sets it to GONE. */ - private Runnable mHideFlyout = - () -> mFlyoutContainer.animate().alpha(0f).withEndAction( - () -> mFlyoutContainer.setVisibility(GONE)); + private Runnable mHideFlyout = () -> animateFlyoutCollapsed(true, 0 /* velX */); /** Layout change listener that moves the stack to the nearest valid position on rotation. */ private OnLayoutChangeListener mMoveStackToValidPositionOnLayoutListener; @@ -176,9 +172,6 @@ public class BubbleStackView extends FrameLayout { private int mBubbleSize; private int mBubblePadding; - private int mFlyoutPadding; - private int mFlyoutSpaceFromBubble; - private int mPointerSize; private int mExpandedAnimateXDistance; private int mExpandedAnimateYDistance; private int mStatusBarHeight; @@ -189,8 +182,11 @@ public class BubbleStackView extends FrameLayout { private boolean mIsExpanded; private boolean mImeVisible; - /** Whether the stack is currently being dragged. */ - private boolean mIsDragging = false; + /** Whether the stack is currently on the left side of the screen, or animating there. */ + private boolean mStackOnLeftOrWillBe = false; + + /** Whether a touch gesture, such as a stack/bubble drag or flyout drag, is in progress. */ + private boolean mIsGestureInProgress = false; private BubbleTouchHandler mTouchHandler; private BubbleController.BubbleExpandListener mExpandListener; @@ -249,6 +245,40 @@ public class BubbleStackView extends FrameLayout { } }; + /** Float property that 'drags' the flyout. */ + private final FloatPropertyCompat mFlyoutCollapseProperty = + new FloatPropertyCompat("FlyoutCollapseSpring") { + @Override + public float getValue(Object o) { + return mFlyoutDragDeltaX; + } + + @Override + public void setValue(Object o, float v) { + onFlyoutDragged(v); + } + }; + + /** SpringAnimation that springs the flyout collapsed via onFlyoutDragged. */ + private final SpringAnimation mFlyoutTransitionSpring = + new SpringAnimation(this, mFlyoutCollapseProperty); + + /** Distance the flyout has been dragged in the X axis. */ + private float mFlyoutDragDeltaX = 0f; + + /** + * End listener for the flyout spring that either posts a runnable to hide the flyout, or hides + * it immediately. + */ + private final DynamicAnimation.OnAnimationEndListener mAfterFlyoutTransitionSpring = + (dynamicAnimation, b, v, v1) -> { + if (mFlyoutDragDeltaX == 0) { + mFlyout.postDelayed(mHideFlyout, FLYOUT_HIDE_AFTER); + } else { + mFlyout.hideFlyout(); + } + }; + @NonNull private final SurfaceSynchronizer mSurfaceSynchronizer; private BubbleDismissView mDismissContainer; @@ -267,9 +297,6 @@ public class BubbleStackView extends FrameLayout { Resources res = getResources(); mBubbleSize = res.getDimensionPixelSize(R.dimen.individual_bubble_size); mBubblePadding = res.getDimensionPixelSize(R.dimen.bubble_padding); - mFlyoutPadding = res.getDimensionPixelSize(R.dimen.bubble_flyout_padding_x); - mFlyoutSpaceFromBubble = res.getDimensionPixelSize(R.dimen.bubble_flyout_space_from_bubble); - mPointerSize = res.getDimensionPixelSize(R.dimen.bubble_flyout_pointer_size); mExpandedAnimateXDistance = res.getDimensionPixelSize(R.dimen.bubble_expanded_animate_x_distance); mExpandedAnimateYDistance = @@ -307,17 +334,24 @@ public class BubbleStackView extends FrameLayout { mExpandedViewContainer.setClipChildren(false); addView(mExpandedViewContainer); - mFlyoutContainer = (FrameLayout) mInflater.inflate(R.layout.bubble_flyout, this, false); - mFlyoutContainer.setVisibility(GONE); - mFlyoutContainer.setClipToPadding(false); - mFlyoutContainer.setClipChildren(false); - mFlyoutContainer.animate() + mFlyout = new BubbleFlyoutView(context); + mFlyout.setVisibility(GONE); + mFlyout.animate() .setDuration(FLYOUT_ALPHA_ANIMATION_DURATION) .setInterpolator(new AccelerateDecelerateInterpolator()); + addView(mFlyout, new FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)); + + mFlyoutTransitionSpring.setSpring(new SpringForce() + .setStiffness(SpringForce.STIFFNESS_MEDIUM) + .setDampingRatio(SpringForce.DAMPING_RATIO_LOW_BOUNCY)); + mFlyoutTransitionSpring.addEndListener(mAfterFlyoutTransitionSpring); - mFlyout = mFlyoutContainer.findViewById(R.id.bubble_flyout); - addView(mFlyoutContainer); - setupFlyout(); + mDismissContainer = new BubbleDismissView(mContext); + mDismissContainer.setLayoutParams(new FrameLayout.LayoutParams( + MATCH_PARENT, + getResources().getDimensionPixelSize(R.dimen.pip_dismiss_gradient_height), + Gravity.BOTTOM)); + addView(mDismissContainer); mDismissContainer = new BubbleDismissView(mContext); mDismissContainer.setLayoutParams(new FrameLayout.LayoutParams( @@ -742,7 +776,7 @@ public class BubbleStackView extends FrameLayout { } // Outside parts of view we care about. return null; - } else if (mFlyoutContainer.getVisibility() == VISIBLE && isIntersecting(mFlyout, x, y)) { + } else if (mFlyout.getVisibility() == VISIBLE && isIntersecting(mFlyout, x, y)) { return mFlyout; } @@ -931,7 +965,6 @@ public class BubbleStackView extends FrameLayout { mBubbleContainer.setController(mStackAnimationController); hideFlyoutImmediate(); - mIsDragging = true; mDraggingInDismissTarget = false; } @@ -948,20 +981,87 @@ public class BubbleStackView extends FrameLayout { if (DEBUG) { Log.d(TAG, "onDragFinish"); } - // TODO: Add fling to bottom to dismiss. - mIsDragging = false; if (mIsExpanded || mIsExpansionAnimating) { return; } - mStackAnimationController.flingStackThenSpringToEdge(x, velX, velY); + final float newStackX = mStackAnimationController.flingStackThenSpringToEdge(x, velX, velY); logBubbleEvent(null /* no bubble associated with bubble stack move */, StatsLog.BUBBLE_UICHANGED__ACTION__STACK_MOVED); + mStackOnLeftOrWillBe = newStackX <= 0; + updateBubbleShadowsAndDotPosition(true /* animate */); springOutDismissTargetAndHideCircle(); } + void onFlyoutDragStart() { + mFlyout.removeCallbacks(mHideFlyout); + } + + void onFlyoutDragged(float deltaX) { + final boolean onLeft = mStackAnimationController.isStackOnLeftSide(); + mFlyoutDragDeltaX = deltaX; + + final float collapsePercent = + onLeft ? -deltaX / mFlyout.getWidth() : deltaX / mFlyout.getWidth(); + mFlyout.setCollapsePercent(Math.min(1f, Math.max(0f, collapsePercent))); + + // Calculate how to translate the flyout if it has been dragged too far in etiher direction. + float overscrollTranslation = 0f; + if (collapsePercent < 0f || collapsePercent > 1f) { + // Whether we are more than 100% transitioned to the dot. + final boolean overscrollingPastDot = collapsePercent > 1f; + + // Whether we are overscrolling physically to the left - this can either be pulling the + // flyout away from the stack (if the stack is on the right) or pushing it to the left + // after it has already become the dot. + final boolean overscrollingLeft = + (onLeft && collapsePercent > 1f) || (!onLeft && collapsePercent < 0f); + + overscrollTranslation = + (overscrollingPastDot ? collapsePercent - 1f : collapsePercent * -1) + * (overscrollingLeft ? -1 : 1) + * (mFlyout.getWidth() / (FLYOUT_OVERSCROLL_ATTENUATION_FACTOR + // Attenuate the smaller dot less than the larger flyout. + / (overscrollingPastDot ? 2 : 1))); + } + + mFlyout.setTranslationX(mFlyout.getRestingTranslationX() + overscrollTranslation); + } + + /** + * Called when the flyout drag has finished, and returns true if the gesture successfully + * dismissed the flyout. + */ + void onFlyoutDragFinished(float deltaX, float velX) { + final boolean onLeft = mStackAnimationController.isStackOnLeftSide(); + final boolean metRequiredVelocity = + onLeft ? velX < -FLYOUT_DISMISS_VELOCITY : velX > FLYOUT_DISMISS_VELOCITY; + final boolean metRequiredDeltaX = + onLeft + ? deltaX < -mFlyout.getWidth() * FLYOUT_DRAG_PERCENT_DISMISS + : deltaX > mFlyout.getWidth() * FLYOUT_DRAG_PERCENT_DISMISS; + final boolean isCancelFling = onLeft ? velX > 0 : velX < 0; + final boolean shouldDismiss = metRequiredVelocity || (metRequiredDeltaX && !isCancelFling); + + mFlyout.removeCallbacks(mHideFlyout); + animateFlyoutCollapsed(shouldDismiss, velX); + } + + /** + * Called when the first touch event of a gesture (stack drag, bubble drag, flyout drag, etc.) + * is received. + */ + void onGestureStart() { + mIsGestureInProgress = true; + } + + /** Called when a gesture is completed or cancelled. */ + void onGestureFinished() { + mIsGestureInProgress = false; + } + /** Prepares and starts the desaturate/darken animation on the bubble stack. */ private void animateDesaturateAndDarken(View targetView, boolean desaturateAndDarken) { mDesaturateAndDarkenTargetView = targetView; @@ -1119,12 +1219,22 @@ public class BubbleStackView extends FrameLayout { mShowingDismiss = false; } - /** Whether the location of the given MotionEvent is within the dismiss target area. */ - public boolean isInDismissTarget(MotionEvent ev) { + boolean isInDismissTarget(MotionEvent ev) { return isIntersecting(mDismissContainer.getDismissTarget(), ev.getRawX(), ev.getRawY()); } + /** Animates the flyout collapsed (to dot), or the reverse, starting with the given velocity. */ + private void animateFlyoutCollapsed(boolean collapsed, float velX) { + final boolean onLeft = mStackAnimationController.isStackOnLeftSide(); + mFlyoutTransitionSpring + .setStartValue(mFlyoutDragDeltaX) + .setStartVelocity(velX) + .animateToFinalPosition(collapsed + ? (onLeft ? -mFlyout.getWidth() : mFlyout.getWidth()) + : 0f); + } + /** * Calculates how large the expanded view of the bubble can be. This takes into account the * y position when the bubbles are expanded as well as the bounds of the dismiss target. @@ -1161,55 +1271,27 @@ public class BubbleStackView extends FrameLayout { final CharSequence updateMessage = bubble.entry.getUpdateMessage(getContext()); // Show the message if one exists, and we're not expanded or animating expansion. - if (updateMessage != null && !isExpanded() && !mIsExpansionAnimating && !mIsDragging) { - final PointF stackPos = mStackAnimationController.getStackPosition(); - - // Set the flyout TextView's max width in terms of percent, and then subtract out the - // padding so that the entire flyout view will be the desired width (rather than the - // TextView being the desired width + extra padding). - mFlyoutText.setMaxWidth( - (int) (getWidth() * FLYOUT_MAX_WIDTH_PERCENT) - mFlyoutPadding * 2); - - mFlyoutContainer.setAlpha(0f); - mFlyoutContainer.setVisibility(VISIBLE); - - mFlyoutText.setText(updateMessage); - - final boolean onLeft = mStackAnimationController.isStackOnLeftSide(); - - if (onLeft) { - mLeftFlyoutTriangle.setAlpha(255); - mRightFlyoutTriangle.setAlpha(0); - } else { - mLeftFlyoutTriangle.setAlpha(0); - mRightFlyoutTriangle.setAlpha(255); + if (updateMessage != null + && !isExpanded() + && !mIsExpansionAnimating + && !mIsGestureInProgress) { + if (bubble.iconView != null) { + bubble.iconView.setSuppressDot(true /* suppressDot */, false /* animate */); + mFlyoutDragDeltaX = 0f; + mFlyout.setAlpha(0f); + + // Post in case layout isn't complete and getWidth returns 0. + post(() -> mFlyout.showFlyout( + updateMessage, mStackAnimationController.getStackPosition(), getWidth(), + mStackAnimationController.isStackOnLeftSide(), + bubble.iconView.getBadgeColor(), + () -> { + bubble.iconView.setSuppressDot( + false /* suppressDot */, false /* animate */); + })); } - - mFlyoutContainer.post(() -> { - // Multi line flyouts get top-aligned to the bubble. - if (mFlyoutText.getLineCount() > 1) { - mFlyoutContainer.setTranslationY(stackPos.y); - } else { - // Single line flyouts are vertically centered with respect to the bubble. - mFlyoutContainer.setTranslationY( - stackPos.y + (mBubbleSize - mFlyout.getHeight()) / 2f); - } - - final float destinationX = onLeft - ? stackPos.x + mBubbleSize + mFlyoutSpaceFromBubble - : stackPos.x - mFlyoutContainer.getWidth() - mFlyoutSpaceFromBubble; - - // Translate towards the stack slightly, then spring out from the stack. - mFlyoutContainer.setTranslationX( - destinationX + (onLeft ? -mBubblePadding : mBubblePadding)); - - mFlyoutContainer.animate().alpha(1f); - mFlyoutSpring.animateToFinalPosition(destinationX); - - mFlyout.removeCallbacks(mHideFlyout); - mFlyout.postDelayed(mHideFlyout, FLYOUT_HIDE_AFTER); - }); - + mFlyout.removeCallbacks(mHideFlyout); + mFlyout.postDelayed(mHideFlyout, FLYOUT_HIDE_AFTER); logBubbleEvent(bubble, StatsLog.BUBBLE_UICHANGED__ACTION__FLYOUT); } } @@ -1217,7 +1299,7 @@ public class BubbleStackView extends FrameLayout { /** Hide the flyout immediately and cancel any pending hide runnables. */ private void hideFlyoutImmediate() { mFlyout.removeCallbacks(mHideFlyout); - mHideFlyout.run(); + mFlyout.hideFlyout(); } @Override @@ -1230,7 +1312,7 @@ public class BubbleStackView extends FrameLayout { mBubbleContainer.getBoundsOnScreen(outRect); } - if (mFlyoutContainer.getVisibility() == View.VISIBLE) { + if (mFlyout.getVisibility() == View.VISIBLE) { final Rect flyoutBounds = new Rect(); mFlyout.getBoundsOnScreen(flyoutBounds); outRect.union(flyoutBounds); @@ -1287,78 +1369,11 @@ public class BubbleStackView extends FrameLayout { } } - /** Sets up the flyout views and drawables. */ - private void setupFlyout() { - // Retrieve the styled floating background color. - TypedArray ta = mContext.obtainStyledAttributes( - new int[]{android.R.attr.colorBackgroundFloating}); - final int floatingBackgroundColor = ta.getColor(0, Color.WHITE); - ta.recycle(); - - // Retrieve the flyout background, which is currently a rounded white rectangle with a - // shadow but no triangular arrow pointing anywhere. - final LayerDrawable flyoutBackground = (LayerDrawable) mFlyout.getBackground(); - - // Create the triangle drawables and set their color. - mLeftFlyoutTriangle = - new ShapeDrawable(TriangleShape.createHorizontal( - mPointerSize, mPointerSize, true /* isPointingLeft */)); - mRightFlyoutTriangle = - new ShapeDrawable(TriangleShape.createHorizontal( - mPointerSize, mPointerSize, false /* isPointingLeft */)); - mLeftFlyoutTriangle.getPaint().setColor(floatingBackgroundColor); - mRightFlyoutTriangle.getPaint().setColor(floatingBackgroundColor); - - // Add both triangles to the drawable. We'll show and hide the appropriate ones when we show - // the flyout. - final int leftTriangleIndex = flyoutBackground.addLayer(mLeftFlyoutTriangle); - flyoutBackground.setLayerSize(leftTriangleIndex, mPointerSize, mPointerSize); - flyoutBackground.setLayerGravity(leftTriangleIndex, Gravity.LEFT | Gravity.CENTER_VERTICAL); - flyoutBackground.setLayerInsetLeft(leftTriangleIndex, -mPointerSize); - - final int rightTriangleIndex = flyoutBackground.addLayer(mRightFlyoutTriangle); - flyoutBackground.setLayerSize(rightTriangleIndex, mPointerSize, mPointerSize); - flyoutBackground.setLayerGravity( - rightTriangleIndex, Gravity.RIGHT | Gravity.CENTER_VERTICAL); - flyoutBackground.setLayerInsetRight(rightTriangleIndex, -mPointerSize); - - // Append the appropriate triangle's outline to the view's outline so that the shadows look - // correct. - mFlyout.setOutlineProvider(new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - final boolean leftPointing = mStackAnimationController.isStackOnLeftSide(); - - // Get the outline from the appropriate triangle. - final Outline triangleOutline = new Outline(); - if (leftPointing) { - mLeftFlyoutTriangle.getOutline(triangleOutline); - } else { - mRightFlyoutTriangle.getOutline(triangleOutline); - } - - // Offset it to the correct position, since it has no intrinsic position since - // that is maintained by the parent LayerDrawable. - triangleOutline.offset( - leftPointing ? -mPointerSize : mFlyout.getWidth(), - mFlyout.getHeight() / 2 - mPointerSize / 2); - - // Merge the outlines. - final Outline compoundOutline = new Outline(); - flyoutBackground.getOutline(compoundOutline); - compoundOutline.mPath.addPath(triangleOutline.mPath); - outline.set(compoundOutline); - } - }); - - mFlyoutText = mFlyout.findViewById(R.id.bubble_flyout_text); - mFlyoutSpring = new SpringAnimation(mFlyoutContainer, DynamicAnimation.TRANSLATION_X); - } - private void applyCurrentState() { if (DEBUG) { Log.d(TAG, "applyCurrentState: mIsExpanded=" + mIsExpanded); } + mExpandedViewContainer.setVisibility(mIsExpanded ? VISIBLE : GONE); if (mIsExpanded) { // First update the view so that it calculates a new height (ensuring the y position @@ -1376,10 +1391,15 @@ public class BubbleStackView extends FrameLayout { } } + mStackOnLeftOrWillBe = mStackAnimationController.isStackOnLeftSide(); + updateBubbleShadowsAndDotPosition(false); + } + + /** Sets the appropriate Z-order and dot position for each bubble in the stack. */ + private void updateBubbleShadowsAndDotPosition(boolean animate) { int bubbsCount = mBubbleContainer.getChildCount(); for (int i = 0; i < bubbsCount; i++) { BubbleView bv = (BubbleView) mBubbleContainer.getChildAt(i); - bv.updateDotVisibility(); bv.setZ((BubbleController.MAX_BUBBLES * getResources().getDimensionPixelSize(R.dimen.bubble_elevation)) - i); @@ -1393,6 +1413,11 @@ public class BubbleStackView extends FrameLayout { } }); bv.setClipToOutline(false); + + // If the dot is on the left, and so is the stack, we need to change the dot position. + if (bv.getDotPositionOnLeft() == mStackOnLeftOrWillBe) { + bv.setDotPosition(!mStackOnLeftOrWillBe, animate); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java index f429c2c124b3..8fe8bd305707 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleTouchHandler.java @@ -111,12 +111,13 @@ class BubbleTouchHandler implements View.OnTouchListener { trackMovement(event); mTouchDown.set(rawX, rawY); + mStack.onGestureStart(); if (isStack) { mViewPositionOnTouchDown.set(mStack.getStackPosition()); mStack.onDragStart(); } else if (isFlyout) { - // TODO(b/129768381): Make the flyout dismissable with a gesture. + mStack.onFlyoutDragStart(); } else { mViewPositionOnTouchDown.set( mTouchedView.getTranslationX(), mTouchedView.getTranslationY()); @@ -137,7 +138,7 @@ class BubbleTouchHandler implements View.OnTouchListener { if (isStack) { mStack.onDragged(viewX, viewY); } else if (isFlyout) { - // TODO(b/129768381): Make the flyout dismissable with a gesture. + mStack.onFlyoutDragged(deltaX); } else { mStack.onBubbleDragged(mTouchedView, viewX, viewY); } @@ -152,8 +153,10 @@ class BubbleTouchHandler implements View.OnTouchListener { final float velY = mVelocityTracker.getYVelocity(); // If the touch event is within the dismiss target, magnet the stack to it. - mStack.animateMagnetToDismissTarget( - mTouchedView, mInDismissTarget, viewX, viewY, velX, velY); + if (!isFlyout) { + mStack.animateMagnetToDismissTarget( + mTouchedView, mInDismissTarget, viewX, viewY, velX, velY); + } } break; @@ -174,7 +177,9 @@ class BubbleTouchHandler implements View.OnTouchListener { : mInDismissTarget || velY > INDIVIDUAL_BUBBLE_DISMISS_MIN_VELOCITY; - if (shouldDismiss) { + if (isFlyout && mMovedEnough) { + mStack.onFlyoutDragFinished(rawX - mTouchDown.x /* deltaX */, velX); + } else if (shouldDismiss) { final String individualBubbleKey = isStack ? null : ((BubbleView) mTouchedView).getKey(); mStack.magnetToStackIfNeededThenAnimateDismissal(mTouchedView, velX, velY, @@ -200,7 +205,7 @@ class BubbleTouchHandler implements View.OnTouchListener { } } else if (mTouchedView == mStack.getExpandedBubbleView()) { mBubbleData.setExpanded(false); - } else if (isStack) { + } else if (isStack || isFlyout) { // Toggle expansion mBubbleData.setExpanded(!mBubbleData.isExpanded()); } else { @@ -251,9 +256,12 @@ class BubbleTouchHandler implements View.OnTouchListener { mVelocityTracker.recycle(); mVelocityTracker = null; } + mTouchedView = null; mMovedEnough = false; mInDismissTarget = false; + + mStack.onGestureFinished(); } private void trackMovement(MotionEvent event) { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java index 2681b6d0c891..aa32b9456cbc 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleView.java @@ -48,9 +48,12 @@ public class BubbleView extends FrameLayout { private Context mContext; private BadgedImageView mBadgedImageView; + private int mBadgeColor; private int mPadding; private int mIconInset; + private boolean mSuppressDot = false; + private NotificationEntry mEntry; public BubbleView(Context context) { @@ -130,18 +133,54 @@ public class BubbleView extends FrameLayout { return (mEntry != null) ? mEntry.getRow() : null; } + /** Changes the dot's visibility to match the bubble view's state. */ + void updateDotVisibility(boolean animate) { + updateDotVisibility(animate, null /* after */); + } + + /** + * Changes the dot's visibility to match the bubble view's state, running the provided callback + * after animation if requested. + */ + void updateDotVisibility(boolean animate, Runnable after) { + boolean showDot = getEntry().showInShadeWhenBubble() && !mSuppressDot; + + if (animate) { + animateDot(showDot, after); + } else { + mBadgedImageView.setShowDot(showDot); + } + } + /** - * Marks this bubble as "read", i.e. no badge should show. + * Sets whether or not to hide the dot even if we'd otherwise show it. This is used while the + * flyout is visible or animating, to hide the dot until the flyout visually transforms into it. */ - public void updateDotVisibility() { - boolean showDot = getEntry().showInShadeWhenBubble(); - animateDot(showDot); + void setSuppressDot(boolean suppressDot, boolean animate) { + mSuppressDot = suppressDot; + updateDotVisibility(animate); + } + + /** Sets the position of the 'new' dot, animating it out and back in if requested. */ + void setDotPosition(boolean onLeft, boolean animate) { + if (animate && onLeft != mBadgedImageView.getDotPosition() && !mSuppressDot) { + animateDot(false /* showDot */, () -> { + mBadgedImageView.setDotPosition(onLeft); + animateDot(true /* showDot */, null); + }); + } else { + mBadgedImageView.setDotPosition(onLeft); + } + } + + boolean getDotPositionOnLeft() { + return mBadgedImageView.getDotPosition(); } /** * Animates the badge to show or hide. */ - private void animateDot(boolean showDot) { + private void animateDot(boolean showDot, Runnable after) { if (mBadgedImageView.isShowingDot() != showDot) { mBadgedImageView.setShowDot(showDot); mBadgedImageView.clearAnimation(); @@ -152,9 +191,13 @@ public class BubbleView extends FrameLayout { fraction = showDot ? fraction : 1 - fraction; mBadgedImageView.setDotScale(fraction); }).withEndAction(() -> { - if (!showDot) { - mBadgedImageView.setShowDot(false); - } + if (!showDot) { + mBadgedImageView.setShowDot(false); + } + + if (after != null) { + after.run(); + } }).start(); } } @@ -181,8 +224,13 @@ public class BubbleView extends FrameLayout { mBadgedImageView.setImageDrawable(iconDrawable); } int badgeColor = determineDominateColor(iconDrawable, n.color); + mBadgeColor = badgeColor; mBadgedImageView.setDotColor(badgeColor); - animateDot(mEntry.showInShadeWhenBubble() /* showDot */); + animateDot(mEntry.showInShadeWhenBubble() /* showDot */, null /* after */); + } + + int getBadgeColor() { + return mBadgeColor; } private Drawable buildIconWithTint(Drawable iconDrawable, int backgroundColor) { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java b/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java index f937525cf417..8529ed42cf0a 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/animation/StackAnimationController.java @@ -225,8 +225,10 @@ public class StackAnimationController extends /** * Flings the stack starting with the given velocities, springing it to the nearest edge * afterward. + * + * @return The X value that the stack will end up at after the fling/spring. */ - public void flingStackThenSpringToEdge(float x, float velX, float velY) { + public float flingStackThenSpringToEdge(float x, float velX, float velY) { final boolean stackOnLeftSide = x - mIndividualBubbleSize / 2 < mLayout.getWidth() / 2; final boolean stackShouldFlingLeft = stackOnLeftSide @@ -281,6 +283,7 @@ public class StackAnimationController extends DynamicAnimation.TRANSLATION_X, DynamicAnimation.TRANSLATION_Y); mIsMovingFromFlinging = true; + return destinationRelativeX; } /** diff --git a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java index de1069064518..05665b5ae4a2 100644 --- a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java +++ b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java @@ -16,8 +16,6 @@ package com.android.systemui.colorextraction; -import android.annotation.ColorInt; -import android.annotation.IntDef; import android.app.WallpaperColors; import android.app.WallpaperManager; import android.content.Context; @@ -36,13 +34,10 @@ import com.android.internal.colorextraction.types.ExtractionType; import com.android.internal.colorextraction.types.Tonal; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.Dumpable; -import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.statusbar.policy.ConfigurationController; import java.io.FileDescriptor; import java.io.PrintWriter; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.util.Arrays; import javax.inject.Inject; @@ -55,41 +50,23 @@ import javax.inject.Singleton; public class SysuiColorExtractor extends ColorExtractor implements Dumpable, ConfigurationController.ConfigurationListener { private static final String TAG = "SysuiColorExtractor"; - - public static final int SCRIM_TYPE_REGULAR = 1; - public static final int SCRIM_TYPE_LIGHT = 2; - public static final int SCRIM_TYPE_DARK = 3; - - @IntDef(prefix = {"SCRIM_TYPE_"}, value = { - SCRIM_TYPE_REGULAR, - SCRIM_TYPE_LIGHT, - SCRIM_TYPE_DARK - }) - @Retention(RetentionPolicy.SOURCE) - public @interface ScrimType { - } - private final Tonal mTonal; - private final OverviewProxyService mOverviewProxyService; private boolean mWallpaperVisible; private boolean mHasBackdrop; // Colors to return when the wallpaper isn't visible private final GradientColors mWpHiddenColors; @Inject - public SysuiColorExtractor(Context context, ConfigurationController configurationController, - OverviewProxyService overviewProxyService) { - this(context, new Tonal(context), configurationController, true, overviewProxyService); + public SysuiColorExtractor(Context context, ConfigurationController configurationController) { + this(context, new Tonal(context), configurationController, true); } @VisibleForTesting public SysuiColorExtractor(Context context, ExtractionType type, - ConfigurationController configurationController, boolean registerVisibility, - OverviewProxyService overviewProxyService) { + ConfigurationController configurationController, boolean registerVisibility) { super(context, type, false /* immediately */); mTonal = type instanceof Tonal ? (Tonal) type : new Tonal(context); mWpHiddenColors = new GradientColors(); - mOverviewProxyService = overviewProxyService; configurationController.addCallback(this); WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM); @@ -133,35 +110,17 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, return; } + super.onColorsChanged(colors, which); + if ((which & WallpaperManager.FLAG_SYSTEM) != 0) { updateDefaultGradients(colors); } - super.onColorsChanged(colors, which); } @Override public void onUiModeChanged() { WallpaperColors systemColors = getWallpaperColors(WallpaperManager.FLAG_SYSTEM); updateDefaultGradients(systemColors); - triggerColorsChanged(WallpaperManager.FLAG_SYSTEM); - } - - @Override - protected void triggerColorsChanged(int which) { - super.triggerColorsChanged(which); - - if (mWpHiddenColors != null && (which & WallpaperManager.FLAG_SYSTEM) != 0) { - @ColorInt int colorInt = mWpHiddenColors.getMainColor(); - @ScrimType int scrimType; - if (colorInt == Tonal.MAIN_COLOR_LIGHT) { - scrimType = SCRIM_TYPE_LIGHT; - } else if (colorInt == Tonal.MAIN_COLOR_DARK) { - scrimType = SCRIM_TYPE_DARK; - } else { - scrimType = SCRIM_TYPE_REGULAR; - } - mOverviewProxyService.onScrimColorsChanged(colorInt, scrimType); - } } /** diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index e87ff520e028..dcabb780ee3a 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -25,6 +25,7 @@ import android.app.ActivityManager; import android.app.Dialog; import android.app.KeyguardManager; import android.app.PendingIntent; +import android.app.StatusBarManager; import android.app.WallpaperManager; import android.app.admin.DevicePolicyManager; import android.app.trust.TrustManager; @@ -38,7 +39,9 @@ import android.database.ContentObserver; import android.graphics.drawable.Drawable; import android.media.AudioManager; import android.net.ConnectivityManager; +import android.os.Binder; import android.os.Handler; +import android.os.IBinder; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; @@ -75,6 +78,7 @@ import com.android.internal.colorextraction.ColorExtractor.GradientColors; import com.android.internal.colorextraction.drawable.ScrimDrawable; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.statusbar.IStatusBarService; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.TelephonyProperties; import com.android.internal.util.EmergencyAffordanceManager; @@ -1501,6 +1505,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private final Context mContext; private final MyAdapter mAdapter; + private final IStatusBarService mStatusBarService; + private final IBinder mToken = new Binder(); private MultiListLayout mGlobalActionsLayout; private Drawable mBackgroundDrawable; private final SysuiColorExtractor mColorExtractor; @@ -1516,6 +1522,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mContext = context; mAdapter = adapter; mColorExtractor = Dependency.get(SysuiColorExtractor.class); + mStatusBarService = Dependency.get(IStatusBarService.class); // Window initialization Window window = getWindow(); @@ -1542,9 +1549,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } private boolean shouldUsePanel() { - return isPanelEnabled(mContext) - && mPanelController != null - && mPanelController.getPanelContent() != null; + return mPanelController != null && mPanelController.getPanelContent() != null; } private void initializePanel() { @@ -1574,6 +1579,9 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mContext, true, RotationUtils.ROTATION_NONE); } + // Disable rotation suggestions, if enabled + setRotationSuggestionsEnabled(false); + FrameLayout panelContainer = new FrameLayout(mContext); FrameLayout.LayoutParams panelParams = new FrameLayout.LayoutParams( @@ -1732,11 +1740,24 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } } + private void setRotationSuggestionsEnabled(boolean enabled) { + try { + final int userId = Binder.getCallingUserHandle().getIdentifier(); + final int what = enabled + ? StatusBarManager.DISABLE2_NONE + : StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS; + mStatusBarService.disable2ForUser(what, mToken, mContext.getPackageName(), userId); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + private void resetOrientation() { if (mResetOrientationData != null) { RotationPolicy.setRotationLockAtAngle(mContext, mResetOrientationData.locked, mResetOrientationData.rotation); } + setRotationSuggestionsEnabled(true); } @Override @@ -1792,15 +1813,6 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } /** - * Determines whether or not the Global Actions Panel should appear when the power button - * is held. - */ - private static boolean isPanelEnabled(Context context) { - return FeatureFlagUtils.isEnabled( - context, FeatureFlagUtils.GLOBAL_ACTIONS_PANEL_ENABLED); - } - - /** * Determines whether the Global Actions menu should use a separated view for emergency actions. */ private static boolean shouldUseSeparatedView() { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 98f36e466ce5..ec6cfe9d8e55 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1785,31 +1785,37 @@ public class KeyguardViewMediator extends SystemUI { public void run() { Trace.beginSection("KeyguardViewMediator.mKeyGuardGoingAwayRunnable"); if (DEBUG) Log.d(TAG, "keyguardGoingAway"); - try { - mStatusBarKeyguardViewManager.keyguardGoingAway(); - - int flags = 0; - if (mStatusBarKeyguardViewManager.shouldDisableWindowAnimationsForUnlock() - || (mWakeAndUnlocking && !mPulsing)) { - flags |= WindowManagerPolicyConstants - .KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS; - } - if (mStatusBarKeyguardViewManager.isGoingToNotificationShade() - || (mWakeAndUnlocking && mPulsing)) { - flags |= WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE; - } - if (mStatusBarKeyguardViewManager.isUnlockWithWallpaper()) { - flags |= WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER; - } + mStatusBarKeyguardViewManager.keyguardGoingAway(); - mUpdateMonitor.setKeyguardGoingAway(true /* goingAway */); - // Don't actually hide the Keyguard at the moment, wait for window - // manager until it tells us it's safe to do so with - // startKeyguardExitAnimation. - ActivityTaskManager.getService().keyguardGoingAway(flags); - } catch (RemoteException e) { - Log.e(TAG, "Error while calling WindowManager", e); + int flags = 0; + if (mStatusBarKeyguardViewManager.shouldDisableWindowAnimationsForUnlock() + || (mWakeAndUnlocking && !mPulsing)) { + flags |= WindowManagerPolicyConstants + .KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS; + } + if (mStatusBarKeyguardViewManager.isGoingToNotificationShade() + || (mWakeAndUnlocking && mPulsing)) { + flags |= WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE; + } + if (mStatusBarKeyguardViewManager.isUnlockWithWallpaper()) { + flags |= WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER; } + + mUpdateMonitor.setKeyguardGoingAway(true /* goingAway */); + + // Don't actually hide the Keyguard at the moment, wait for window + // manager until it tells us it's safe to do so with + // startKeyguardExitAnimation. + // Posting to mUiOffloadThread to ensure that calls to ActivityTaskManager will be in + // order. + final int keyguardFlag = flags; + mUiOffloadThread.submit(() -> { + try { + ActivityTaskManager.getService().keyguardGoingAway(keyguardFlag); + } catch (RemoteException e) { + Log.e(TAG, "Error while calling WindowManager", e); + } + }); Trace.endSection(); } }; diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index c5591cf9d947..78c7cd406ba1 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -31,7 +31,6 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_B import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; -import android.annotation.ColorInt; import android.annotation.FloatRange; import android.app.ActivityTaskManager; import android.content.BroadcastReceiver; @@ -60,7 +59,6 @@ import com.android.internal.policy.ScreenDecorationsUtils; import com.android.systemui.Dependency; import com.android.systemui.Dumpable; import com.android.systemui.SysUiServiceProvider; -import com.android.systemui.colorextraction.SysuiColorExtractor.ScrimType; import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.recents.ISystemUiProxy; @@ -537,16 +535,6 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis dispatchNavButtonBounds(); } - public void onScrimColorsChanged(@ColorInt int color, @ScrimType int type) { - if (mOverviewProxy != null) { - try { - mOverviewProxy.onScrimColorsChanged(color, type); - } catch (RemoteException e) { - Log.e(TAG_OPS, "Failed to call onScrimColorsChanged()", e); - } - } - } - private void dispatchNavButtonBounds() { if (mOverviewProxy != null && mActiveNavBarRegion != null) { try { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 2cca701ef582..d202190724f5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -71,6 +71,7 @@ public class NotificationShelf extends ActivatableNotificationView implements private int mIconAppearTopPadding; private int mShelfAppearTranslation; private float mDarkShelfPadding; + private float mDarkShelfIconSize; private int mStatusBarHeight; private int mStatusBarPaddingStart; private AmbientState mAmbientState; @@ -151,6 +152,7 @@ public class NotificationShelf extends ActivatableNotificationView implements mScrollFastThreshold = res.getDimensionPixelOffset(R.dimen.scroll_fast_threshold); mShowNotificationShelf = res.getBoolean(R.bool.config_showNotificationShelf); mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size); + mDarkShelfIconSize = res.getDimensionPixelOffset(R.dimen.dark_shelf_icon_size); mGapHeight = res.getDimensionPixelSize(R.dimen.qs_notification_padding); if (!mShowNotificationShelf) { @@ -705,12 +707,13 @@ public class NotificationShelf extends ActivatableNotificationView implements } notificationIconPosition += iconTopPadding; float shelfIconPosition = getTranslationY() + icon.getTop(); - shelfIconPosition += (icon.getHeight() - icon.getIconScale() * mIconSize) / 2.0f; + float iconSize = mDark ? mDarkShelfIconSize : mIconSize; + shelfIconPosition += (icon.getHeight() - icon.getIconScale() * iconSize) / 2.0f; float iconYTranslation = NotificationUtils.interpolate( notificationIconPosition - shelfIconPosition, 0, transitionAmount); - float shelfIconSize = mIconSize * icon.getIconScale(); + float shelfIconSize = iconSize * icon.getIconScale(); float alpha = 1.0f; boolean noIcon = !row.isShowingIcon(); if (noIcon) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 1074f3af6b1d..f93c5f0827ad 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -29,6 +29,7 @@ import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.hardware.biometrics.BiometricSourceType; import android.os.Handler; +import android.os.Trace; import android.util.AttributeSet; import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; @@ -89,6 +90,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange private float mDozeAmount; private int mIconRes; private boolean mWasPulsingOnThisFrame; + private boolean mWakeAndUnlockRunning; private final Runnable mDrawOffTimeout = () -> update(true /* forceUpdate */); private final DockManager.DockEventListener mDockEventListener = @@ -255,9 +257,12 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange if (getDrawable() == animation && state == getState() && doesAnimationLoop(iconAnimRes)) { animation.start(); + } else { + Trace.endAsyncSection("LockIcon#Animation", state); } } }); + Trace.beginAsyncSection("LockIcon#Animation", state); animation.start(); } } @@ -277,7 +282,8 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange mLastBouncerVisible = mBouncerVisible; } - boolean invisible = mDozing && (!mPulsing || mDocked); + boolean onAodNotPulsingOrDocked = mDozing && (!mPulsing || mDocked); + boolean invisible = onAodNotPulsingOrDocked || mWakeAndUnlockRunning; setVisibility(invisible ? INVISIBLE : VISIBLE); updateClickability(); } @@ -450,4 +456,23 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange public void onUnlockMethodStateChanged() { update(); } + + /** + * We need to hide the lock whenever there's a fingerprint unlock, otherwise you'll see the + * icon on top of the black front scrim. + */ + public void onBiometricAuthModeChanged(boolean wakeAndUnlock) { + if (wakeAndUnlock) { + mWakeAndUnlockRunning = true; + } + update(); + } + + /** + * Triggered after the unlock animation is over and the user is looking at launcher. + */ + public void onKeyguardFadedAway() { + mWakeAndUnlockRunning = false; + update(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index b4b4235909d9..17f0d5a79034 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -538,6 +538,7 @@ public class StatusBar extends SystemUI implements DemoMode, } if (mKeyguardMonitor.isKeyguardFadingAway()) { mStatusBarKeyguardViewManager.onKeyguardFadedAway(); + mStatusBarWindow.onKeyguardFadedAway(); } } @@ -3798,6 +3799,7 @@ public class StatusBar extends SystemUI implements DemoMode, public void notifyBiometricAuthModeChanged() { updateDozing(); updateScrimController(); + mStatusBarWindow.onBiometricAuthModeChanged(mBiometricUnlockController.isWakeAndUnlock()); } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 9f538bb3fca4..712e96255b02 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -262,7 +262,28 @@ public class StatusBarWindowView extends FrameLayout { * Propagate {@link StatusBar} pulsing state. */ public void setPulsing(boolean pulsing) { - mLockIcon.setPulsing(pulsing); + if (mLockIcon != null) { + mLockIcon.setPulsing(pulsing); + } + } + + /** + * Called when the biometric authentication mode changes. + * @param wakeAndUnlock If the type is {@link BiometricUnlockController#isWakeAndUnlock()} + */ + public void onBiometricAuthModeChanged(boolean wakeAndUnlock) { + if (mLockIcon != null) { + mLockIcon.onBiometricAuthModeChanged(wakeAndUnlock); + } + } + + /** + * Called after finished unlocking and the status bar window is already collapsed. + */ + public void onKeyguardFadedAway() { + if (mLockIcon != null) { + mLockIcon.onKeyguardFadedAway(); + } } public void setStatusBarView(PhoneStatusBarView statusBarView) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleFlyoutViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleFlyoutViewTest.java new file mode 100644 index 000000000000..173237f7b311 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleFlyoutViewTest.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.bubbles; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotSame; +import static junit.framework.Assert.assertTrue; + +import static org.mockito.Mockito.verify; + +import android.graphics.Color; +import android.graphics.PointF; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; +import android.view.View; +import android.widget.TextView; + +import androidx.test.filters.SmallTest; + +import com.android.systemui.R; +import com.android.systemui.SysuiTestCase; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) +public class BubbleFlyoutViewTest extends SysuiTestCase { + private BubbleFlyoutView mFlyout; + private TextView mFlyoutText; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + mFlyout = new BubbleFlyoutView(getContext()); + + mFlyoutText = mFlyout.findViewById(R.id.bubble_flyout_text); + } + + @Test + public void testShowFlyout_isVisible() { + mFlyout.showFlyout("Hello", new PointF(100, 100), 500, true, Color.WHITE, null); + assertEquals("Hello", mFlyoutText.getText()); + assertEquals(View.VISIBLE, mFlyout.getVisibility()); + assertEquals(1f, mFlyoutText.getAlpha(), .01f); + } + + @Test + public void testFlyoutHide_runsCallback() { + Runnable after = Mockito.mock(Runnable.class); + mFlyout.showFlyout("Hello", new PointF(100, 100), 500, true, Color.WHITE, after); + mFlyout.hideFlyout(); + + verify(after).run(); + } + + @Test + public void testSetCollapsePercent() { + mFlyout.showFlyout("Hello", new PointF(100, 100), 500, true, Color.WHITE, null); + + float initialTranslationZ = mFlyout.getTranslationZ(); + + mFlyout.setCollapsePercent(1f); + assertEquals(0f, mFlyoutText.getAlpha(), 0.01f); + assertNotSame(0f, mFlyoutText.getTranslationX()); // Should have moved to collapse. + assertTrue(mFlyout.getTranslationZ() < initialTranslationZ); // Should be descending. + + mFlyout.setCollapsePercent(0f); + assertEquals(1f, mFlyoutText.getAlpha(), 0.01f); + assertEquals(0f, mFlyoutText.getTranslationX()); + assertEquals(initialTranslationZ, mFlyout.getTranslationZ()); + + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleStackViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleStackViewTest.java deleted file mode 100644 index bafae6ce737a..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleStackViewTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.bubbles; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; -import android.widget.TextView; - -import androidx.test.filters.SmallTest; - -import com.android.systemui.R; -import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.notification.collection.NotificationEntry; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -@SmallTest -@RunWith(AndroidTestingRunner.class) -@TestableLooper.RunWithLooper(setAsMainLooper = true) -public class BubbleStackViewTest extends SysuiTestCase { - private BubbleStackView mStackView; - @Mock private Bubble mBubble; - @Mock private NotificationEntry mNotifEntry; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - mStackView = new BubbleStackView(mContext, new BubbleData(getContext()), null); - mBubble.entry = mNotifEntry; - } - - @Test - public void testAnimateInFlyoutForBubble() { - when(mNotifEntry.getUpdateMessage(any())).thenReturn("Test Flyout Message."); - mStackView.animateInFlyoutForBubble(mBubble); - - assertEquals("Test Flyout Message.", - ((TextView) mStackView.findViewById(R.id.bubble_flyout_text)).getText()); - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java index 3d3c29564910..67df60a3dcfc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java +++ b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java @@ -34,14 +34,10 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.colorextraction.ColorExtractor; import com.android.internal.colorextraction.types.Tonal; import com.android.systemui.SysuiTestCase; -import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.statusbar.policy.ConfigurationController; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; /** * Tests color extraction generation. @@ -57,13 +53,6 @@ public class SysuiColorExtractorTests extends SysuiTestCase { ColorExtractor.TYPE_NORMAL, ColorExtractor.TYPE_DARK, ColorExtractor.TYPE_EXTRA_DARK}; - @Mock - private OverviewProxyService mOverviewProxyService; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - } @Test public void getColors_usesGreyIfWallpaperNotVisible() { @@ -129,8 +118,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase { Tonal tonal = mock(Tonal.class); ConfigurationController configurationController = mock(ConfigurationController.class); SysuiColorExtractor sysuiColorExtractor = new SysuiColorExtractor(getContext(), - tonal, configurationController, false /* registerVisibility */, - mOverviewProxyService); + tonal, configurationController, false /* registerVisibility */); verify(configurationController).addCallback(eq(sysuiColorExtractor)); reset(tonal); @@ -145,7 +133,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase { outGradientColorsNormal.set(colors); outGradientColorsDark.set(colors); outGradientColorsExtraDark.set(colors); - }, mock(ConfigurationController.class), false, mOverviewProxyService); + }, mock(ConfigurationController.class), false); } private void simulateEvent(SysuiColorExtractor extractor) { diff --git a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml index 9694e76e138b..f1d2e0b27353 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml @@ -37,6 +37,10 @@ {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. --> <bool name="config_navBarNeedsScrim">false</bool> + <!-- Controls whether seamless rotation should be allowed even though the navbar can move + (which normally prevents seamless rotation). --> + <bool name="config_allowSeamlessRotationDespiteNavBarMoving">true</bool> + <!-- Controls whether the side edge gestures can always trigger the transient nav bar to show. --> <bool name="config_navBarAlwaysShowOnSideEdgeGesture">true</bool> diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java index f9aaf11c75f0..a7fb99f8b004 100644 --- a/services/core/java/com/android/server/Watchdog.java +++ b/services/core/java/com/android/server/Watchdog.java @@ -140,6 +140,7 @@ public class Watchdog extends Thread { private boolean mCompleted; private Monitor mCurrentMonitor; private long mStartTime; + private int mPauseCount; HandlerChecker(Handler handler, String name, long waitMaxMillis) { mHandler = handler; @@ -160,17 +161,18 @@ public class Watchdog extends Thread { mMonitors.addAll(mMonitorQueue); mMonitorQueue.clear(); } - if (mMonitors.size() == 0 && mHandler.getLooper().getQueue().isPolling()) { + if ((mMonitors.size() == 0 && mHandler.getLooper().getQueue().isPolling()) + || (mPauseCount > 0)) { + // Don't schedule until after resume OR // If the target looper has recently been polling, then // there is no reason to enqueue our checker on it since that // is as good as it not being deadlocked. This avoid having - // to do a context switch to check the thread. Note that we - // only do this if mCheckReboot is false and we have no - // monitors, since those would need to be executed at this point. + // to do a context switch to check the thread. Note that we + // only do this if we have no monitors since those would need to + // be executed at this point. mCompleted = true; return; } - if (!mCompleted) { // we already have a check in flight, so no need return; @@ -236,6 +238,28 @@ public class Watchdog extends Thread { mCurrentMonitor = null; } } + + /** Pause the HandlerChecker. */ + public void pauseLocked(String reason) { + mPauseCount++; + // Mark as completed, because there's a chance we called this after the watchog + // thread loop called Object#wait after 'WAITED_HALF'. In that case we want to ensure + // the next call to #getCompletionStateLocked for this checker returns 'COMPLETED' + mCompleted = true; + Slog.i(TAG, "Pausing HandlerChecker: " + mName + " for reason: " + + reason + ". Pause count: " + mPauseCount); + } + + /** Resume the HandlerChecker from the last {@link #pauseLocked}. */ + public void resumeLocked(String reason) { + if (mPauseCount > 0) { + mPauseCount--; + Slog.i(TAG, "Resuming HandlerChecker: " + mName + " for reason: " + + reason + ". Pause count: " + mPauseCount); + } else { + Slog.wtf(TAG, "Already resumed HandlerChecker: " + mName); + } + } } final class RebootRequestReceiver extends BroadcastReceiver { @@ -364,6 +388,51 @@ public class Watchdog extends Thread { } /** + * Pauses Watchdog action for the currently running thread. Useful before executing long running + * operations that could falsely trigger the watchdog. Each call to this will require a matching + * call to {@link #resumeWatchingCurrentThread}. + * + * <p>If the current thread has not been added to the Watchdog, this call is a no-op. + * + * <p>If the Watchdog is already paused for the current thread, this call adds + * adds another pause and will require an additional {@link #resumeCurrentThread} to resume. + * + * <p>Note: Use with care, as any deadlocks on the current thread will be undetected until all + * pauses have been resumed. + */ + public void pauseWatchingCurrentThread(String reason) { + synchronized (this) { + for (HandlerChecker hc : mHandlerCheckers) { + if (Thread.currentThread().equals(hc.getThread())) { + hc.pauseLocked(reason); + } + } + } + } + + /** + * Resumes the last pause from {@link #pauseWatchingCurrentThread} for the currently running + * thread. + * + * <p>If the current thread has not been added to the Watchdog, this call is a no-op. + * + * <p>If the Watchdog action for the current thread is already resumed, this call logs a wtf. + * + * <p>If all pauses have been resumed, the Watchdog action is finally resumed, otherwise, + * the Watchdog action for the current thread remains paused until resume is called at least + * as many times as the calls to pause. + */ + public void resumeWatchingCurrentThread(String reason) { + synchronized (this) { + for (HandlerChecker hc : mHandlerCheckers) { + if (Thread.currentThread().equals(hc.getThread())) { + hc.resumeLocked(reason); + } + } + } + } + + /** * Perform a full reboot of the system. */ void rebootSystem(String reason) { diff --git a/services/core/java/com/android/server/am/PreBootBroadcaster.java b/services/core/java/com/android/server/am/PreBootBroadcaster.java index 376999dfd80d..beb0e4741c36 100644 --- a/services/core/java/com/android/server/am/PreBootBroadcaster.java +++ b/services/core/java/com/android/server/am/PreBootBroadcaster.java @@ -107,9 +107,11 @@ public abstract class PreBootBroadcaster extends IIntentReceiver.Stub { EventLogTags.writeAmPreBoot(mUserId, componentName.getPackageName()); mIntent.setComponent(componentName); - mService.broadcastIntentLocked(null, null, mIntent, null, this, 0, null, null, null, - AppOpsManager.OP_NONE, null, true, false, ActivityManagerService.MY_PID, - Process.SYSTEM_UID, Binder.getCallingUid(), Binder.getCallingPid(), mUserId); + synchronized (mService) { + mService.broadcastIntentLocked(null, null, mIntent, null, this, 0, null, null, null, + AppOpsManager.OP_NONE, null, true, false, ActivityManagerService.MY_PID, + Process.SYSTEM_UID, Binder.getCallingUid(), Binder.getCallingPid(), mUserId); + } } @Override diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 696697eddf25..b394eea95a88 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -1658,23 +1658,15 @@ public final class ProcessList { app.killed = false; final long startSeq = app.startSeq = ++mProcStartSeqCounter; app.setStartParams(uid, hostingRecord, seInfo, startTime); + app.setUsingWrapper(invokeWith != null + || SystemProperties.get("wrap." + app.processName) != null); + mPendingStarts.put(startSeq, app); + if (mService.mConstants.FLAG_PROCESS_START_ASYNC) { if (DEBUG_PROCESSES) Slog.i(TAG_PROCESSES, "Posting procStart msg for " + app.toShortString()); mService.mProcStartHandler.post(() -> { try { - synchronized (mService) { - final String reason = isProcStartValidLocked(app, startSeq); - if (reason != null) { - Slog.w(TAG_PROCESSES, app + " not valid anymore," - + " don't start process, " + reason); - app.pendingStart = false; - return; - } - app.setUsingWrapper(invokeWith != null - || SystemProperties.get("wrap." + app.processName) != null); - mPendingStarts.put(startSeq, app); - } final Process.ProcessStartResult startResult = startProcess(app.hostingRecord, entryPoint, app, app.startUid, gids, runtimeFlags, mountExternal, app.seInfo, requiredAbi, instructionSet, invokeWith, app.startTime); diff --git a/services/core/java/com/android/server/attention/AttentionManagerService.java b/services/core/java/com/android/server/attention/AttentionManagerService.java index 7605ccb5aeda..e14846863946 100644 --- a/services/core/java/com/android/server/attention/AttentionManagerService.java +++ b/services/core/java/com/android/server/attention/AttentionManagerService.java @@ -270,7 +270,7 @@ public class AttentionManagerService extends SystemService { return; } if (!userState.mCurrentAttentionCheck.mCallbackInternal.equals(callbackInternal)) { - Slog.e(LOG_TAG, "Cannot cancel a non-current request"); + Slog.w(LOG_TAG, "Cannot cancel a non-current request"); return; } cancel(userState); diff --git a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java index 35f7ea3ae0fe..3de2537cffc7 100644 --- a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java +++ b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java @@ -29,6 +29,7 @@ import static android.net.SocketKeepalive.ERROR_INVALID_INTERVAL; import static android.net.SocketKeepalive.ERROR_INVALID_IP_ADDRESS; import static android.net.SocketKeepalive.ERROR_INVALID_NETWORK; import static android.net.SocketKeepalive.ERROR_INVALID_SOCKET; +import static android.net.SocketKeepalive.ERROR_UNSUPPORTED; import static android.net.SocketKeepalive.MAX_INTERVAL_SEC; import static android.net.SocketKeepalive.MIN_INTERVAL_SEC; import static android.net.SocketKeepalive.NO_KEEPALIVE; @@ -46,6 +47,7 @@ import android.net.SocketKeepalive.InvalidPacketException; import android.net.SocketKeepalive.InvalidSocketException; import android.net.TcpKeepalivePacketData; import android.net.util.IpUtils; +import android.net.util.KeepaliveUtils; import android.os.Binder; import android.os.Handler; import android.os.IBinder; @@ -57,6 +59,7 @@ import android.system.Os; import android.util.Log; import android.util.Pair; +import com.android.internal.R; import com.android.internal.util.HexDump; import com.android.internal.util.IndentingPrintWriter; @@ -65,6 +68,7 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; /** @@ -90,10 +94,29 @@ public class KeepaliveTracker { @NonNull private final Context mContext; + // Supported keepalive count for each transport type, can be configured through + // config_networkSupportedKeepaliveCount. For better error handling, use + // {@link getSupportedKeepalivesForNetworkCapabilities} instead of direct access. + @NonNull + private final int[] mSupportedKeepalives; + + // Reserved privileged keepalive slots per transport. Caller's permission will be enforced if + // the number of remaining keepalive slots is less than or equal to the threshold. + private final int mReservedPrivilegedSlots; + + // Allowed unprivileged keepalive slots per uid. Caller's permission will be enforced if + // the number of remaining keepalive slots is less than or equal to the threshold. + private final int mAllowedUnprivilegedSlotsForUid; + public KeepaliveTracker(Context context, Handler handler) { mConnectivityServiceHandler = handler; mTcpController = new TcpKeepaliveController(handler); mContext = context; + mSupportedKeepalives = KeepaliveUtils.getSupportedKeepalives(mContext); + mReservedPrivilegedSlots = mContext.getResources().getInteger( + R.integer.config_reservedPrivilegedKeepaliveSlots); + mAllowedUnprivilegedSlotsForUid = mContext.getResources().getInteger( + R.integer.config_allowedUnprivilegedKeepalivePerUid); } /** @@ -115,11 +138,6 @@ public class KeepaliveTracker { public static final int TYPE_NATT = 1; public static final int TYPE_TCP = 2; - // Max allowed unprivileged keepalive slots per network. Caller's permission will be - // enforced if number of existing keepalives reach this limit. - // TODO: consider making this limit configurable via resources. - private static final int MAX_UNPRIVILEGED_SLOTS = 3; - // Keepalive slot. A small integer that identifies this keepalive among the ones handled // by this network. private int mSlot = NO_KEEPALIVE; @@ -191,6 +209,7 @@ public class KeepaliveTracker { case NOT_STARTED : return "NOT_STARTED"; case STARTING : return "STARTING"; case STARTED : return "STARTED"; + case STOPPING : return "STOPPING"; } throw new IllegalArgumentException("Unknown state"); } @@ -246,24 +265,54 @@ public class KeepaliveTracker { private int checkPermission() { final HashMap<Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(mNai); - int unprivilegedCount = 0; if (networkKeepalives == null) { return ERROR_INVALID_NETWORK; } - for (KeepaliveInfo ki : networkKeepalives.values()) { - if (!ki.mPrivileged) { - unprivilegedCount++; - } - if (unprivilegedCount >= MAX_UNPRIVILEGED_SLOTS) { - return mPrivileged ? SUCCESS : ERROR_INSUFFICIENT_RESOURCES; + + if (mPrivileged) return SUCCESS; + + final int supported = KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities( + mSupportedKeepalives, mNai.networkCapabilities); + + int takenUnprivilegedSlots = 0; + for (final KeepaliveInfo ki : networkKeepalives.values()) { + if (!ki.mPrivileged) ++takenUnprivilegedSlots; + } + if (takenUnprivilegedSlots > supported - mReservedPrivilegedSlots) { + return ERROR_INSUFFICIENT_RESOURCES; + } + + // Count unprivileged keepalives for the same uid across networks. + int unprivilegedCountSameUid = 0; + for (final HashMap<Integer, KeepaliveInfo> kaForNetwork : mKeepalives.values()) { + for (final KeepaliveInfo ki : kaForNetwork.values()) { + if (ki.mUid == mUid) { + unprivilegedCountSameUid++; + } } } + if (unprivilegedCountSameUid > mAllowedUnprivilegedSlotsForUid) { + return ERROR_INSUFFICIENT_RESOURCES; + } + return SUCCESS; + } + + private int checkLimit() { + final HashMap<Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(mNai); + if (networkKeepalives == null) { + return ERROR_INVALID_NETWORK; + } + final int supported = KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities( + mSupportedKeepalives, mNai.networkCapabilities); + if (supported == 0) return ERROR_UNSUPPORTED; + if (networkKeepalives.size() > supported) return ERROR_INSUFFICIENT_RESOURCES; return SUCCESS; } private int isValid() { synchronized (mNai) { int error = checkInterval(); + if (error == SUCCESS) error = checkLimit(); if (error == SUCCESS) error = checkPermission(); if (error == SUCCESS) error = checkNetworkConnected(); if (error == SUCCESS) error = checkSourceAddress(); @@ -278,6 +327,8 @@ public class KeepaliveTracker { Log.d(TAG, "Starting keepalive " + mSlot + " on " + mNai.name()); switch (mType) { case TYPE_NATT: + mNai.asyncChannel.sendMessage( + CMD_ADD_KEEPALIVE_PACKET_FILTER, slot, 0 /* Unused */, mPacket); mNai.asyncChannel .sendMessage(CMD_START_SOCKET_KEEPALIVE, slot, mInterval, mPacket); break; @@ -288,9 +339,8 @@ public class KeepaliveTracker { handleStopKeepalive(mNai, mSlot, ERROR_INVALID_SOCKET); return; } - mNai.asyncChannel - .sendMessage(CMD_ADD_KEEPALIVE_PACKET_FILTER, slot, 0 /* Unused */, - mPacket); + mNai.asyncChannel.sendMessage( + CMD_ADD_KEEPALIVE_PACKET_FILTER, slot, 0 /* Unused */, mPacket); // TODO: check result from apf and notify of failure as needed. mNai.asyncChannel .sendMessage(CMD_START_SOCKET_KEEPALIVE, slot, mInterval, mPacket); @@ -314,18 +364,30 @@ public class KeepaliveTracker { Log.e(TAG, "Cannot stop unowned keepalive " + mSlot + " on " + mNai.network); } } - if (NOT_STARTED != mStartedState) { - mStartedState = STOPPING; - Log.d(TAG, "Stopping keepalive " + mSlot + " on " + mNai.name()); - if (mType == TYPE_NATT) { - mNai.asyncChannel.sendMessage(CMD_STOP_SOCKET_KEEPALIVE, mSlot); - } else if (mType == TYPE_TCP) { - mNai.asyncChannel.sendMessage(CMD_STOP_SOCKET_KEEPALIVE, mSlot); - mNai.asyncChannel.sendMessage(CMD_REMOVE_KEEPALIVE_PACKET_FILTER, mSlot); - mTcpController.stopSocketMonitor(mSlot); - } else { - Log.wtf(TAG, "Stopping keepalive with unknown type: " + mType); - } + Log.d(TAG, "Stopping keepalive " + mSlot + " on " + mNai.name() + ": " + reason); + switch (mStartedState) { + case NOT_STARTED: + // Remove the reference of the keepalive that meet error before starting, + // e.g. invalid parameter. + cleanupStoppedKeepalive(mNai, mSlot); + break; + case STOPPING: + // Keepalive is already in stopping state, ignore. + return; + default: + mStartedState = STOPPING; + switch (mType) { + case TYPE_TCP: + mTcpController.stopSocketMonitor(mSlot); + // fall through + case TYPE_NATT: + mNai.asyncChannel.sendMessage(CMD_STOP_SOCKET_KEEPALIVE, mSlot); + mNai.asyncChannel.sendMessage(CMD_REMOVE_KEEPALIVE_PACKET_FILTER, + mSlot); + break; + default: + Log.wtf(TAG, "Stopping keepalive with unknown type: " + mType); + } } // Close the duplicated fd that maintains the lifecycle of socket whenever @@ -400,14 +462,18 @@ public class KeepaliveTracker { } public void handleStopAllKeepalives(NetworkAgentInfo nai, int reason) { - HashMap <Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(nai); + final HashMap<Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(nai); if (networkKeepalives != null) { - for (KeepaliveInfo ki : networkKeepalives.values()) { + final ArrayList<KeepaliveInfo> kalist = new ArrayList(networkKeepalives.values()); + for (KeepaliveInfo ki : kalist) { ki.stop(reason); + // Clean up keepalives since the network agent is disconnected and unable to pass + // back asynchronous result of stop(). + cleanupStoppedKeepalive(nai, ki.mSlot); } - networkKeepalives.clear(); - mKeepalives.remove(nai); } + // Clean up keepalives will be done as a result of calling ki.stop() after the slots are + // freed. } public void handleStopKeepalive(NetworkAgentInfo nai, int slot, int reason) { @@ -423,8 +489,24 @@ public class KeepaliveTracker { return; } ki.stop(reason); + // Clean up keepalives will be done as a result of calling ki.stop() after the slots are + // freed. + } + + private void cleanupStoppedKeepalive(NetworkAgentInfo nai, int slot) { + String networkName = (nai == null) ? "(null)" : nai.name(); + HashMap<Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(nai); + if (networkKeepalives == null) { + Log.e(TAG, "Attempt to remove keepalive on nonexistent network " + networkName); + return; + } + KeepaliveInfo ki = networkKeepalives.get(slot); + if (ki == null) { + Log.e(TAG, "Attempt to remove nonexistent keepalive " + slot + " on " + networkName); + return; + } networkKeepalives.remove(slot); - Log.d(TAG, "Stopped keepalive " + slot + " on " + networkName + ", " + Log.d(TAG, "Remove keepalive " + slot + " on " + networkName + ", " + networkKeepalives.size() + " remains."); if (networkKeepalives.isEmpty()) { mKeepalives.remove(nai); @@ -495,10 +577,11 @@ public class KeepaliveTracker { handleStopKeepalive(nai, slot, reason); } } else if (KeepaliveInfo.STOPPING == ki.mStartedState) { - // The message indicated result of stopping : don't call handleStopKeepalive. + // The message indicated result of stopping : clean up keepalive slots. Log.d(TAG, "Stopped keepalive " + slot + " on " + nai.name() + " stopped: " + reason); ki.mStartedState = KeepaliveInfo.NOT_STARTED; + cleanupStoppedKeepalive(nai, slot); } else { Log.wtf(TAG, "Event " + message.what + "," + slot + "," + reason + " for keepalive in wrong state: " + ki.toString()); @@ -642,6 +725,9 @@ public class KeepaliveTracker { } public void dump(IndentingPrintWriter pw) { + pw.println("Supported Socket keepalives: " + Arrays.toString(mSupportedKeepalives)); + pw.println("Reserved Privileged keepalives: " + mReservedPrivilegedSlots); + pw.println("Allowed Unprivileged keepalives per uid: " + mAllowedUnprivilegedSlotsForUid); pw.println("Socket keepalives:"); pw.increaseIndent(); for (NetworkAgentInfo nai : mKeepalives.keySet()) { diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index 7e79a12d12eb..d8b7c2eb5d4c 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -3256,14 +3256,17 @@ public class SyncManager { } } - // On account add, check if there are any settings to be restored. - for (AccountAndUser aau : mRunningAccounts) { - if (!containsAccountAndUser(oldAccounts, aau.account, aau.userId)) { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Account " + aau.account + " added, checking sync restore data"); + if (syncTargets != null) { + // On account add, check if there are any settings to be restored. + for (AccountAndUser aau : mRunningAccounts) { + if (!containsAccountAndUser(oldAccounts, aau.account, aau.userId)) { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "Account " + aau.account + + " added, checking sync restore data"); + } + AccountSyncSettingsBackupHelper.accountAdded(mContext, syncTargets.userId); + break; } - AccountSyncSettingsBackupHelper.accountAdded(mContext, syncTargets.userId); - break; } } diff --git a/services/core/java/com/android/server/display/color/ColorDisplayService.java b/services/core/java/com/android/server/display/color/ColorDisplayService.java index 85fb1e0f4bdf..ad81ca2ec2b1 100644 --- a/services/core/java/com/android/server/display/color/ColorDisplayService.java +++ b/services/core/java/com/android/server/display/color/ColorDisplayService.java @@ -775,10 +775,10 @@ public final class ColorDisplayService extends SystemService { final ContentResolver cr = getContext().getContentResolver(); if (isAccessibilityEnabled()) { // There are restrictions on the available color modes combined with a11y transforms. - if (isColorModeAvailable(COLOR_MODE_SATURATED)) { - return COLOR_MODE_SATURATED; - } else if (isColorModeAvailable(COLOR_MODE_AUTOMATIC)) { - return COLOR_MODE_AUTOMATIC; + final int a11yColorMode = getContext().getResources().getInteger( + R.integer.config_accessibilityColorMode); + if (a11yColorMode >= 0) { + return a11yColorMode; } } diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index b676618f4cd3..35a82aef51b5 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -49,6 +49,7 @@ import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManagerInternal; +import android.content.pm.ParceledListSlice; import android.content.pm.ServiceInfo; import android.database.ContentObserver; import android.net.Uri; @@ -1625,6 +1626,15 @@ public class JobSchedulerService extends com.android.server.SystemService } /** + * Maximum time buffer in which JobScheduler will try to optimize periodic job scheduling. This + * does not cause a job's period to be larger than requested (eg: if the requested period is + * shorter than this buffer). This is used to put a limit on when JobScheduler will intervene + * and try to optimize scheduling if the current job finished less than this amount of time to + * the start of the next period + */ + private static final long PERIODIC_JOB_WINDOW_BUFFER = 30 * MINUTE_IN_MILLIS; + + /** * Called after a periodic has executed so we can reschedule it. We take the last execution * time of the job to be the time of completion (i.e. the time at which this function is * called). @@ -1644,16 +1654,18 @@ public class JobSchedulerService extends com.android.server.SystemService final long period = periodicToReschedule.getJob().getIntervalMillis(); final long latestRunTimeElapsed = periodicToReschedule.getOriginalLatestRunTimeElapsed(); final long flex = periodicToReschedule.getJob().getFlexMillis(); + long rescheduleBuffer = 0; + final long diffMs = Math.abs(elapsedNow - latestRunTimeElapsed); if (elapsedNow > latestRunTimeElapsed) { // The job ran past its expected run window. Have it count towards the current window // and schedule a new job for the next window. if (DEBUG) { Slog.i(TAG, "Periodic job ran after its intended window."); } - final long diffMs = (elapsedNow - latestRunTimeElapsed); int numSkippedWindows = (int) (diffMs / period) + 1; // +1 to include original window - if (period != flex && diffMs > Math.min(30 * MINUTE_IN_MILLIS, (period - flex) / 2)) { + if (period != flex && diffMs > Math.min(PERIODIC_JOB_WINDOW_BUFFER, + (period - flex) / 2)) { if (DEBUG) { Slog.d(TAG, "Custom flex job ran too close to next window."); } @@ -1664,9 +1676,15 @@ public class JobSchedulerService extends com.android.server.SystemService newLatestRuntimeElapsed = latestRunTimeElapsed + (period * numSkippedWindows); } else { newLatestRuntimeElapsed = latestRunTimeElapsed + period; + if (diffMs < PERIODIC_JOB_WINDOW_BUFFER && diffMs < period / 6) { + // Add a little buffer to the start of the next window so the job doesn't run + // too soon after this completed one. + rescheduleBuffer = Math.min(PERIODIC_JOB_WINDOW_BUFFER, period / 6 - diffMs); + } } - final long newEarliestRunTimeElapsed = newLatestRuntimeElapsed - flex; + final long newEarliestRunTimeElapsed = newLatestRuntimeElapsed + - Math.min(flex, period - rescheduleBuffer); if (DEBUG) { Slog.v(TAG, "Rescheduling executed periodic. New execution window [" + @@ -2764,12 +2782,12 @@ public class JobSchedulerService extends com.android.server.SystemService } @Override - public List<JobInfo> getAllPendingJobs() throws RemoteException { + public ParceledListSlice<JobInfo> getAllPendingJobs() throws RemoteException { final int uid = Binder.getCallingUid(); long ident = Binder.clearCallingIdentity(); try { - return JobSchedulerService.this.getPendingJobs(uid); + return new ParceledListSlice<>(JobSchedulerService.this.getPendingJobs(uid)); } finally { Binder.restoreCallingIdentity(ident); } @@ -2905,7 +2923,7 @@ public class JobSchedulerService extends com.android.server.SystemService * <p class="note">This is a slow operation, so it should be called sparingly. */ @Override - public List<JobSnapshot> getAllJobSnapshots() { + public ParceledListSlice<JobSnapshot> getAllJobSnapshots() { final int uid = Binder.getCallingUid(); if (uid != Process.SYSTEM_UID) { throw new SecurityException( @@ -2916,7 +2934,7 @@ public class JobSchedulerService extends com.android.server.SystemService mJobs.forEachJob((job) -> snapshots.add( new JobSnapshot(job.getJob(), job.getSatisfiedConstraintFlags(), isReadyToBeExecutedLocked(job)))); - return snapshots; + return new ParceledListSlice<>(snapshots); } } }; diff --git a/services/core/java/com/android/server/location/GnssConfiguration.java b/services/core/java/com/android/server/location/GnssConfiguration.java index bd6662d9dc51..aa51aec216eb 100644 --- a/services/core/java/com/android/server/location/GnssConfiguration.java +++ b/services/core/java/com/android/server/location/GnssConfiguration.java @@ -317,8 +317,10 @@ class GnssConfiguration { if (configManager == null) { return; } - PersistableBundle configs = configManager.getConfigForSubId( - SubscriptionManager.getDefaultDataSubscriptionId()); + + int ddSubId = SubscriptionManager.getDefaultDataSubscriptionId(); + PersistableBundle configs = SubscriptionManager.isValidSubscriptionId(ddSubId) + ? configManager.getConfigForSubId(ddSubId) : null; if (configs == null) { if (DEBUG) Log.d(TAG, "SIM not ready, use default carrier config."); configs = CarrierConfigManager.getDefaultConfig(); diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index 5b7eca6e310e..b2315c7b7314 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -60,7 +60,6 @@ import android.os.WorkSource.WorkChain; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; -import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.TelephonyManager; import android.telephony.gsm.GsmCellLocation; import android.text.TextUtils; @@ -75,6 +74,7 @@ import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification; import com.android.internal.location.ProviderProperties; import com.android.internal.location.ProviderRequest; import com.android.internal.location.gnssmetrics.GnssMetrics; +import com.android.internal.telephony.TelephonyIntents; import com.android.server.location.GnssSatelliteBlacklistHelper.GnssSatelliteBlacklistCallback; import com.android.server.location.NtpTimeHelper.InjectNtpTimeCallback; @@ -184,7 +184,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements private static final int DOWNLOAD_PSDS_DATA = 6; private static final int UPDATE_LOCATION = 7; // Handle external location from network listener private static final int DOWNLOAD_PSDS_DATA_FINISHED = 11; - private static final int SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED = 12; private static final int INITIALIZE_HANDLER = 13; private static final int REQUEST_LOCATION = 16; private static final int REPORT_LOCATION = 17; // HAL reports location @@ -484,22 +483,13 @@ public class GnssLocationProvider extends AbstractLocationProvider implements updateLowPowerMode(); break; case CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED: + case TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED: subscriptionOrCarrierConfigChanged(context); break; } } }; - // TODO: replace OnSubscriptionsChangedListener with ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED - // broadcast receiver. - private final OnSubscriptionsChangedListener mOnSubscriptionsChangedListener = - new OnSubscriptionsChangedListener() { - @Override - public void onSubscriptionsChanged() { - sendMessage(SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED, 0, null); - } - }; - /** * Implements {@link GnssSatelliteBlacklistCallback#onUpdateSatelliteBlacklist}. */ @@ -515,12 +505,15 @@ public class GnssLocationProvider extends AbstractLocationProvider implements mContext.getSystemService(Context.TELEPHONY_SERVICE); CarrierConfigManager configManager = (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE); - String mccMnc = phone.getSimOperator(); + int ddSubId = SubscriptionManager.getDefaultDataSubscriptionId(); + String mccMnc = SubscriptionManager.isValidSubscriptionId(ddSubId) + ? phone.getSimOperator(ddSubId) : phone.getSimOperator(); boolean isKeepLppProfile = false; if (!TextUtils.isEmpty(mccMnc)) { if (DEBUG) Log.d(TAG, "SIM MCC/MNC is available: " + mccMnc); if (configManager != null) { - PersistableBundle b = configManager.getConfig(); + PersistableBundle b = SubscriptionManager.isValidSubscriptionId(ddSubId) + ? configManager.getConfigForSubId(ddSubId) : null; if (b != null) { isKeepLppProfile = b.getBoolean(CarrierConfigManager.Gps.KEY_PERSIST_LPP_MODE_BOOL); @@ -539,7 +532,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements SystemProperties.set(GnssConfiguration.LPP_PROFILE, ""); } reloadGpsProperties(); - mNIHandler.setSuplEsEnabled(mSuplEsEnabled); } else { if (DEBUG) Log.d(TAG, "SIM MCC/MNC is still not available"); } @@ -577,9 +569,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements mC2KServerPort = mGnssConfiguration.getC2KPort(TCP_MIN_PORT); mNIHandler.setEmergencyExtensionSeconds(mGnssConfiguration.getEsExtensionSec()); mSuplEsEnabled = mGnssConfiguration.getSuplEs(0) == 1; + mNIHandler.setSuplEsEnabled(mSuplEsEnabled); if (mGnssVisibilityControl != null) { - mGnssVisibilityControl.updateProxyApps(mGnssConfiguration.getProxyApps()); - mGnssVisibilityControl.setEsNotify(mGnssConfiguration.getEsNotify(0)); + mGnssVisibilityControl.onConfigurationUpdated(mGnssConfiguration); } } @@ -1892,28 +1884,34 @@ public class GnssLocationProvider extends AbstractLocationProvider implements TelephonyManager phone = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); int type = AGPS_SETID_TYPE_NONE; - String data = ""; + String setId = null; + int ddSubId = SubscriptionManager.getDefaultDataSubscriptionId(); if ((flags & AGPS_RIL_REQUEST_SETID_IMSI) == AGPS_RIL_REQUEST_SETID_IMSI) { - String data_temp = phone.getSubscriberId(); - if (data_temp == null) { - // This means the framework does not have the SIM card ready. - } else { + if (SubscriptionManager.isValidSubscriptionId(ddSubId)) { + setId = phone.getSubscriberId(ddSubId); + } + if (setId == null) { + setId = phone.getSubscriberId(); + } + if (setId != null) { // This means the framework has the SIM card. - data = data_temp; type = AGPS_SETID_TYPE_IMSI; } } else if ((flags & AGPS_RIL_REQUEST_SETID_MSISDN) == AGPS_RIL_REQUEST_SETID_MSISDN) { - String data_temp = phone.getLine1Number(); - if (data_temp == null) { - // This means the framework does not have the SIM card ready. - } else { + if (SubscriptionManager.isValidSubscriptionId(ddSubId)) { + setId = phone.getLine1Number(ddSubId); + } + if (setId == null) { + setId = phone.getLine1Number(); + } + if (setId != null) { // This means the framework has the SIM card. - data = data_temp; type = AGPS_SETID_TYPE_MSISDN; } } - native_agps_set_id(type, data); + + native_agps_set_id(type, (setId == null) ? "" : setId); } @NativeEntryPoint @@ -2025,9 +2023,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements case UPDATE_LOCATION: handleUpdateLocation((Location) msg.obj); break; - case SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED: - subscriptionOrCarrierConfigChanged(mContext); - break; case INITIALIZE_HANDLER: handleInitialize(); break; @@ -2066,17 +2061,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements // (this configuration might change in the future based on SIM changes) reloadGpsProperties(); - // TODO: When this object "finishes" we should unregister by invoking - // SubscriptionManager.getInstance(mContext).unregister - // (mOnSubscriptionsChangedListener); - // This is not strictly necessary because it will be unregistered if the - // notification fails but it is good form. - - // Register for SubscriptionInfo list changes which is guaranteed - // to invoke onSubscriptionsChanged the first time. - SubscriptionManager.from(mContext) - .addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener); - // listen for events IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ALARM_WAKEUP); @@ -2086,6 +2070,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements intentFilter.addAction(Intent.ACTION_SCREEN_OFF); intentFilter.addAction(Intent.ACTION_SCREEN_ON); intentFilter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); + intentFilter.addAction(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED); mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, this); mNetworkConnectivityHandler.registerNetworkCallbacks(); @@ -2164,8 +2149,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements return "DOWNLOAD_PSDS_DATA_FINISHED"; case UPDATE_LOCATION: return "UPDATE_LOCATION"; - case SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED: - return "SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED"; case INITIALIZE_HANDLER: return "INITIALIZE_HANDLER"; case REPORT_LOCATION: diff --git a/services/core/java/com/android/server/location/GnssVisibilityControl.java b/services/core/java/com/android/server/location/GnssVisibilityControl.java index a3670a45d9cb..c49d9000c1dd 100644 --- a/services/core/java/com/android/server/location/GnssVisibilityControl.java +++ b/services/core/java/com/android/server/location/GnssVisibilityControl.java @@ -76,7 +76,7 @@ class GnssVisibilityControl { private final GpsNetInitiatedHandler mNiHandler; private boolean mIsGpsEnabled; - private volatile boolean mEsNotify; + private boolean mEsNotify; // Number of non-framework location access proxy apps is expected to be small (< 5). private static final int ARRAY_MAP_INITIAL_CAPACITY_PROXY_APP_TO_LOCATION_PERMISSIONS = 7; @@ -124,10 +124,6 @@ class GnssVisibilityControl { } } - void updateProxyApps(List<String> nfwLocationAccessProxyApps) { - runOnHandler(() -> handleUpdateProxyApps(nfwLocationAccessProxyApps)); - } - void reportNfwNotification(String proxyAppPackageName, byte protocolStack, String otherProtocolStackName, byte requestor, String requestorId, byte responseType, boolean inEmergencyMode, boolean isCachedLocation) { @@ -136,15 +132,25 @@ class GnssVisibilityControl { requestor, requestorId, responseType, inEmergencyMode, isCachedLocation))); } - void setEsNotify(int esNotifyConfig) { - if (esNotifyConfig != ES_NOTIFY_NONE && esNotifyConfig != ES_NOTIFY_ALL) { + void onConfigurationUpdated(GnssConfiguration configuration) { + // The configuration object must be accessed only in the caller thread and not in mHandler. + List<String> nfwLocationAccessProxyApps = configuration.getProxyApps(); + int esNotify = configuration.getEsNotify(ES_NOTIFY_NONE); + runOnHandler(() -> { + setEsNotify(esNotify); + handleUpdateProxyApps(nfwLocationAccessProxyApps); + }); + } + + private void setEsNotify(int esNotify) { + if (esNotify != ES_NOTIFY_NONE && esNotify != ES_NOTIFY_ALL) { Log.e(TAG, "Config parameter " + GnssConfiguration.CONFIG_ES_NOTIFY_INT - + " is set to invalid value: " + esNotifyConfig + + " is set to invalid value: " + esNotify + ". Using default value: " + ES_NOTIFY_NONE); - esNotifyConfig = ES_NOTIFY_NONE; + esNotify = ES_NOTIFY_NONE; } - mEsNotify = (esNotifyConfig == ES_NOTIFY_ALL); + mEsNotify = (esNotify == ES_NOTIFY_ALL); } private void handleInitialize() { diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index b13cd1e1f0d4..c2125b0a997d 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -506,7 +506,7 @@ public class LockSettingsService extends ILockSettings.Stub { private void showEncryptionNotificationForProfile(UserHandle user) { Resources r = mContext.getResources(); CharSequence title = r.getText( - com.android.internal.R.string.user_encrypted_title); + com.android.internal.R.string.profile_encrypted_title); CharSequence message = r.getText( com.android.internal.R.string.profile_encrypted_message); CharSequence detail = r.getText( @@ -534,7 +534,7 @@ public class LockSettingsService extends ILockSettings.Stub { if (!StorageManager.isFileEncryptedNativeOrEmulated()) return; Notification notification = - new Notification.Builder(mContext, SystemNotificationChannels.SECURITY) + new Notification.Builder(mContext, SystemNotificationChannels.DEVICE_ADMIN) .setSmallIcon(com.android.internal.R.drawable.ic_user_secure) .setWhen(0) .setOngoing(true) diff --git a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java index 5d667b63be36..9e509f453921 100644 --- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java +++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java @@ -282,13 +282,14 @@ public final class MediaProjectionManagerService extends SystemService throw new IllegalArgumentException("package name must not be empty"); } + final UserHandle callingUser = Binder.getCallingUserHandle(); long callingToken = Binder.clearCallingIdentity(); MediaProjection projection; try { ApplicationInfo ai; try { - ai = mPackageManager.getApplicationInfo(packageName, 0); + ai = mPackageManager.getApplicationInfoAsUser(packageName, 0, callingUser); } catch (NameNotFoundException e) { throw new IllegalArgumentException("No package matching :" + packageName); } diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 44f76774fc8a..35f21496f2cc 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -363,7 +363,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements System.currentTimeMillis() - session.getUpdatedMillis(); final boolean valid; if (session.isStaged()) { - if (timeSinceUpdate >= MAX_TIME_SINCE_UPDATE_MILLIS) { + if (timeSinceUpdate >= MAX_TIME_SINCE_UPDATE_MILLIS + && session.isStagedAndInTerminalState()) { valid = false; } else { valid = true; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 0760ca34f26b..9d702093120e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -20096,14 +20096,14 @@ public class PackageManagerService extends IPackageManager.Stub + userId + ":"); filter.dump(new LogPrinter(Log.INFO, TAG), " "); } - if (!updateDefaultHomeNotLocked(userId)) { - postPreferredActivityChangedBroadcast(userId); - } synchronized (mPackages) { final PreferredIntentResolver pir = mSettings.editPreferredActivitiesLPw(userId); pir.addFilter(new PreferredActivity(filter, match, set, activity, always)); scheduleWritePackageRestrictionsLocked(userId); } + if (!updateDefaultHomeNotLocked(userId)) { + postPreferredActivityChangedBroadcast(userId); + } } private void postPreferredActivityChangedBroadcast(int userId) { @@ -20418,13 +20418,13 @@ public class PackageManagerService extends IPackageManager.Stub + " for user " + userId + ":"); filter.dump(new LogPrinter(Log.INFO, TAG), " "); } - updateDefaultHomeNotLocked(userId); - postPreferredActivityChangedBroadcast(userId); synchronized (mPackages) { mSettings.editPersistentPreferredActivitiesLPw(userId).addFilter( new PersistentPreferredActivity(filter, activity)); scheduleWritePackageRestrictionsLocked(userId); } + updateDefaultHomeNotLocked(userId); + postPreferredActivityChangedBroadcast(userId); } @Override diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 37c1aaa45b8b..b2ba2904cabc 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -929,6 +929,7 @@ public class PermissionManagerService { final BasePermission bp = mSettings.getPermissionLocked(permName); final boolean appSupportsRuntimePermissions = pkg.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.M; + String upgradedActivityRecognitionPermission = null; if (DEBUG_INSTALL) { Log.i(TAG, "Package " + pkg.packageName + " checking " + permName + ": " + bp); @@ -947,11 +948,40 @@ public class PermissionManagerService { // Cache newImplicitPermissions before modifing permissionsState as for the shared // uids the original and new state are the same object if (!origPermissions.hasRequestedPermission(permName) - && pkg.implicitPermissions.contains(permName)) { - newImplicitPermissions.add(permName); + && (pkg.implicitPermissions.contains(permName) + || (permName.equals(Manifest.permission.ACTIVITY_RECOGNITION)))) { + if (pkg.implicitPermissions.contains(permName)) { + // If permName is an implicit permission, try to auto-grant + newImplicitPermissions.add(permName); - if (DEBUG_PERMISSIONS) { - Slog.i(TAG, permName + " is newly added for " + pkg.packageName); + if (DEBUG_PERMISSIONS) { + Slog.i(TAG, permName + " is newly added for " + pkg.packageName); + } + } else { + // Special case for Activity Recognition permission. Even if AR permission + // is not an implicit permission we want to add it to the list (try to + // auto-grant it) if the app was installed on a device before AR permission + // was split, regardless of if the app now requests the new AR permission + // or has updated its target SDK and AR is no longer implicit to it. + // This is a compatibility workaround for apps when AR permission was + // split in Q. + int numSplitPerms = PermissionManager.SPLIT_PERMISSIONS.size(); + for (int splitPermNum = 0; splitPermNum < numSplitPerms; splitPermNum++) { + PermissionManager.SplitPermissionInfo sp = + PermissionManager.SPLIT_PERMISSIONS.get(splitPermNum); + String splitPermName = sp.getSplitPermission(); + if (sp.getNewPermissions().contains(permName) + && origPermissions.hasInstallPermission(splitPermName)) { + upgradedActivityRecognitionPermission = splitPermName; + newImplicitPermissions.add(permName); + + if (DEBUG_PERMISSIONS) { + Slog.i(TAG, permName + " is newly added for " + + pkg.packageName); + } + break; + } + } } } @@ -985,7 +1015,8 @@ public class PermissionManagerService { // For all apps normal permissions are install time ones. grant = GRANT_INSTALL; } else if (bp.isRuntime()) { - if (origPermissions.hasInstallPermission(bp.getName())) { + if (origPermissions.hasInstallPermission(bp.getName()) + || upgradedActivityRecognitionPermission != null) { // Before Q we represented some runtime permissions as install permissions, // in Q we cannot do this anymore. Hence upgrade them all. grant = GRANT_UPGRADE; @@ -1161,10 +1192,15 @@ public class PermissionManagerService { .getInstallPermissionState(perm); int flags = (permState != null) ? permState.getFlags() : 0; + BasePermission bpToRevoke = + upgradedActivityRecognitionPermission == null + ? bp : mSettings.getPermissionLocked( + upgradedActivityRecognitionPermission); // Remove install permission - if (origPermissions.revokeInstallPermission(bp) + if (origPermissions.revokeInstallPermission(bpToRevoke) != PERMISSION_OPERATION_FAILURE) { - origPermissions.updatePermissionFlags(bp, UserHandle.USER_ALL, + origPermissions.updatePermissionFlags(bpToRevoke, + UserHandle.USER_ALL, (MASK_PERMISSION_FLAGS_ALL & ~FLAG_PERMISSION_APPLY_RESTRICTION), 0); changedInstallPermission = true; @@ -1489,9 +1525,11 @@ public class PermissionManagerService { for (int userNum = 0; userNum < numUsers; userNum++) { int userId = users[userNum]; - ps.updatePermissionFlags(bp, userId, - FLAG_PERMISSION_REVOKE_WHEN_REQUESTED, - FLAG_PERMISSION_REVOKE_WHEN_REQUESTED); + if (!newPerm.equals(Manifest.permission.ACTIVITY_RECOGNITION)) { + ps.updatePermissionFlags(bp, userId, + FLAG_PERMISSION_REVOKE_WHEN_REQUESTED, + FLAG_PERMISSION_REVOKE_WHEN_REQUESTED); + } updatedUserIds = ArrayUtils.appendInt(updatedUserIds, userId); boolean inheritsFromInstallPerm = false; diff --git a/services/core/java/com/android/server/power/AttentionDetector.java b/services/core/java/com/android/server/power/AttentionDetector.java index 3262eb67a052..14f1196ab3a2 100644 --- a/services/core/java/com/android/server/power/AttentionDetector.java +++ b/services/core/java/com/android/server/power/AttentionDetector.java @@ -75,6 +75,8 @@ public class AttentionDetector { */ private final AtomicBoolean mRequested; + private long mLastActedOnNextScreenDimming; + /** * Monotonously increasing ID for the requests sent. */ @@ -150,6 +152,9 @@ public class AttentionDetector { } public long updateUserActivity(long nextScreenDimming) { + if (nextScreenDimming == mLastActedOnNextScreenDimming) { + return nextScreenDimming; + } if (!mIsSettingEnabled) { return nextScreenDimming; } @@ -190,13 +195,14 @@ public class AttentionDetector { // afterwards if AttentionManager couldn't deliver it. mRequested.set(true); mRequestId++; + mLastActedOnNextScreenDimming = nextScreenDimming; mCallback = new AttentionCallbackInternalImpl(mRequestId); + Slog.v(TAG, "Checking user attention, ID: " + mRequestId); final boolean sent = mAttentionManager.checkAttention(getAttentionTimeout(), mCallback); if (!sent) { mRequested.set(false); } - Slog.v(TAG, "Checking user attention, ID: " + mRequestId); return whenToCheck; } diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index ba415861acc6..3d59e66d13ef 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -281,8 +281,9 @@ class ActivityStack extends ConfigurationContainer { if (display != null && inSplitScreenPrimaryWindowingMode()) { // If we created a docked stack we want to resize it so it resizes all other stacks // in the system. - getStackDockedModeBounds(null, null, mTmpRect2, mTmpRect3); - mStackSupervisor.resizeDockedStackLocked(getRequestedOverrideBounds(), mTmpRect2, + getStackDockedModeBounds(null /* dockedBounds */, null /* currentTempTaskBounds */, + mTmpRect /* outStackBounds */, mTmpRect2 /* outTempTaskBounds */); + mStackSupervisor.resizeDockedStackLocked(getRequestedOverrideBounds(), mTmpRect, mTmpRect2, null, null, PRESERVE_WINDOWS); } mRootActivityContainer.updateUIDsPresentOnDisplay(); @@ -396,7 +397,6 @@ class ActivityStack extends ConfigurationContainer { private final Rect mTmpRect = new Rect(); private final Rect mTmpRect2 = new Rect(); - private final Rect mTmpRect3 = new Rect(); private final ActivityOptions mTmpOptions = ActivityOptions.makeBasic(); /** List for processing through a set of activities */ @@ -512,7 +512,6 @@ class ActivityStack extends ConfigurationContainer { mWindowManager = mService.mWindowManager; mStackId = stackId; mCurrentUser = mService.mAmInternal.getCurrentUserId(); - mTmpRect2.setEmpty(); // Set display id before setting activity and window type to make sure it won't affect // stacks on a wrong display. mDisplayId = display.mDisplayId; @@ -572,90 +571,87 @@ class ActivityStack extends ConfigurationContainer { public void onConfigurationChanged(Configuration newParentConfig) { final int prevWindowingMode = getWindowingMode(); final boolean prevIsAlwaysOnTop = isAlwaysOnTop(); - final ActivityDisplay display = getDisplay(); final int prevRotation = getWindowConfiguration().getRotation(); final int prevDensity = getConfiguration().densityDpi; final int prevScreenW = getConfiguration().screenWidthDp; final int prevScreenH = getConfiguration().screenHeightDp; - - getBounds(mTmpRect); // previous bounds + final Rect newBounds = mTmpRect; + // Initialize the new bounds by previous bounds as the input and output for calculating + // override bounds in pinned (pip) or split-screen mode. + getBounds(newBounds); super.onConfigurationChanged(newParentConfig); - if (display == null) { - return; - } - if (getTaskStack() == null) { + final ActivityDisplay display = getDisplay(); + if (display == null || getTaskStack() == null) { return; } + final boolean windowingModeChanged = prevWindowingMode != getWindowingMode(); + final int overrideWindowingMode = getRequestedOverrideWindowingMode(); // Update bounds if applicable boolean hasNewOverrideBounds = false; // Use override windowing mode to prevent extra bounds changes if inheriting the mode. - if (getRequestedOverrideWindowingMode() == WINDOWING_MODE_PINNED) { + if (overrideWindowingMode == WINDOWING_MODE_PINNED) { // Pinned calculation already includes rotation - mTmpRect2.set(mTmpRect); - hasNewOverrideBounds = getTaskStack().calculatePinnedBoundsForConfigChange(mTmpRect2); - } else { + hasNewOverrideBounds = getTaskStack().calculatePinnedBoundsForConfigChange(newBounds); + } else if (!matchParentBounds()) { + // If the parent (display) has rotated, rotate our bounds to best-fit where their + // bounds were on the pre-rotated display. final int newRotation = getWindowConfiguration().getRotation(); - if (!matchParentBounds()) { - // If the parent (display) has rotated, rotate our bounds to best-fit where their - // bounds were on the pre-rotated display. - if (prevRotation != newRotation) { - mTmpRect2.set(mTmpRect); - getDisplay().mDisplayContent - .rotateBounds(newParentConfig.windowConfiguration.getBounds(), - prevRotation, newRotation, mTmpRect2); - hasNewOverrideBounds = true; - } + final boolean rotationChanged = prevRotation != newRotation; + if (rotationChanged) { + display.mDisplayContent.rotateBounds( + newParentConfig.windowConfiguration.getBounds(), prevRotation, newRotation, + newBounds); + hasNewOverrideBounds = true; + } + // Use override windowing mode to prevent extra bounds changes if inheriting the mode. + if (overrideWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY + || overrideWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) { // If entering split screen or if something about the available split area changes, // recalculate the split windows to match the new configuration. - if (prevRotation != newRotation + if (rotationChanged || windowingModeChanged || prevDensity != getConfiguration().densityDpi - || prevWindowingMode != getWindowingMode() || prevScreenW != getConfiguration().screenWidthDp || prevScreenH != getConfiguration().screenHeightDp) { - // Use override windowing mode to prevent extra bounds changes if inheriting - // the mode. - if (getRequestedOverrideWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY - || getRequestedOverrideWindowingMode() - == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) { - mTmpRect2.set(mTmpRect); - getTaskStack() - .calculateDockedBoundsForConfigChange(newParentConfig, mTmpRect2); - hasNewOverrideBounds = true; - } + getTaskStack().calculateDockedBoundsForConfigChange(newParentConfig, newBounds); + hasNewOverrideBounds = true; } } } - if (getWindowingMode() != prevWindowingMode) { + + if (windowingModeChanged) { // Use override windowing mode to prevent extra bounds changes if inheriting the mode. - if (getRequestedOverrideWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { - getStackDockedModeBounds(null, null, mTmpRect2, mTmpRect3); + if (overrideWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { + getStackDockedModeBounds(null /* dockedBounds */, null /* currentTempTaskBounds */, + newBounds /* outStackBounds */, mTmpRect2 /* outTempTaskBounds */); // immediately resize so docked bounds are available in onSplitScreenModeActivated setTaskDisplayedBounds(null); - setTaskBounds(mTmpRect2); - setBounds(mTmpRect2); - } else if ( - getRequestedOverrideWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) { + setTaskBounds(newBounds); + setBounds(newBounds); + newBounds.set(newBounds); + } else if (overrideWindowingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) { Rect dockedBounds = display.getSplitScreenPrimaryStack().getBounds(); final boolean isMinimizedDock = - getDisplay().mDisplayContent.getDockedDividerController().isMinimizedDock(); + display.mDisplayContent.getDockedDividerController().isMinimizedDock(); if (isMinimizedDock) { TaskRecord topTask = display.getSplitScreenPrimaryStack().topTask(); if (topTask != null) { dockedBounds = topTask.getBounds(); } } - getStackDockedModeBounds(dockedBounds, null, mTmpRect2, mTmpRect3); + getStackDockedModeBounds(dockedBounds, null /* currentTempTaskBounds */, + newBounds /* outStackBounds */, mTmpRect2 /* outTempTaskBounds */); hasNewOverrideBounds = true; } - } - if (prevWindowingMode != getWindowingMode()) { display.onStackWindowingModeChanged(this); } if (hasNewOverrideBounds) { - mRootActivityContainer.resizeStack(this, mTmpRect2, null, null, PRESERVE_WINDOWS, + // Note the resizeStack may enter onConfigurationChanged recursively, so we make a copy + // of the temporary bounds (newBounds is mTmpRect) to avoid it being modified. + mRootActivityContainer.resizeStack(this, new Rect(newBounds), null /* tempTaskBounds */, + null /* tempTaskInsetBounds */, PRESERVE_WINDOWS, true /* allowResizeInDockedMode */, true /* deferResume */); } if (prevIsAlwaysOnTop != isAlwaysOnTop()) { diff --git a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java index b8442a887dac..1cdb49d25dfd 100644 --- a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java +++ b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java @@ -46,7 +46,6 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.SuspendDialogInfo; import android.content.pm.UserInfo; -import android.os.Binder; import android.os.Bundle; import android.os.RemoteException; import android.os.UserHandle; @@ -304,7 +303,7 @@ class ActivityStartInterceptor { return null; } // TODO(b/28935539): should allow certain activities to bypass work challenge - final IntentSender target = createIntentSenderForOriginalIntent(Binder.getCallingUid(), + final IntentSender target = createIntentSenderForOriginalIntent(mCallingUid, FLAG_CANCEL_CURRENT | FLAG_ONE_SHOT | FLAG_IMMUTABLE); final KeyguardManager km = (KeyguardManager) mServiceContext .getSystemService(KEYGUARD_SERVICE); diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index b8504db8e810..197a3cf2b3ab 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -255,6 +255,7 @@ public class DisplayPolicy { private volatile boolean mNavigationBarCanMove; private volatile boolean mNavigationBarLetsThroughTaps; private volatile boolean mNavigationBarAlwaysShowOnSideGesture; + private volatile boolean mAllowSeamlessRotationDespiteNavBarMoving; // Written by vr manager thread, only read in this class. private volatile boolean mPersistentVrModeEnabled; @@ -2726,6 +2727,8 @@ public class DisplayPolicy { mNavigationBarCanMove = mDisplayContent.mBaseDisplayWidth != mDisplayContent.mBaseDisplayHeight && res.getBoolean(R.bool.config_navBarCanMove); + mAllowSeamlessRotationDespiteNavBarMoving = + res.getBoolean(R.bool.config_allowSeamlessRotationDespiteNavBarMoving); } /** @@ -3508,8 +3511,9 @@ public class DisplayPolicy { } // If the navigation bar can't change sides, then it will // jump when we change orientations and we don't rotate - // seamlessly. - if (!navigationBarCanMove()) { + // seamlessly - unless that is allowed, eg. with gesture + // navigation where the navbar is low-profile enough that this isn't very noticeable. + if (!navigationBarCanMove() && !mAllowSeamlessRotationDespiteNavBarMoving) { return false; } diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index df36b09d56e8..169f03b0023d 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -133,27 +133,33 @@ class KeyguardController { * Update the Keyguard showing state. */ void setKeyguardShown(boolean keyguardShowing, boolean aodShowing) { - boolean showingChanged = keyguardShowing != mKeyguardShowing || aodShowing != mAodShowing; // If keyguard is going away, but SystemUI aborted the transition, need to reset state. - showingChanged |= mKeyguardGoingAway && keyguardShowing; - if (!showingChanged) { + final boolean keyguardChanged = keyguardShowing != mKeyguardShowing + || mKeyguardGoingAway && keyguardShowing; + final boolean aodChanged = aodShowing != mAodShowing; + if (!keyguardChanged && !aodChanged) { return; } mKeyguardShowing = keyguardShowing; mAodShowing = aodShowing; mWindowManager.setAodShowing(aodShowing); - if (showingChanged) { + + if (keyguardChanged) { + // Irrelevant to AOD. dismissDockedStackIfNeeded(); setKeyguardGoingAway(false); - // TODO(b/113840485): Check usage for non-default display - mWindowManager.setKeyguardOrAodShowingOnDefaultDisplay( - isKeyguardOrAodShowing(DEFAULT_DISPLAY)); if (keyguardShowing) { mDismissalRequested = false; } } - mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS); + // TODO(b/113840485): Check usage for non-default display + mWindowManager.setKeyguardOrAodShowingOnDefaultDisplay( + isKeyguardOrAodShowing(DEFAULT_DISPLAY)); + + // Update the sleep token first such that ensureActivitiesVisible has correct sleep token + // state when evaluating visibilities. updateKeyguardSleepToken(); + mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS); } /** diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 8fa915d66483..757f6a1c2f94 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -1632,21 +1632,6 @@ public class TaskStack extends WindowContainer<Task> implements @Override // AnimatesBounds public void onAnimationEnd(boolean schedulePipModeChangedCallback, Rect finalStackSize, boolean moveToFullscreen) { - if (mAnimationType == BoundsAnimationController.FADE_IN) { - setPinnedStackAlpha(1f); - try { - mWmService.mActivityTaskManager.notifyPinnedStackAnimationEnded(); - } catch (RemoteException e) { - // I don't believe you... - } - return; - } - - onBoundAnimationEnd(schedulePipModeChangedCallback, finalStackSize, moveToFullscreen); - } - - private void onBoundAnimationEnd(boolean schedulePipModeChangedCallback, Rect finalStackSize, - boolean moveToFullscreen) { if (inPinnedWindowingMode()) { // Update to the final bounds if requested. This is done here instead of in the bounds // animator to allow us to coordinate this after we notify the PiP mode changed @@ -1658,6 +1643,11 @@ public class TaskStack extends WindowContainer<Task> implements mBoundsAnimationTarget, false /* forceUpdate */); } + if (mAnimationType == BoundsAnimationController.FADE_IN) { + setPinnedStackAlpha(1f); + mActivityStack.mService.notifyPinnedStackAnimationEnded(); + } + if (finalStackSize != null && !mCancelCurrentBoundsAnimation) { setPinnedStackSize(finalStackSize, null); } else { @@ -1666,14 +1656,9 @@ public class TaskStack extends WindowContainer<Task> implements onPipAnimationEndResize(); } - try { - mWmService.mActivityTaskManager.notifyPinnedStackAnimationEnded(); - if (moveToFullscreen) { - mWmService.mActivityTaskManager.moveTasksToFullscreenStack(mStackId, - true /* onTop */); - } - } catch (RemoteException e) { - // I don't believe you... + mActivityStack.mService.notifyPinnedStackAnimationEnded(); + if (moveToFullscreen) { + mActivityStack.mService.moveTasksToFullscreenStack(mStackId, true /* onTop */); } } else { // No PiP animation, just run the normal animation-end logic diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 204a1ea977e7..fb3076ba9ddd 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -59,6 +59,7 @@ #include <android_view_PointerIcon.h> #include <android/graphics/GraphicsJNI.h> +#include <nativehelper/ScopedLocalFrame.h> #include <nativehelper/ScopedLocalRef.h> #include <nativehelper/ScopedPrimitiveArray.h> #include <nativehelper/ScopedUtfChars.h> @@ -723,6 +724,7 @@ nsecs_t NativeInputManager::notifyANR(const sp<InputApplicationHandle>& inputApp ATRACE_CALL(); JNIEnv* env = jniEnv(); + ScopedLocalFrame localFrame(env); jobject tokenObj = javaObjectForIBinder(env, token); jstring reasonObj = env->NewStringUTF(reason.c_str()); @@ -735,8 +737,6 @@ nsecs_t NativeInputManager::notifyANR(const sp<InputApplicationHandle>& inputApp } else { assert(newTimeout >= 0); } - - env->DeleteLocalRef(reasonObj); return newTimeout; } @@ -747,6 +747,7 @@ void NativeInputManager::notifyInputChannelBroken(const sp<IBinder>& token) { ATRACE_CALL(); JNIEnv* env = jniEnv(); + ScopedLocalFrame localFrame(env); jobject tokenObj = javaObjectForIBinder(env, token); if (tokenObj) { @@ -764,6 +765,7 @@ void NativeInputManager::notifyFocusChanged(const sp<IBinder>& oldToken, ATRACE_CALL(); JNIEnv* env = jniEnv(); + ScopedLocalFrame localFrame(env); jobject oldTokenObj = javaObjectForIBinder(env, oldToken); jobject newTokenObj = javaObjectForIBinder(env, newToken); @@ -1139,6 +1141,7 @@ nsecs_t NativeInputManager::interceptKeyBeforeDispatching( nsecs_t result = 0; if (policyFlags & POLICY_FLAG_TRUSTED) { JNIEnv* env = jniEnv(); + ScopedLocalFrame localFrame(env); // Token may be null jobject tokenObj = javaObjectForIBinder(env, token); @@ -1173,6 +1176,7 @@ bool NativeInputManager::dispatchUnhandledKey(const sp<IBinder>& token, bool result = false; if (policyFlags & POLICY_FLAG_TRUSTED) { JNIEnv* env = jniEnv(); + ScopedLocalFrame localFrame(env); // Note: tokenObj may be null. jobject tokenObj = javaObjectForIBinder(env, token); @@ -1224,6 +1228,7 @@ bool NativeInputManager::checkInjectEventsPermissionNonReentrant( void NativeInputManager::onPointerDownOutsideFocus(const sp<IBinder>& touchedToken) { ATRACE_CALL(); JNIEnv* env = jniEnv(); + ScopedLocalFrame localFrame(env); jobject touchedTokenObj = javaObjectForIBinder(env, touchedToken); env->CallVoidMethod(mServiceObj, gServiceClassInfo.onPointerDownOutsideFocus, touchedTokenObj); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/RemoteBugreportUtils.java b/services/devicepolicy/java/com/android/server/devicepolicy/RemoteBugreportUtils.java index 344077cce06e..0838fbc536c1 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/RemoteBugreportUtils.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/RemoteBugreportUtils.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.app.Notification; import android.app.PendingIntent; import android.app.admin.DevicePolicyManager; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.os.UserHandle; @@ -65,7 +64,7 @@ class RemoteBugreportUtils { dialogIntent, 0, null, UserHandle.CURRENT); Notification.Builder builder = - new Notification.Builder(context, SystemNotificationChannels.DEVELOPER) + new Notification.Builder(context, SystemNotificationChannels.DEVICE_ADMIN) .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb) .setOngoing(true) .setLocalOnly(true) diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 24540fd47e9f..2b5cd010705c 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1167,9 +1167,12 @@ public final class SystemServer { if (!mOnlyCore) { traceBeginAndSlog("UpdatePackagesIfNeeded"); try { + Watchdog.getInstance().pauseWatchingCurrentThread("dexopt"); mPackageManagerService.updatePackagesIfNeeded(); } catch (Throwable e) { reportWtf("update packages", e); + } finally { + Watchdog.getInstance().resumeWatchingCurrentThread("dexopt"); } traceEnd(); } @@ -1400,6 +1403,7 @@ public final class SystemServer { traceBeginAndSlog("StartNotificationManager"); mSystemServiceManager.startService(NotificationManagerService.class); + SystemNotificationChannels.removeDeprecated(context); SystemNotificationChannels.createAll(context); notification = INotificationManager.Stub.asInterface( ServiceManager.getService(Context.NOTIFICATION_SERVICE)); diff --git a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java index f7edf65a499f..18c524ad7a94 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java @@ -183,15 +183,188 @@ public class JobSchedulerServiceTest { assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); - advanceElapsedClock(45 * MINUTE_IN_MILLIS); // now + 55 minutes + advanceElapsedClock(20 * MINUTE_IN_MILLIS); // now + 30 minutes rescheduledJob = mService.getRescheduleJobForPeriodic(job); assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + advanceElapsedClock(25 * MINUTE_IN_MILLIS); // now + 55 minutes + + rescheduledJob = mService.getRescheduleJobForPeriodic(job); + // Shifted because it's close to the end of the window. + assertEquals(nextWindowStartTime + 5 * MINUTE_IN_MILLIS, + rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + advanceElapsedClock(4 * MINUTE_IN_MILLIS); // now + 59 minutes rescheduledJob = mService.getRescheduleJobForPeriodic(job); + // Shifted because it's close to the end of the window. + assertEquals(nextWindowStartTime + 9 * MINUTE_IN_MILLIS, + rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + } + + /** + * Confirm that {@link JobSchedulerService#getRescheduleJobForPeriodic(JobStatus)} returns a job + * with an extra delay and correct deadline constraint if the periodic job is completed near the + * end of its expected running window. + */ + @Test + public void testGetRescheduleJobForPeriodic_closeToEndOfWindow() { + JobStatus frequentJob = createJobStatus( + "testGetRescheduleJobForPeriodic_closeToEndOfWindow", + createJobInfo().setPeriodic(15 * MINUTE_IN_MILLIS)); + long now = sElapsedRealtimeClock.millis(); + long nextWindowStartTime = now + 15 * MINUTE_IN_MILLIS; + long nextWindowEndTime = now + 30 * MINUTE_IN_MILLIS; + + // At the beginning of the window. Next window should be unaffected. + JobStatus rescheduledJob = mService.getRescheduleJobForPeriodic(frequentJob); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // Halfway through window. Next window should be unaffected. + advanceElapsedClock((long) (7.5 * MINUTE_IN_MILLIS)); + rescheduledJob = mService.getRescheduleJobForPeriodic(frequentJob); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // In last 1/6 of window. Next window start time should be shifted slightly. + advanceElapsedClock(6 * MINUTE_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(frequentJob); + assertEquals(nextWindowStartTime + MINUTE_IN_MILLIS, + rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + JobStatus mediumJob = createJobStatus("testGetRescheduleJobForPeriodic_closeToEndOfWindow", + createJobInfo().setPeriodic(HOUR_IN_MILLIS)); + now = sElapsedRealtimeClock.millis(); + nextWindowStartTime = now + HOUR_IN_MILLIS; + nextWindowEndTime = now + 2 * HOUR_IN_MILLIS; + + // At the beginning of the window. Next window should be unaffected. + rescheduledJob = mService.getRescheduleJobForPeriodic(mediumJob); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // Halfway through window. Next window should be unaffected. + advanceElapsedClock(30 * MINUTE_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(mediumJob); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // At the edge 1/6 of window. Next window should be unaffected. + advanceElapsedClock(20 * MINUTE_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(mediumJob); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // In last 1/6 of window. Next window start time should be shifted slightly. + advanceElapsedClock(6 * MINUTE_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(mediumJob); + assertEquals(nextWindowStartTime + (6 * MINUTE_IN_MILLIS), + rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + JobStatus longJob = createJobStatus("testGetRescheduleJobForPeriodic_closeToEndOfWindow", + createJobInfo().setPeriodic(6 * HOUR_IN_MILLIS)); + now = sElapsedRealtimeClock.millis(); + nextWindowStartTime = now + 6 * HOUR_IN_MILLIS; + nextWindowEndTime = now + 12 * HOUR_IN_MILLIS; + + // At the beginning of the window. Next window should be unaffected. + rescheduledJob = mService.getRescheduleJobForPeriodic(longJob); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // Halfway through window. Next window should be unaffected. + advanceElapsedClock(3 * HOUR_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(longJob); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // At the edge 1/6 of window. Next window should be unaffected. + advanceElapsedClock(2 * HOUR_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(longJob); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // In last 1/6 of window. Next window should be unaffected since we're over the shift cap. + advanceElapsedClock(15 * MINUTE_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(longJob); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // In last 1/6 of window. Next window start time should be shifted slightly. + advanceElapsedClock(30 * MINUTE_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(longJob); + assertEquals(nextWindowStartTime + (30 * MINUTE_IN_MILLIS), + rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // Flex duration close to period duration. + JobStatus gameyFlex = createJobStatus("testGetRescheduleJobForPeriodic_closeToEndOfWindow", + createJobInfo().setPeriodic(HOUR_IN_MILLIS, 59 * MINUTE_IN_MILLIS)); + now = sElapsedRealtimeClock.millis(); + nextWindowStartTime = now + HOUR_IN_MILLIS + MINUTE_IN_MILLIS; + nextWindowEndTime = now + 2 * HOUR_IN_MILLIS; + advanceElapsedClock(MINUTE_IN_MILLIS); + + // At the beginning of the window. Next window should be unaffected. + rescheduledJob = mService.getRescheduleJobForPeriodic(gameyFlex); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // Halfway through window. Next window should be unaffected. + advanceElapsedClock(29 * MINUTE_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(gameyFlex); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // At the edge 1/6 of window. Next window should be unaffected. + advanceElapsedClock(20 * MINUTE_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(gameyFlex); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // In last 1/6 of window. Next window start time should be shifted slightly. + advanceElapsedClock(6 * MINUTE_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(gameyFlex); + assertEquals(nextWindowStartTime + (5 * MINUTE_IN_MILLIS), + rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // Very short flex duration compared to period duration. + JobStatus superFlex = createJobStatus("testGetRescheduleJobForPeriodic_closeToEndOfWindow", + createJobInfo().setPeriodic(HOUR_IN_MILLIS, 10 * MINUTE_IN_MILLIS)); + now = sElapsedRealtimeClock.millis(); + nextWindowStartTime = now + HOUR_IN_MILLIS + 50 * MINUTE_IN_MILLIS; + nextWindowEndTime = now + 2 * HOUR_IN_MILLIS; + advanceElapsedClock(MINUTE_IN_MILLIS); + + // At the beginning of the window. Next window should be unaffected. + rescheduledJob = mService.getRescheduleJobForPeriodic(superFlex); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // Halfway through window. Next window should be unaffected. + advanceElapsedClock(29 * MINUTE_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(superFlex); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // At the edge 1/6 of window. Next window should be unaffected. + advanceElapsedClock(20 * MINUTE_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(superFlex); + assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); + + // In last 1/6 of window. Next window should be unaffected since the flex duration pushes + // the next window start time far enough away. + advanceElapsedClock(6 * MINUTE_IN_MILLIS); + rescheduledJob = mService.getRescheduleJobForPeriodic(superFlex); assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); } @@ -265,7 +438,9 @@ public class JobSchedulerServiceTest { advanceElapsedClock(10 * MINUTE_IN_MILLIS); // now + 55 minutes rescheduledJob = mService.getRescheduleJobForPeriodic(failedJob); - assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + // Shifted because it's close to the end of the window. + assertEquals(nextWindowStartTime + 5 * MINUTE_IN_MILLIS, + rescheduledJob.getEarliestRunTime()); assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); advanceElapsedClock(2 * MINUTE_IN_MILLIS); // now + 57 minutes @@ -273,7 +448,9 @@ public class JobSchedulerServiceTest { advanceElapsedClock(2 * MINUTE_IN_MILLIS); // now + 59 minutes rescheduledJob = mService.getRescheduleJobForPeriodic(failedJob); - assertEquals(nextWindowStartTime, rescheduledJob.getEarliestRunTime()); + // Shifted because it's close to the end of the window. + assertEquals(nextWindowStartTime + 9 * MINUTE_IN_MILLIS, + rescheduledJob.getEarliestRunTime()); assertEquals(nextWindowEndTime, rescheduledJob.getLatestRunTimeElapsed()); } diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java index 8af4edda3b8b..18453aa13264 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java @@ -27,6 +27,7 @@ import android.app.trust.TrustManager; import android.content.pm.UserInfo; import android.database.sqlite.SQLiteDatabase; import android.os.FileUtils; +import android.os.SystemClock; import android.os.UserManager; import android.os.storage.StorageManager; import android.platform.test.annotations.Presubmit; @@ -125,7 +126,7 @@ public class LockSettingsStorageTests extends AndroidTestCase { List<Thread> threads = new ArrayList<>(); for (int i = 0; i < 100; i++) { final int threadId = i; - threads.add(new Thread() { + threads.add(new Thread("testKeyValue_Concurrency_" + i) { @Override public void run() { synchronized (monitor) { @@ -134,17 +135,17 @@ public class LockSettingsStorageTests extends AndroidTestCase { } catch (InterruptedException e) { return; } - mStorage.writeKeyValue("key", "1 from thread " + threadId, 0); - mStorage.readKeyValue("key", "default", 0); - mStorage.writeKeyValue("key", "2 from thread " + threadId, 0); - mStorage.readKeyValue("key", "default", 0); - mStorage.writeKeyValue("key", "3 from thread " + threadId, 0); - mStorage.readKeyValue("key", "default", 0); - mStorage.writeKeyValue("key", "4 from thread " + threadId, 0); - mStorage.readKeyValue("key", "default", 0); - mStorage.writeKeyValue("key", "5 from thread " + threadId, 0); - mStorage.readKeyValue("key", "default", 0); } + mStorage.writeKeyValue("key", "1 from thread " + threadId, 0); + mStorage.readKeyValue("key", "default", 0); + mStorage.writeKeyValue("key", "2 from thread " + threadId, 0); + mStorage.readKeyValue("key", "default", 0); + mStorage.writeKeyValue("key", "3 from thread " + threadId, 0); + mStorage.readKeyValue("key", "default", 0); + mStorage.writeKeyValue("key", "4 from thread " + threadId, 0); + mStorage.readKeyValue("key", "default", 0); + mStorage.writeKeyValue("key", "5 from thread " + threadId, 0); + mStorage.readKeyValue("key", "default", 0); } }); threads.get(i).start(); @@ -153,12 +154,7 @@ public class LockSettingsStorageTests extends AndroidTestCase { synchronized (monitor) { monitor.notifyAll(); } - for (int i = 0; i < threads.size(); i++) { - try { - threads.get(i).join(); - } catch (InterruptedException e) { - } - } + joinAll(threads, 10000); assertEquals('5', mStorage.readKeyValue("key", "default", 0).charAt(0)); mStorage.clearCache(); assertEquals('5', mStorage.readKeyValue("key", "default", 0).charAt(0)); @@ -515,4 +511,29 @@ public class LockSettingsStorageTests extends AndroidTestCase { } return captured[0]; } + + private static void joinAll(List<Thread> threads, long timeoutMillis) { + long deadline = SystemClock.uptimeMillis() + timeoutMillis; + for (Thread t : threads) { + try { + t.join(deadline - SystemClock.uptimeMillis()); + if (t.isAlive()) { + t.interrupt(); + throw new RuntimeException( + "Joining " + t + " timed out. Stack: \n" + getStack(t)); + } + } catch (InterruptedException e) { + throw new RuntimeException("Interrupted while joining " + t, e); + } + } + } + + private static String getStack(Thread t) { + StringBuilder sb = new StringBuilder(); + sb.append(t.toString()).append('\n'); + for (StackTraceElement ste : t.getStackTrace()) { + sb.append("\tat ").append(ste.toString()).append('\n'); + } + return sb.toString(); + } } diff --git a/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java b/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java index c30a7dd8321c..a63f49b1fe3d 100644 --- a/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java +++ b/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java @@ -23,6 +23,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.atMost; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; @@ -182,10 +183,22 @@ public class AttentionDetectorTest extends AndroidTestCase { } @Test + public void testOnUserActivity_ignoresIfAlreadyDoneForThatNextScreenDimming() { + long when = registerAttention(); + verify(mAttentionManagerInternal).checkAttention(anyLong(), any()); + assertThat(when).isLessThan(mNextDimming); + clearInvocations(mAttentionManagerInternal); + + long redundantWhen = mAttentionDetector.updateUserActivity(mNextDimming); + assertThat(redundantWhen).isEqualTo(mNextDimming); + verify(mAttentionManagerInternal, never()).checkAttention(anyLong(), any()); + } + + @Test public void testOnUserActivity_skipsIfAlreadyScheduled() { registerAttention(); reset(mAttentionManagerInternal); - long when = mAttentionDetector.updateUserActivity(mNextDimming); + long when = mAttentionDetector.updateUserActivity(mNextDimming + 1); verify(mAttentionManagerInternal, never()).checkAttention(anyLong(), any()); assertThat(when).isLessThan(mNextDimming); } diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java index 77866279a751..75e8fb5a34fe 100644 --- a/services/usage/java/com/android/server/usage/AppStandbyController.java +++ b/services/usage/java/com/android/server/usage/AppStandbyController.java @@ -1356,7 +1356,7 @@ public class AppStandbyController { private void fetchCarrierPrivilegedAppsLocked() { TelephonyManager telephonyManager = mContext.getSystemService(TelephonyManager.class); - mCarrierPrivilegedApps = telephonyManager.getPackagesWithCarrierPrivileges(); + mCarrierPrivilegedApps = telephonyManager.getPackagesWithCarrierPrivilegesForAllPhones(); mHaveCarrierPrivilegedApps = true; if (DEBUG) { Slog.d(TAG, "apps with carrier privilege " + mCarrierPrivilegedApps); diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 93c1b2138ccd..eefaf47d0387 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -1451,6 +1451,9 @@ public class TelecomManager { * foreground call is ended. * <p> * Requires permission {@link android.Manifest.permission#ANSWER_PHONE_CALLS}. + * <p> + * Note: this method CANNOT be used to end ongoing emergency calls and will return {@code false} + * if an attempt is made to end an emergency call. * * @return {@code true} if there is a call which will be rejected or terminated, {@code false} * otherwise. @@ -1458,8 +1461,6 @@ public class TelecomManager { * instead. Apps performing call screening should use the {@link CallScreeningService} API * instead. */ - - @RequiresPermission(Manifest.permission.ANSWER_PHONE_CALLS) @Deprecated public boolean endCall() { diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index d00341b3fe92..6ba359b78ee4 100755 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -836,13 +836,6 @@ public class CarrierConfigManager { "carrier_metered_roaming_apn_types_strings"; /** - * Default APN types that are metered on IWLAN by the carrier - * @hide - */ - public static final String KEY_CARRIER_METERED_IWLAN_APN_TYPES_STRINGS = - "carrier_metered_iwlan_apn_types_strings"; - - /** * CDMA carrier ERI (Enhanced Roaming Indicator) file name * @hide */ @@ -3116,15 +3109,6 @@ public class CarrierConfigManager { new String[]{"default", "mms", "dun", "supl"}); sDefaults.putStringArray(KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS, new String[]{"default", "mms", "dun", "supl"}); - // By default all APNs should be unmetered if the device is on IWLAN. However, we add - // default APN as metered here as a workaround for P because in some cases, a data - // connection was brought up on cellular, but later on the device camped on IWLAN. That - // data connection was incorrectly treated as unmetered due to the current RAT IWLAN. - // Marking it as metered for now can workaround the issue. - // Todo: This will be fixed in Q when IWLAN full refactoring is completed. - sDefaults.putStringArray(KEY_CARRIER_METERED_IWLAN_APN_TYPES_STRINGS, - new String[]{"default"}); - sDefaults.putIntArray(KEY_ONLY_SINGLE_DC_ALLOWED_INT_ARRAY, new int[]{ 4, /* IS95A */ diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index c57f9e63f9db..f31ac2ea5f35 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -173,6 +173,11 @@ public class SubscriptionInfo implements Parcelable { private ParcelUuid mGroupUUID; /** + * A package name that specifies who created the group. Null if mGroupUUID is null. + */ + private String mGroupOwner; + + /** * Whether group of the subscription is disabled. * This is only useful if it's a grouped opportunistic subscription. In this case, if all * primary (non-opportunistic) subscriptions in the group are deactivated (unplugged pSIM @@ -203,9 +208,10 @@ public class SubscriptionInfo implements Parcelable { Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded, @Nullable UiccAccessRule[] accessRules, String cardString) { this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number, - roaming, icon, mcc, mnc, countryIso, isEmbedded, accessRules, cardString, - false, null, TelephonyManager.UNKNOWN_CARRIER_ID, - SubscriptionManager.PROFILE_CLASS_DEFAULT); + roaming, icon, mcc, mnc, countryIso, isEmbedded, accessRules, cardString, -1, + false, null, false, TelephonyManager.UNKNOWN_CARRIER_ID, + SubscriptionManager.PROFILE_CLASS_DEFAULT, + SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, null); } /** @@ -219,7 +225,7 @@ public class SubscriptionInfo implements Parcelable { this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number, roaming, icon, mcc, mnc, countryIso, isEmbedded, accessRules, cardString, -1, isOpportunistic, groupUUID, false, carrierId, profileClass, - SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM); + SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, null); } /** @@ -229,8 +235,8 @@ public class SubscriptionInfo implements Parcelable { CharSequence carrierName, int nameSource, int iconTint, String number, int roaming, Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded, @Nullable UiccAccessRule[] accessRules, String cardString, int cardId, - boolean isOpportunistic, @Nullable String groupUUID, - boolean isGroupDisabled, int carrierId, int profileClass, int subType) { + boolean isOpportunistic, @Nullable String groupUUID, boolean isGroupDisabled, + int carrierId, int profileClass, int subType, @Nullable String groupOwner) { this.mId = id; this.mIccId = iccId; this.mSimSlotIndex = simSlotIndex; @@ -254,6 +260,7 @@ public class SubscriptionInfo implements Parcelable { this.mCarrierId = carrierId; this.mProfileClass = profileClass; this.mSubscriptionType = subType; + this.mGroupOwner = groupOwner; } /** @@ -500,6 +507,15 @@ public class SubscriptionInfo implements Parcelable { } /** + * Return owner package of group the subscription belongs to. + * + * @hide + */ + public @Nullable String getGroupOwner() { + return mGroupOwner; + } + + /** * @return the profile class of this subscription. * @hide */ @@ -646,11 +662,12 @@ public class SubscriptionInfo implements Parcelable { int subType = source.readInt(); String[] ehplmns = source.readStringArray(); String[] hplmns = source.readStringArray(); + String groupOwner = source.readString(); SubscriptionInfo info = new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number, dataRoaming, iconBitmap, mcc, mnc, countryIso, isEmbedded, accessRules, cardString, cardId, isOpportunistic, - groupUUID, isGroupDisabled, carrierid, profileClass, subType); + groupUUID, isGroupDisabled, carrierid, profileClass, subType, groupOwner); info.setAssociatedPlmns(ehplmns, hplmns); return info; } @@ -688,6 +705,7 @@ public class SubscriptionInfo implements Parcelable { dest.writeInt(mSubscriptionType); dest.writeStringArray(mEhplmns); dest.writeStringArray(mHplmns); + dest.writeString(mGroupOwner); } @Override @@ -727,7 +745,8 @@ public class SubscriptionInfo implements Parcelable { + " profileClass=" + mProfileClass + " ehplmns = " + Arrays.toString(mEhplmns) + " hplmns = " + Arrays.toString(mHplmns) - + " subscriptionType=" + mSubscriptionType + "}"; + + " subscriptionType=" + mSubscriptionType + + " mGroupOwner=" + mGroupOwner + "}"; } @Override @@ -735,7 +754,7 @@ public class SubscriptionInfo implements Parcelable { return Objects.hash(mId, mSimSlotIndex, mNameSource, mIconTint, mDataRoaming, mIsEmbedded, mIsOpportunistic, mGroupUUID, mIccId, mNumber, mMcc, mMnc, mCountryIso, mCardString, mCardId, mDisplayName, mCarrierName, mAccessRules, - mIsGroupDisabled, mCarrierId, mProfileClass); + mIsGroupDisabled, mCarrierId, mProfileClass, mGroupOwner); } @Override @@ -767,6 +786,7 @@ public class SubscriptionInfo implements Parcelable { && Objects.equals(mCountryIso, toCompare.mCountryIso) && Objects.equals(mCardString, toCompare.mCardString) && Objects.equals(mCardId, toCompare.mCardId) + && Objects.equals(mGroupOwner, toCompare.mGroupOwner) && TextUtils.equals(mDisplayName, toCompare.mDisplayName) && TextUtils.equals(mCarrierName, toCompare.mCarrierName) && Arrays.equals(mAccessRules, toCompare.mAccessRules) diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 32105ad52753..b5da2eeb4c9c 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -686,6 +686,15 @@ public class SubscriptionManager { * @hide */ public static final String GROUP_UUID = "group_uuid"; + + /** + * TelephonyProvider column name for group owner. It's the package name who created + * the subscription group. + * + * @hide + */ + public static final String GROUP_OWNER = "group_owner"; + /** * TelephonyProvider column name for whether a subscription is metered or not, that is, whether * the network it connects to charges for subscription or not. For example, paid CBRS or unpaid. diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 328a0a7a9512..dab1e6f4abde 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -7475,7 +7475,7 @@ public class TelephonyManager { try { ITelephony telephony = getITelephony(); if (telephony != null) - return telephony.checkCarrierPrivilegesForPackage(pkgName); + return telephony.checkCarrierPrivilegesForPackage(getSubId(), pkgName); } catch (RemoteException ex) { Rlog.e(TAG, "checkCarrierPrivilegesForPackage RemoteException", ex); } catch (NullPointerException ex) { @@ -7526,7 +7526,7 @@ public class TelephonyManager { try { ITelephony telephony = getITelephony(); if (telephony != null) { - return telephony.getPackagesWithCarrierPrivileges(); + return telephony.getPackagesWithCarrierPrivileges(getPhoneId()); } } catch (RemoteException ex) { Rlog.e(TAG, "getPackagesWithCarrierPrivileges RemoteException", ex); @@ -7537,6 +7537,22 @@ public class TelephonyManager { } /** @hide */ + public List<String> getPackagesWithCarrierPrivilegesForAllPhones() { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.getPackagesWithCarrierPrivilegesForAllPhones(); + } + } catch (RemoteException ex) { + Rlog.e(TAG, "getPackagesWithCarrierPrivilegesForAllPhones RemoteException", ex); + } catch (NullPointerException ex) { + Rlog.e(TAG, "getPackagesWithCarrierPrivilegesForAllPhones NPE", ex); + } + return Collections.EMPTY_LIST; + } + + + /** @hide */ @SystemApi @SuppressLint("Doclava125") public void dial(String number) { diff --git a/telephony/java/android/telephony/data/ApnSetting.java b/telephony/java/android/telephony/data/ApnSetting.java index a86fda4454d7..a78bae4514fb 100644 --- a/telephony/java/android/telephony/data/ApnSetting.java +++ b/telephony/java/android/telephony/data/ApnSetting.java @@ -1273,6 +1273,23 @@ public class ApnSetting implements Parcelable { } /** + * Get supported APN types + * + * @return list of APN types + * @hide + */ + @ApnType + public List<Integer> getApnTypes() { + List<Integer> types = new ArrayList<>(); + for (Integer type : APN_TYPE_INT_MAP.keySet()) { + if ((mApnTypeBitmask & type) == type) { + types.add(type); + } + } + return types; + } + + /** * @param apnTypeBitmask bitmask of APN types. * @return comma delimited list of APN types. * @hide diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index e8ce2b457ab4..68fd9ac8d6bd 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -1000,7 +1000,7 @@ interface ITelephony { /** * Similar to above, but check for the package whose name is pkgName. */ - int checkCarrierPrivilegesForPackage(String pkgName); + int checkCarrierPrivilegesForPackage(int subId, String pkgName); /** * Similar to above, but check across all phones. @@ -1357,9 +1357,14 @@ interface ITelephony { in PhoneAccountHandle phoneAccountHandle, boolean enabled); /** - * Returns a list of packages that have carrier privileges. + * Returns a list of packages that have carrier privileges for the specific phone. */ - List<String> getPackagesWithCarrierPrivileges(); + List<String> getPackagesWithCarrierPrivileges(int phoneId); + + /** + * Returns a list of packages that have carrier privileges. + */ + List<String> getPackagesWithCarrierPrivilegesForAllPhones(); /** * Return the application ID for the app type. diff --git a/tests/net/common/Android.bp b/tests/net/common/Android.bp index 3b2e34a159ee..07525a6ea49c 100644 --- a/tests/net/common/Android.bp +++ b/tests/net/common/Android.bp @@ -23,6 +23,7 @@ java_library { "androidx.test.rules", "frameworks-net-testutils", "junit", + "mockito-target-minus-junit4", ], libs: [ "android.test.base.stubs", diff --git a/tests/net/common/java/android/net/CaptivePortalTest.java b/tests/net/common/java/android/net/CaptivePortalTest.java new file mode 100644 index 000000000000..eed7159ffddc --- /dev/null +++ b/tests/net/common/java/android/net/CaptivePortalTest.java @@ -0,0 +1,90 @@ +/* + * 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.net; + +import static org.junit.Assert.assertEquals; + +import android.os.RemoteException; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class CaptivePortalTest { + private static final int DEFAULT_TIMEOUT_MS = 5000; + private static final String TEST_PACKAGE_NAME = "com.google.android.test"; + + private final class MyCaptivePortalImpl extends ICaptivePortal.Stub { + int mCode = -1; + String mPackageName = null; + + @Override + public void appResponse(final int response) throws RemoteException { + mCode = response; + } + + @Override + public void logEvent(int eventId, String packageName) throws RemoteException { + mCode = eventId; + mPackageName = packageName; + } + } + + private interface TestFunctor { + void useCaptivePortal(CaptivePortal o); + } + + private MyCaptivePortalImpl runCaptivePortalTest(TestFunctor f) { + final MyCaptivePortalImpl cp = new MyCaptivePortalImpl(); + f.useCaptivePortal(new CaptivePortal(cp.asBinder())); + return cp; + } + + @Test + public void testReportCaptivePortalDismissed() { + final MyCaptivePortalImpl result = + runCaptivePortalTest(c -> c.reportCaptivePortalDismissed()); + assertEquals(result.mCode, CaptivePortal.APP_RETURN_DISMISSED); + } + + @Test + public void testIgnoreNetwork() { + final MyCaptivePortalImpl result = runCaptivePortalTest(c -> c.ignoreNetwork()); + assertEquals(result.mCode, CaptivePortal.APP_RETURN_UNWANTED); + } + + @Test + public void testUseNetwork() { + final MyCaptivePortalImpl result = runCaptivePortalTest(c -> c.useNetwork()); + assertEquals(result.mCode, CaptivePortal.APP_RETURN_WANTED_AS_IS); + } + + @Test + public void testLogEvent() { + final MyCaptivePortalImpl result = runCaptivePortalTest(c -> c.logEvent( + MetricsEvent.ACTION_CAPTIVE_PORTAL_LOGIN_ACTIVITY, + TEST_PACKAGE_NAME)); + assertEquals(result.mCode, MetricsEvent.ACTION_CAPTIVE_PORTAL_LOGIN_ACTIVITY); + assertEquals(result.mPackageName, TEST_PACKAGE_NAME); + } +} diff --git a/tests/net/common/java/android/net/LinkPropertiesTest.java b/tests/net/common/java/android/net/LinkPropertiesTest.java index 709f5f69aa2b..e1c4238f1279 100644 --- a/tests/net/common/java/android/net/LinkPropertiesTest.java +++ b/tests/net/common/java/android/net/LinkPropertiesTest.java @@ -18,6 +18,7 @@ package android.net; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -46,28 +47,80 @@ import java.util.Set; @RunWith(AndroidJUnit4.class) @SmallTest public class LinkPropertiesTest { - private static InetAddress ADDRV4 = NetworkUtils.numericToInetAddress("75.208.6.1"); - private static InetAddress ADDRV6 = NetworkUtils.numericToInetAddress( + private static final InetAddress ADDRV4 = InetAddresses.parseNumericAddress("75.208.6.1"); + private static final InetAddress ADDRV6 = InetAddresses.parseNumericAddress( "2001:0db8:85a3:0000:0000:8a2e:0370:7334"); - private static InetAddress DNS1 = NetworkUtils.numericToInetAddress("75.208.7.1"); - private static InetAddress DNS2 = NetworkUtils.numericToInetAddress("69.78.7.1"); - private static InetAddress DNS6 = NetworkUtils.numericToInetAddress("2001:4860:4860::8888"); - private static InetAddress PCSCFV6 = NetworkUtils.numericToInetAddress( + private static final InetAddress DNS1 = InetAddresses.parseNumericAddress("75.208.7.1"); + private static final InetAddress DNS2 = InetAddresses.parseNumericAddress("69.78.7.1"); + private static final InetAddress DNS6 = InetAddresses.parseNumericAddress( + "2001:4860:4860::8888"); + private static final InetAddress PRIVDNS1 = InetAddresses.parseNumericAddress("1.1.1.1"); + private static final InetAddress PRIVDNS2 = InetAddresses.parseNumericAddress("1.0.0.1"); + private static final InetAddress PRIVDNS6 = InetAddresses.parseNumericAddress( + "2606:4700:4700::1111"); + private static final InetAddress PCSCFV4 = InetAddresses.parseNumericAddress("10.77.25.37"); + private static final InetAddress PCSCFV6 = InetAddresses.parseNumericAddress( "2001:0db8:85a3:0000:0000:8a2e:0370:1"); - private static InetAddress GATEWAY1 = NetworkUtils.numericToInetAddress("75.208.8.1"); - private static InetAddress GATEWAY2 = NetworkUtils.numericToInetAddress("69.78.8.1"); - private static InetAddress GATEWAY61 = NetworkUtils.numericToInetAddress("fe80::6:0000:613"); - private static InetAddress GATEWAY62 = NetworkUtils.numericToInetAddress("fe80::6:2222"); - private static String NAME = "qmi0"; - private static int MTU = 1500; - - private static LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32); - private static LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128); - private static LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64"); + private static final InetAddress GATEWAY1 = InetAddresses.parseNumericAddress("75.208.8.1"); + private static final InetAddress GATEWAY2 = InetAddresses.parseNumericAddress("69.78.8.1"); + private static final InetAddress GATEWAY61 = InetAddresses.parseNumericAddress( + "fe80::6:0000:613"); + private static final InetAddress GATEWAY62 = InetAddresses.parseNumericAddress("fe80::6:2222"); + private static final String NAME = "qmi0"; + private static final String DOMAINS = "google.com"; + private static final String PRIV_DNS_SERVER_NAME = "private.dns.com"; + private static final String TCP_BUFFER_SIZES = "524288,1048576,2097152,262144,524288,1048576"; + private static final int MTU = 1500; + private static final LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32); + private static final LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128); + private static final LinkAddress LINKADDRV6LINKLOCAL = new LinkAddress("fe80::1/64"); // TODO: replace all calls to NetworkUtils.numericToInetAddress with calls to this method. private InetAddress Address(String addrString) { - return NetworkUtils.numericToInetAddress(addrString); + return InetAddresses.parseNumericAddress(addrString); + } + + private void checkEmpty(final LinkProperties lp) { + assertEquals(0, lp.getAllInterfaceNames().size()); + assertEquals(0, lp.getAllAddresses().size()); + assertEquals(0, lp.getDnsServers().size()); + assertEquals(0, lp.getValidatedPrivateDnsServers().size()); + assertEquals(0, lp.getPcscfServers().size()); + assertEquals(0, lp.getAllRoutes().size()); + assertEquals(0, lp.getAllLinkAddresses().size()); + assertEquals(0, lp.getStackedLinks().size()); + assertEquals(0, lp.getMtu()); + assertNull(lp.getPrivateDnsServerName()); + assertNull(lp.getDomains()); + assertNull(lp.getHttpProxy()); + assertNull(lp.getTcpBufferSizes()); + assertNull(lp.getNat64Prefix()); + assertFalse(lp.isProvisioned()); + assertFalse(lp.isIpv4Provisioned()); + assertFalse(lp.isIpv6Provisioned()); + assertFalse(lp.isPrivateDnsActive()); + } + + private LinkProperties makeTestObject() { + final LinkProperties lp = new LinkProperties(); + lp.setInterfaceName(NAME); + lp.addLinkAddress(LINKADDRV4); + lp.addLinkAddress(LINKADDRV6); + lp.addDnsServer(DNS1); + lp.addDnsServer(DNS2); + lp.addValidatedPrivateDnsServer(PRIVDNS1); + lp.addValidatedPrivateDnsServer(PRIVDNS2); + lp.setUsePrivateDns(true); + lp.setPrivateDnsServerName(PRIV_DNS_SERVER_NAME); + lp.addPcscfServer(PCSCFV6); + lp.setDomains(DOMAINS); + lp.addRoute(new RouteInfo(GATEWAY1)); + lp.addRoute(new RouteInfo(GATEWAY2)); + lp.setHttpProxy(ProxyInfo.buildDirectProxy("test", 8888)); + lp.setMtu(MTU); + lp.setTcpBufferSizes(TCP_BUFFER_SIZES); + lp.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96")); + return lp; } public void assertLinkPropertiesEqual(LinkProperties source, LinkProperties target) { @@ -170,8 +223,7 @@ public class LinkPropertiesTest { target.clear(); target.setInterfaceName(NAME); // change link addresses - target.addLinkAddress(new LinkAddress( - NetworkUtils.numericToInetAddress("75.208.6.2"), 32)); + target.addLinkAddress(new LinkAddress(Address("75.208.6.2"), 32)); target.addLinkAddress(LINKADDRV6); target.addDnsServer(DNS1); target.addDnsServer(DNS2); @@ -186,7 +238,7 @@ public class LinkPropertiesTest { target.addLinkAddress(LINKADDRV4); target.addLinkAddress(LINKADDRV6); // change dnses - target.addDnsServer(NetworkUtils.numericToInetAddress("75.208.7.2")); + target.addDnsServer(Address("75.208.7.2")); target.addDnsServer(DNS2); target.addPcscfServer(PCSCFV6); target.addRoute(new RouteInfo(GATEWAY1)); @@ -198,11 +250,10 @@ public class LinkPropertiesTest { target.setInterfaceName(NAME); target.addLinkAddress(LINKADDRV4); target.addLinkAddress(LINKADDRV6); - target.addDnsServer(NetworkUtils.numericToInetAddress("75.208.7.2")); + target.addDnsServer(Address("75.208.7.2")); target.addDnsServer(DNS2); // change pcscf - target.addPcscfServer(NetworkUtils.numericToInetAddress( - "2001::1")); + target.addPcscfServer(Address("2001::1")); target.addRoute(new RouteInfo(GATEWAY1)); target.addRoute(new RouteInfo(GATEWAY2)); target.setMtu(MTU); @@ -215,7 +266,7 @@ public class LinkPropertiesTest { target.addDnsServer(DNS1); target.addDnsServer(DNS2); // change gateway - target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress("75.208.8.2"))); + target.addRoute(new RouteInfo(Address("75.208.8.2"))); target.addRoute(new RouteInfo(GATEWAY2)); target.setMtu(MTU); assertFalse(source.equals(target)); @@ -285,10 +336,15 @@ public class LinkPropertiesTest { } } + private void assertAllRoutesNotHaveInterface(String iface, LinkProperties lp) { + for (RouteInfo r : lp.getRoutes()) { + assertNotEquals(iface, r.getInterface()); + } + } + @Test public void testRouteInterfaces() { - LinkAddress prefix = new LinkAddress( - NetworkUtils.numericToInetAddress("2001:db8::"), 32); + LinkAddress prefix = new LinkAddress(Address("2001:db8::"), 32); InetAddress address = ADDRV6; // Add a route with no interface to a LinkProperties with no interface. No errors. @@ -312,6 +368,8 @@ public class LinkPropertiesTest { // Change the interface name. All the routes should change their interface name too. lp.setInterfaceName("rmnet0"); assertAllRoutesHaveInterface("rmnet0", lp); + assertAllRoutesNotHaveInterface(null, lp); + assertAllRoutesNotHaveInterface("wlan0", lp); // Now add a route with the wrong interface. This causes an exception too. try { @@ -325,6 +383,7 @@ public class LinkPropertiesTest { lp.addRoute(r); assertEquals(2, lp.getRoutes().size()); assertAllRoutesHaveInterface("wlan0", lp); + assertAllRoutesNotHaveInterface("rmnet0", lp); // Routes with null interfaces are converted to wlan0. r = RouteInfo.makeHostRoute(ADDRV6, null); @@ -334,14 +393,23 @@ public class LinkPropertiesTest { // Check comparisons work. LinkProperties lp2 = new LinkProperties(lp); - assertAllRoutesHaveInterface("wlan0", lp); + assertAllRoutesHaveInterface("wlan0", lp2); assertEquals(0, lp.compareAllRoutes(lp2).added.size()); assertEquals(0, lp.compareAllRoutes(lp2).removed.size()); lp2.setInterfaceName("p2p0"); assertAllRoutesHaveInterface("p2p0", lp2); + assertAllRoutesNotHaveInterface("wlan0", lp2); assertEquals(3, lp.compareAllRoutes(lp2).added.size()); assertEquals(3, lp.compareAllRoutes(lp2).removed.size()); + + // Check remove works + lp.removeRoute(new RouteInfo(prefix, address, null)); + assertEquals(3, lp.getRoutes().size()); + lp.removeRoute(new RouteInfo(prefix, address, "wlan0")); + assertEquals(2, lp.getRoutes().size()); + assertAllRoutesHaveInterface("wlan0", lp); + assertAllRoutesNotHaveInterface("p2p0", lp); } @Test @@ -488,18 +556,26 @@ public class LinkPropertiesTest { } @Test - public void testSetLinkAddresses() { - LinkProperties lp = new LinkProperties(); + public void testLinkAddresses() { + final LinkProperties lp = new LinkProperties(); lp.addLinkAddress(LINKADDRV4); lp.addLinkAddress(LINKADDRV6); - LinkProperties lp2 = new LinkProperties(); + final LinkProperties lp2 = new LinkProperties(); lp2.addLinkAddress(LINKADDRV6); + final LinkProperties lp3 = new LinkProperties(); + final List<LinkAddress> linkAddresses = Arrays.asList(LINKADDRV4); + lp3.setLinkAddresses(linkAddresses); + assertFalse(lp.equals(lp2)); + assertFalse(lp2.equals(lp3)); + + lp.removeLinkAddress(LINKADDRV4); + assertTrue(lp.equals(lp2)); - lp2.setLinkAddresses(lp.getLinkAddresses()); - assertTrue(lp.equals(lp)); + lp2.setLinkAddresses(lp3.getLinkAddresses()); + assertTrue(lp2.equals(lp3)); } @Test @@ -675,9 +751,9 @@ public class LinkPropertiesTest { assertTrue(v4lp.isReachable(DNS2)); final LinkProperties v6lp = new LinkProperties(); - final InetAddress kLinkLocalDns = NetworkUtils.numericToInetAddress("fe80::6:1"); - final InetAddress kLinkLocalDnsWithScope = NetworkUtils.numericToInetAddress("fe80::6:2%43"); - final InetAddress kOnLinkDns = NetworkUtils.numericToInetAddress("2001:db8:85a3::53"); + final InetAddress kLinkLocalDns = Address("fe80::6:1"); + final InetAddress kLinkLocalDnsWithScope = Address("fe80::6:2%43"); + final InetAddress kOnLinkDns = Address("2001:db8:85a3::53"); assertFalse(v6lp.isReachable(kLinkLocalDns)); assertFalse(v6lp.isReachable(kLinkLocalDnsWithScope)); assertFalse(v6lp.isReachable(kOnLinkDns)); @@ -686,8 +762,7 @@ public class LinkPropertiesTest { // Add a link-local route, making the link-local DNS servers reachable. Because // we assume the presence of an IPv6 link-local address, link-local DNS servers // are considered reachable, but only those with a non-zero scope identifier. - assertTrue(v6lp.addRoute(new RouteInfo( - new IpPrefix(NetworkUtils.numericToInetAddress("fe80::"), 64)))); + assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(Address("fe80::"), 64)))); assertFalse(v6lp.isReachable(kLinkLocalDns)); assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope)); assertFalse(v6lp.isReachable(kOnLinkDns)); @@ -703,8 +778,7 @@ public class LinkPropertiesTest { // Add a global route on link, but no global address yet. DNS servers reachable // via a route that doesn't require a gateway: give them the benefit of the // doubt and hope the link-local source address suffices for communication. - assertTrue(v6lp.addRoute(new RouteInfo( - new IpPrefix(NetworkUtils.numericToInetAddress("2001:db8:85a3::"), 64)))); + assertTrue(v6lp.addRoute(new RouteInfo(new IpPrefix(Address("2001:db8:85a3::"), 64)))); assertFalse(v6lp.isReachable(kLinkLocalDns)); assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope)); assertTrue(v6lp.isReachable(kOnLinkDns)); @@ -766,8 +840,8 @@ public class LinkPropertiesTest { LinkProperties rmnet1 = new LinkProperties(); rmnet1.setInterfaceName("rmnet1"); rmnet1.addLinkAddress(new LinkAddress("10.0.0.3/8")); - RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null, - NetworkUtils.numericToInetAddress("10.0.0.1"), rmnet1.getInterfaceName()); + RouteInfo defaultRoute1 = new RouteInfo((IpPrefix) null, Address("10.0.0.1"), + rmnet1.getInterfaceName()); RouteInfo directRoute1 = new RouteInfo(new IpPrefix("10.0.0.0/8"), null, rmnet1.getInterfaceName()); rmnet1.addRoute(defaultRoute1); @@ -785,8 +859,8 @@ public class LinkPropertiesTest { rmnet2.setInterfaceName("rmnet2"); rmnet2.addLinkAddress(new LinkAddress("fe80::cafe/64")); rmnet2.addLinkAddress(new LinkAddress("2001:db8::2/64")); - RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null, - NetworkUtils.numericToInetAddress("2001:db8::1"), rmnet2.getInterfaceName()); + RouteInfo defaultRoute2 = new RouteInfo((IpPrefix) null, Address("2001:db8::1"), + rmnet2.getInterfaceName()); RouteInfo directRoute2 = new RouteInfo(new IpPrefix("2001:db8::/64"), null, rmnet2.getInterfaceName()); RouteInfo linkLocalRoute2 = new RouteInfo(new IpPrefix("fe80::/64"), null, @@ -876,4 +950,111 @@ public class LinkPropertiesTest { LinkProperties empty = new LinkProperties(); TestUtils.assertParcelingIsLossless(empty); } + + @Test + public void testConstructor() { + LinkProperties lp = new LinkProperties(); + checkEmpty(lp); + assertLinkPropertiesEqual(lp, new LinkProperties(lp)); + assertLinkPropertiesEqual(lp, new LinkProperties()); + + lp = makeTestObject(); + assertLinkPropertiesEqual(lp, new LinkProperties(lp)); + } + + @Test + public void testDnsServers() { + final LinkProperties lp = new LinkProperties(); + final List<InetAddress> dnsServers = Arrays.asList(DNS1, DNS2); + lp.setDnsServers(dnsServers); + assertEquals(2, lp.getDnsServers().size()); + assertEquals(DNS1, lp.getDnsServers().get(0)); + assertEquals(DNS2, lp.getDnsServers().get(1)); + + lp.removeDnsServer(DNS1); + assertEquals(1, lp.getDnsServers().size()); + assertEquals(DNS2, lp.getDnsServers().get(0)); + + lp.addDnsServer(DNS6); + assertEquals(2, lp.getDnsServers().size()); + assertEquals(DNS2, lp.getDnsServers().get(0)); + assertEquals(DNS6, lp.getDnsServers().get(1)); + } + + @Test + public void testValidatedPrivateDnsServers() { + final LinkProperties lp = new LinkProperties(); + final List<InetAddress> privDnsServers = Arrays.asList(PRIVDNS1, PRIVDNS2); + lp.setValidatedPrivateDnsServers(privDnsServers); + assertEquals(2, lp.getValidatedPrivateDnsServers().size()); + assertEquals(PRIVDNS1, lp.getValidatedPrivateDnsServers().get(0)); + assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(1)); + + lp.removeValidatedPrivateDnsServer(PRIVDNS1); + assertEquals(1, lp.getValidatedPrivateDnsServers().size()); + assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0)); + + lp.addValidatedPrivateDnsServer(PRIVDNS6); + assertEquals(2, lp.getValidatedPrivateDnsServers().size()); + assertEquals(PRIVDNS2, lp.getValidatedPrivateDnsServers().get(0)); + assertEquals(PRIVDNS6, lp.getValidatedPrivateDnsServers().get(1)); + } + + @Test + public void testPcscfServers() { + final LinkProperties lp = new LinkProperties(); + final List<InetAddress> pcscfServers = Arrays.asList(PCSCFV4); + lp.setPcscfServers(pcscfServers); + assertEquals(1, lp.getPcscfServers().size()); + assertEquals(PCSCFV4, lp.getPcscfServers().get(0)); + + lp.removePcscfServer(PCSCFV4); + assertEquals(0, lp.getPcscfServers().size()); + + lp.addPcscfServer(PCSCFV6); + assertEquals(1, lp.getPcscfServers().size()); + assertEquals(PCSCFV6, lp.getPcscfServers().get(0)); + } + + @Test + public void testTcpBufferSizes() { + final LinkProperties lp = makeTestObject(); + assertEquals(TCP_BUFFER_SIZES, lp.getTcpBufferSizes()); + + lp.setTcpBufferSizes(null); + assertNull(lp.getTcpBufferSizes()); + } + + @Test + public void testHasIpv6DefaultRoute() { + final LinkProperties lp = makeTestObject(); + assertFalse(lp.hasIPv6DefaultRoute()); + + lp.addRoute(new RouteInfo(GATEWAY61)); + assertTrue(lp.hasIPv6DefaultRoute()); + } + + @Test + public void testHttpProxy() { + final LinkProperties lp = makeTestObject(); + assertTrue(lp.getHttpProxy().equals(ProxyInfo.buildDirectProxy("test", 8888))); + } + + @Test + public void testPrivateDnsServerName() { + final LinkProperties lp = makeTestObject(); + assertEquals(PRIV_DNS_SERVER_NAME, lp.getPrivateDnsServerName()); + + lp.setPrivateDnsServerName(null); + assertNull(lp.getPrivateDnsServerName()); + } + + @Test + public void testUsePrivateDns() { + final LinkProperties lp = makeTestObject(); + assertTrue(lp.isPrivateDnsActive()); + + lp.clear(); + assertFalse(lp.isPrivateDnsActive()); + } } diff --git a/tests/net/common/java/android/net/apf/ApfCapabilitiesTest.java b/tests/net/common/java/android/net/apf/ApfCapabilitiesTest.java index 3ed8a86b2fb5..0ce7c91c04d0 100644 --- a/tests/net/common/java/android/net/apf/ApfCapabilitiesTest.java +++ b/tests/net/common/java/android/net/apf/ApfCapabilitiesTest.java @@ -17,7 +17,9 @@ package android.net.apf; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -32,8 +34,12 @@ import org.junit.runner.RunWith; @SmallTest public class ApfCapabilitiesTest { @Test - public void testParcelUnparcel() { + public void testConstructAndParcel() { final ApfCapabilities caps = new ApfCapabilities(123, 456, 789); + assertEquals(123, caps.apfVersionSupported); + assertEquals(456, caps.maximumApfProgramSize); + assertEquals(789, caps.apfPacketFormat); + ParcelableTestUtil.assertFieldCountEquals(3, ApfCapabilities.class); TestUtils.assertParcelingIsLossless(caps); @@ -46,4 +52,14 @@ public class ApfCapabilitiesTest { assertNotEquals(new ApfCapabilities(1, 3, 3), new ApfCapabilities(1, 2, 3)); assertNotEquals(new ApfCapabilities(1, 2, 4), new ApfCapabilities(1, 2, 3)); } + + @Test + public void testHasDataAccess() { + //hasDataAccess is only supported starting at apf version 4. + ApfCapabilities caps = new ApfCapabilities(1 /* apfVersionSupported */, 2, 3); + assertFalse(caps.hasDataAccess()); + + caps = new ApfCapabilities(4 /* apfVersionSupported */, 5, 6); + assertTrue(caps.hasDataAccess()); + } } diff --git a/tests/net/common/java/android/net/metrics/ApfProgramEventTest.kt b/tests/net/common/java/android/net/metrics/ApfProgramEventTest.kt new file mode 100644 index 000000000000..8d055c93c4c5 --- /dev/null +++ b/tests/net/common/java/android/net/metrics/ApfProgramEventTest.kt @@ -0,0 +1,79 @@ +/* + * 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.net.metrics; + +import android.os.Parcelable +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.internal.util.ParcelableTestUtil +import com.android.internal.util.TestUtils +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +@SmallTest +class ApfProgramEventTest { + private fun <T: Parcelable> testParcel(obj: T, fieldCount: Int) { + ParcelableTestUtil.assertFieldCountEquals(fieldCount, obj::class.java) + TestUtils.assertParcelingIsLossless(obj) + } + + private infix fun Int.hasFlag(flag: Int) = (this and (1 shl flag)) != 0 + + @Test + fun testBuilderAndParcel() { + val apfProgramEvent = ApfProgramEvent.Builder() + .setLifetime(1) + .setActualLifetime(2) + .setFilteredRas(3) + .setCurrentRas(4) + .setProgramLength(5) + .setFlags(true, true) + .build() + + assertEquals(1, apfProgramEvent.lifetime) + assertEquals(2, apfProgramEvent.actualLifetime) + assertEquals(3, apfProgramEvent.filteredRas) + assertEquals(4, apfProgramEvent.currentRas) + assertEquals(5, apfProgramEvent.programLength) + assertEquals(ApfProgramEvent.flagsFor(true, true), apfProgramEvent.flags) + + testParcel(apfProgramEvent, 6) + } + + @Test + fun testFlagsFor() { + var flags = ApfProgramEvent.flagsFor(false, false) + assertFalse(flags hasFlag ApfProgramEvent.FLAG_HAS_IPV4_ADDRESS) + assertFalse(flags hasFlag ApfProgramEvent.FLAG_MULTICAST_FILTER_ON) + + flags = ApfProgramEvent.flagsFor(true, false) + assertTrue(flags hasFlag ApfProgramEvent.FLAG_HAS_IPV4_ADDRESS) + assertFalse(flags hasFlag ApfProgramEvent.FLAG_MULTICAST_FILTER_ON) + + flags = ApfProgramEvent.flagsFor(false, true) + assertFalse(flags hasFlag ApfProgramEvent.FLAG_HAS_IPV4_ADDRESS) + assertTrue(flags hasFlag ApfProgramEvent.FLAG_MULTICAST_FILTER_ON) + + flags = ApfProgramEvent.flagsFor(true, true) + assertTrue(flags hasFlag ApfProgramEvent.FLAG_HAS_IPV4_ADDRESS) + assertTrue(flags hasFlag ApfProgramEvent.FLAG_MULTICAST_FILTER_ON) + } +} diff --git a/tests/net/common/java/android/net/metrics/ApfStatsTest.kt b/tests/net/common/java/android/net/metrics/ApfStatsTest.kt new file mode 100644 index 000000000000..f8eb40cccd35 --- /dev/null +++ b/tests/net/common/java/android/net/metrics/ApfStatsTest.kt @@ -0,0 +1,64 @@ +/* + * 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.net.metrics + +import android.os.Parcelable +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.internal.util.ParcelableTestUtil +import com.android.internal.util.TestUtils +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +@SmallTest +class ApfStatsTest { + private fun <T: Parcelable> testParcel(obj: T, fieldCount: Int) { + ParcelableTestUtil.assertFieldCountEquals(fieldCount, obj::class.java) + TestUtils.assertParcelingIsLossless(obj) + } + + @Test + fun testBuilderAndParcel() { + val apfStats = ApfStats.Builder() + .setDurationMs(Long.MAX_VALUE) + .setReceivedRas(1) + .setMatchingRas(2) + .setDroppedRas(3) + .setZeroLifetimeRas(4) + .setParseErrors(5) + .setProgramUpdates(6) + .setProgramUpdatesAll(7) + .setProgramUpdatesAllowingMulticast(8) + .setMaxProgramSize(9) + .build() + + assertEquals(Long.MAX_VALUE, apfStats.durationMs) + assertEquals(1, apfStats.receivedRas) + assertEquals(2, apfStats.matchingRas) + assertEquals(3, apfStats.droppedRas) + assertEquals(4, apfStats.zeroLifetimeRas) + assertEquals(5, apfStats.parseErrors) + assertEquals(6, apfStats.programUpdates) + assertEquals(7, apfStats.programUpdatesAll) + assertEquals(8, apfStats.programUpdatesAllowingMulticast) + assertEquals(9, apfStats.maxProgramSize) + + testParcel(apfStats, 10) + } +} diff --git a/tests/net/common/java/android/net/metrics/DhcpClientEventTest.kt b/tests/net/common/java/android/net/metrics/DhcpClientEventTest.kt new file mode 100644 index 000000000000..36e9f8c94f6a --- /dev/null +++ b/tests/net/common/java/android/net/metrics/DhcpClientEventTest.kt @@ -0,0 +1,50 @@ +/* + * 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.net.metrics + +import android.os.Parcelable +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.internal.util.ParcelableTestUtil +import com.android.internal.util.TestUtils +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +private const val FAKE_MESSAGE = "test" + +@RunWith(AndroidJUnit4::class) +@SmallTest +class DhcpClientEventTest { + private fun <T: Parcelable> testParcel(obj: T, fieldCount: Int) { + ParcelableTestUtil.assertFieldCountEquals(fieldCount, obj::class.java) + TestUtils.assertParcelingIsLossless(obj) + } + + @Test + fun testBuilderAndParcel() { + val dhcpClientEvent = DhcpClientEvent.Builder() + .setMsg(FAKE_MESSAGE) + .setDurationMs(Integer.MAX_VALUE) + .build() + + assertEquals(FAKE_MESSAGE, dhcpClientEvent.msg) + assertEquals(Integer.MAX_VALUE, dhcpClientEvent.durationMs) + + testParcel(dhcpClientEvent, 2) + } +} diff --git a/tests/net/common/java/android/net/metrics/DhcpErrorEventTest.kt b/tests/net/common/java/android/net/metrics/DhcpErrorEventTest.kt index e19195322e1d..e9d5e6db1c7e 100644 --- a/tests/net/common/java/android/net/metrics/DhcpErrorEventTest.kt +++ b/tests/net/common/java/android/net/metrics/DhcpErrorEventTest.kt @@ -13,9 +13,7 @@ import org.junit.Test import org.junit.runner.RunWith private const val TEST_ERROR_CODE = 12345 -/** - * DHCP Optional Type: DHCP Subnet Mask (Copy from DhcpPacket.java) - */ +//DHCP Optional Type: DHCP Subnet Mask (Copy from DhcpPacket.java due to it's protected) private const val DHCP_SUBNET_MASK = 1 @RunWith(AndroidJUnit4::class) diff --git a/tests/net/common/java/android/net/metrics/IpConnectivityLogTest.java b/tests/net/common/java/android/net/metrics/IpConnectivityLogTest.java new file mode 100644 index 000000000000..d4780d3a5d7b --- /dev/null +++ b/tests/net/common/java/android/net/metrics/IpConnectivityLogTest.java @@ -0,0 +1,161 @@ +/* + * 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.net.metrics; + +import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; +import static android.net.NetworkCapabilities.TRANSPORT_WIFI; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; + +import android.net.ConnectivityMetricsEvent; +import android.net.IIpConnectivityMetrics; +import android.net.Network; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.internal.util.BitUtils; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class IpConnectivityLogTest { + private static final int FAKE_NET_ID = 100; + private static final int[] FAKE_TRANSPORT_TYPES = BitUtils.unpackBits(TRANSPORT_WIFI); + private static final long FAKE_TIME_STAMP = System.currentTimeMillis(); + private static final String FAKE_INTERFACE_NAME = "test"; + private static final IpReachabilityEvent FAKE_EV = + new IpReachabilityEvent(IpReachabilityEvent.NUD_FAILED); + + @Mock IIpConnectivityMetrics mMockService; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void testLoggingEvents() throws Exception { + IpConnectivityLog logger = new IpConnectivityLog(mMockService); + + assertTrue(logger.log(FAKE_EV)); + assertTrue(logger.log(FAKE_TIME_STAMP, FAKE_EV)); + assertTrue(logger.log(FAKE_NET_ID, FAKE_TRANSPORT_TYPES, FAKE_EV)); + assertTrue(logger.log(new Network(FAKE_NET_ID), FAKE_TRANSPORT_TYPES, FAKE_EV)); + assertTrue(logger.log(FAKE_INTERFACE_NAME, FAKE_EV)); + assertTrue(logger.log(makeExpectedEvent(FAKE_TIME_STAMP, FAKE_NET_ID, TRANSPORT_WIFI, + FAKE_INTERFACE_NAME))); + + List<ConnectivityMetricsEvent> got = verifyEvents(6); + assertEventsEqual(makeExpectedEvent(got.get(0).timestamp, 0, 0, null), got.get(0)); + assertEventsEqual(makeExpectedEvent(FAKE_TIME_STAMP, 0, 0, null), got.get(1)); + assertEventsEqual(makeExpectedEvent(got.get(2).timestamp, FAKE_NET_ID, + TRANSPORT_WIFI, null), got.get(2)); + assertEventsEqual(makeExpectedEvent(got.get(3).timestamp, FAKE_NET_ID, + TRANSPORT_WIFI, null), got.get(3)); + assertEventsEqual(makeExpectedEvent(got.get(4).timestamp, 0, 0, FAKE_INTERFACE_NAME), + got.get(4)); + assertEventsEqual(makeExpectedEvent(FAKE_TIME_STAMP, FAKE_NET_ID, + TRANSPORT_WIFI, FAKE_INTERFACE_NAME), got.get(5)); + } + + @Test + public void testLoggingEventsWithMultipleCallers() throws Exception { + IpConnectivityLog logger = new IpConnectivityLog(mMockService); + + final int nCallers = 10; + final int nEvents = 10; + for (int n = 0; n < nCallers; n++) { + final int i = n; + new Thread() { + public void run() { + for (int j = 0; j < nEvents; j++) { + assertTrue(logger.log(makeExpectedEvent( + FAKE_TIME_STAMP + i * 100 + j, + FAKE_NET_ID + i * 100 + j, + ((i + j) % 2 == 0) ? TRANSPORT_WIFI : TRANSPORT_CELLULAR, + FAKE_INTERFACE_NAME))); + } + } + }.start(); + } + + List<ConnectivityMetricsEvent> got = verifyEvents(nCallers * nEvents, 200); + Collections.sort(got, EVENT_COMPARATOR); + Iterator<ConnectivityMetricsEvent> iter = got.iterator(); + for (int i = 0; i < nCallers; i++) { + for (int j = 0; j < nEvents; j++) { + final long expectedTimestamp = FAKE_TIME_STAMP + i * 100 + j; + final int expectedNetId = FAKE_NET_ID + i * 100 + j; + final long expectedTransports = + ((i + j) % 2 == 0) ? TRANSPORT_WIFI : TRANSPORT_CELLULAR; + assertEventsEqual(makeExpectedEvent(expectedTimestamp, expectedNetId, + expectedTransports, FAKE_INTERFACE_NAME), iter.next()); + } + } + } + + private List<ConnectivityMetricsEvent> verifyEvents(int n, int timeoutMs) throws Exception { + ArgumentCaptor<ConnectivityMetricsEvent> captor = + ArgumentCaptor.forClass(ConnectivityMetricsEvent.class); + verify(mMockService, timeout(timeoutMs).times(n)).logEvent(captor.capture()); + return captor.getAllValues(); + } + + private List<ConnectivityMetricsEvent> verifyEvents(int n) throws Exception { + return verifyEvents(n, 10); + } + + + private ConnectivityMetricsEvent makeExpectedEvent(long timestamp, int netId, long transports, + String ifname) { + ConnectivityMetricsEvent ev = new ConnectivityMetricsEvent(); + ev.timestamp = timestamp; + ev.data = FAKE_EV; + ev.netId = netId; + ev.transports = transports; + ev.ifname = ifname; + return ev; + } + + /** Outer equality for ConnectivityMetricsEvent to avoid overriding equals() and hashCode(). */ + private void assertEventsEqual(ConnectivityMetricsEvent expected, + ConnectivityMetricsEvent got) { + assertEquals(expected.data, got.data); + assertEquals(expected.timestamp, got.timestamp); + assertEquals(expected.netId, got.netId); + assertEquals(expected.transports, got.transports); + assertEquals(expected.ifname, got.ifname); + } + + static final Comparator<ConnectivityMetricsEvent> EVENT_COMPARATOR = + Comparator.comparingLong((ev) -> ev.timestamp); +} diff --git a/tests/net/common/java/android/net/metrics/IpManagerEventTest.kt b/tests/net/common/java/android/net/metrics/IpManagerEventTest.kt new file mode 100644 index 000000000000..5144ca56bf28 --- /dev/null +++ b/tests/net/common/java/android/net/metrics/IpManagerEventTest.kt @@ -0,0 +1,46 @@ +/* + * 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.net.metrics + +import android.os.Parcelable +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.internal.util.ParcelableTestUtil +import com.android.internal.util.TestUtils +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +@SmallTest +class IpManagerEventTest { + private fun <T: Parcelable> testParcel(obj: T, fieldCount: Int) { + ParcelableTestUtil.assertFieldCountEquals(fieldCount, obj::class.java) + TestUtils.assertParcelingIsLossless(obj) + } + + @Test + fun testConstructorAndParcel() { + (IpManagerEvent.PROVISIONING_OK..IpManagerEvent.ERROR_INTERFACE_NOT_FOUND).forEach { + val ipManagerEvent = IpManagerEvent(it, Long.MAX_VALUE) + assertEquals(it, ipManagerEvent.eventType) + assertEquals(Long.MAX_VALUE, ipManagerEvent.durationMs) + + testParcel(ipManagerEvent, 2) + } + } +} diff --git a/tests/net/common/java/android/net/metrics/IpReachabilityEventTest.kt b/tests/net/common/java/android/net/metrics/IpReachabilityEventTest.kt new file mode 100644 index 000000000000..d76ebf67ff1d --- /dev/null +++ b/tests/net/common/java/android/net/metrics/IpReachabilityEventTest.kt @@ -0,0 +1,45 @@ +/* + * 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.net.metrics + +import android.os.Parcelable +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.internal.util.ParcelableTestUtil +import com.android.internal.util.TestUtils +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +@SmallTest +class IpReachabilityEventTest { + private fun <T: Parcelable> testParcel(obj: T, fieldCount: Int) { + ParcelableTestUtil.assertFieldCountEquals(fieldCount, obj::class.java) + TestUtils.assertParcelingIsLossless(obj) + } + + @Test + fun testConstructorAndParcel() { + (IpReachabilityEvent.PROBE..IpReachabilityEvent.PROVISIONING_LOST_ORGANIC).forEach { + val ipReachabilityEvent = IpReachabilityEvent(it) + assertEquals(it, ipReachabilityEvent.eventType) + + testParcel(ipReachabilityEvent, 1) + } + } +} diff --git a/tests/net/common/java/android/net/metrics/NetworkEventTest.kt b/tests/net/common/java/android/net/metrics/NetworkEventTest.kt new file mode 100644 index 000000000000..8b52e81eea1e --- /dev/null +++ b/tests/net/common/java/android/net/metrics/NetworkEventTest.kt @@ -0,0 +1,50 @@ +/* + * 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.net.metrics + +import android.os.Parcelable +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.internal.util.ParcelableTestUtil +import com.android.internal.util.TestUtils +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +@SmallTest +class NetworkEventTest { + private fun <T: Parcelable> testParcel(obj: T, fieldCount: Int) { + ParcelableTestUtil.assertFieldCountEquals(fieldCount, obj::class.java) + TestUtils.assertParcelingIsLossless(obj) + } + + @Test + fun testConstructorAndParcel() { + (NetworkEvent.NETWORK_CONNECTED..NetworkEvent.NETWORK_PARTIAL_CONNECTIVITY).forEach { + var networkEvent = NetworkEvent(it) + assertEquals(it, networkEvent.eventType) + assertEquals(0, networkEvent.durationMs) + + networkEvent = NetworkEvent(it, Long.MAX_VALUE) + assertEquals(it, networkEvent.eventType) + assertEquals(Long.MAX_VALUE, networkEvent.durationMs) + + testParcel(networkEvent, 2) + } + } +} diff --git a/tests/net/common/java/android/net/metrics/RaEventTest.kt b/tests/net/common/java/android/net/metrics/RaEventTest.kt new file mode 100644 index 000000000000..f38d32844230 --- /dev/null +++ b/tests/net/common/java/android/net/metrics/RaEventTest.kt @@ -0,0 +1,79 @@ +/* + * 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.net.metrics + +import android.os.Parcelable +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.internal.util.ParcelableTestUtil +import com.android.internal.util.TestUtils +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +private const val NO_LIFETIME: Long = -1L + +@RunWith(AndroidJUnit4::class) +@SmallTest +class RaEventTest { + private fun <T: Parcelable> testParcel(obj: T, fieldCount: Int) { + ParcelableTestUtil.assertFieldCountEquals(fieldCount, obj::class.java) + TestUtils.assertParcelingIsLossless(obj) + } + + @Test + fun testConstructorAndParcel() { + var raEvent = RaEvent.Builder().build() + assertEquals(NO_LIFETIME, raEvent.routerLifetime) + assertEquals(NO_LIFETIME, raEvent.prefixValidLifetime) + assertEquals(NO_LIFETIME, raEvent.prefixPreferredLifetime) + assertEquals(NO_LIFETIME, raEvent.routeInfoLifetime) + assertEquals(NO_LIFETIME, raEvent.rdnssLifetime) + assertEquals(NO_LIFETIME, raEvent.dnsslLifetime) + + raEvent = RaEvent.Builder() + .updateRouterLifetime(1) + .updatePrefixValidLifetime(2) + .updatePrefixPreferredLifetime(3) + .updateRouteInfoLifetime(4) + .updateRdnssLifetime(5) + .updateDnsslLifetime(6) + .build() + assertEquals(1, raEvent.routerLifetime) + assertEquals(2, raEvent.prefixValidLifetime) + assertEquals(3, raEvent.prefixPreferredLifetime) + assertEquals(4, raEvent.routeInfoLifetime) + assertEquals(5, raEvent.rdnssLifetime) + assertEquals(6, raEvent.dnsslLifetime) + + raEvent = RaEvent.Builder() + .updateRouterLifetime(Long.MIN_VALUE) + .updateRouterLifetime(Long.MAX_VALUE) + .build() + assertEquals(Long.MIN_VALUE, raEvent.routerLifetime) + + raEvent = RaEvent(1, 2, 3, 4, 5, 6) + assertEquals(1, raEvent.routerLifetime) + assertEquals(2, raEvent.prefixValidLifetime) + assertEquals(3, raEvent.prefixPreferredLifetime) + assertEquals(4, raEvent.routeInfoLifetime) + assertEquals(5, raEvent.rdnssLifetime) + assertEquals(6, raEvent.dnsslLifetime) + + testParcel(raEvent, 6) + } +} diff --git a/tests/net/common/java/android/net/metrics/ValidationProbeEventTest.kt b/tests/net/common/java/android/net/metrics/ValidationProbeEventTest.kt new file mode 100644 index 000000000000..c0cef8fe91fd --- /dev/null +++ b/tests/net/common/java/android/net/metrics/ValidationProbeEventTest.kt @@ -0,0 +1,79 @@ +/* + * 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.net.metrics + +import android.os.Parcelable +import androidx.test.filters.SmallTest +import androidx.test.runner.AndroidJUnit4 +import com.android.internal.util.ParcelableTestUtil +import com.android.internal.util.TestUtils +import java.lang.reflect.Modifier +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith + +private const val FIRST_VALIDATION: Int = 1 shl 8 +private const val REVALIDATION: Int = 2 shl 8 + +@RunWith(AndroidJUnit4::class) +@SmallTest +class ValidationProbeEventTest { + private fun <T: Parcelable> testParcel(obj: T, fieldCount: Int) { + ParcelableTestUtil.assertFieldCountEquals(fieldCount, obj::class.java) + TestUtils.assertParcelingIsLossless(obj) + } + + private infix fun Int.hasType(type: Int) = (type and this) == type + + @Test + fun testBuilderAndParcel() { + var validationProbeEvent = ValidationProbeEvent.Builder() + .setProbeType(ValidationProbeEvent.PROBE_DNS, false).build() + + assertTrue(validationProbeEvent.probeType hasType REVALIDATION) + + validationProbeEvent = ValidationProbeEvent.Builder() + .setDurationMs(Long.MAX_VALUE) + .setProbeType(ValidationProbeEvent.PROBE_DNS, true) + .setReturnCode(ValidationProbeEvent.DNS_SUCCESS) + .build() + + assertEquals(Long.MAX_VALUE, validationProbeEvent.durationMs) + assertTrue(validationProbeEvent.probeType hasType ValidationProbeEvent.PROBE_DNS) + assertTrue(validationProbeEvent.probeType hasType FIRST_VALIDATION) + assertEquals(ValidationProbeEvent.DNS_SUCCESS, validationProbeEvent.returnCode) + + testParcel(validationProbeEvent, 3) + } + + @Test + fun testGetProbeName() { + val probeFields = ValidationProbeEvent::class.java.declaredFields.filter { + it.type == Int::class.javaPrimitiveType + && Modifier.isPublic(it.modifiers) && Modifier.isStatic(it.modifiers) + && it.name.contains("PROBE") + } + + probeFields.forEach { + val intValue = it.getInt(null) + val stringValue = ValidationProbeEvent.getProbeName(intValue) + assertEquals(it.name, stringValue) + } + + } +} diff --git a/tests/net/java/android/net/util/KeepaliveUtilsTest.kt b/tests/net/java/android/net/util/KeepaliveUtilsTest.kt new file mode 100644 index 000000000000..814e06e311b3 --- /dev/null +++ b/tests/net/java/android/net/util/KeepaliveUtilsTest.kt @@ -0,0 +1,130 @@ +/* + * 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.net.util + +import android.content.Context +import android.content.res.Resources +import android.net.NetworkCapabilities +import android.net.NetworkCapabilities.MAX_TRANSPORT +import android.net.NetworkCapabilities.TRANSPORT_CELLULAR +import android.net.NetworkCapabilities.TRANSPORT_ETHERNET +import android.net.NetworkCapabilities.TRANSPORT_VPN +import android.net.NetworkCapabilities.TRANSPORT_WIFI +import androidx.test.filters.SmallTest +import com.android.internal.R +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Assert.fail +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.mockito.ArgumentMatchers +import org.mockito.Mockito.doReturn +import org.mockito.Mockito.mock + +/** + * Tests for [KeepaliveUtils]. + * + * Build, install and run with: + * atest android.net.util.KeepaliveUtilsTest + */ +@RunWith(JUnit4::class) +@SmallTest +class KeepaliveUtilsTest { + + // Prepare mocked context with given resource strings. + private fun getMockedContextWithStringArrayRes(id: Int, res: Array<out String?>?): Context { + val mockRes = mock(Resources::class.java) + doReturn(res).`when`(mockRes).getStringArray(ArgumentMatchers.eq(id)) + + return mock(Context::class.java).apply { + doReturn(mockRes).`when`(this).getResources() + } + } + + @Test + fun testGetSupportedKeepalives() { + fun assertRunWithException(res: Array<out String?>?) { + try { + val mockContext = getMockedContextWithStringArrayRes( + R.array.config_networkSupportedKeepaliveCount, res) + KeepaliveUtils.getSupportedKeepalives(mockContext) + fail("Expected KeepaliveDeviceConfigurationException") + } catch (expected: KeepaliveUtils.KeepaliveDeviceConfigurationException) { + } + } + + // Check resource with various invalid format. + assertRunWithException(null) + assertRunWithException(arrayOf<String?>(null)) + assertRunWithException(arrayOfNulls<String?>(10)) + assertRunWithException(arrayOf("")) + assertRunWithException(arrayOf("3,ABC")) + assertRunWithException(arrayOf("6,3,3")) + assertRunWithException(arrayOf("5")) + + // Check resource with invalid slots value. + assertRunWithException(arrayOf("2,2")) + assertRunWithException(arrayOf("3,-1")) + + // Check resource with invalid transport type. + assertRunWithException(arrayOf("-1,3")) + assertRunWithException(arrayOf("10,3")) + + // Check valid customization generates expected array. + val validRes = arrayOf("0,3", "1,0", "4,4") + val expectedValidRes = intArrayOf(3, 0, 0, 0, 4, 0, 0, 0) + + val mockContext = getMockedContextWithStringArrayRes( + R.array.config_networkSupportedKeepaliveCount, validRes) + val actual = KeepaliveUtils.getSupportedKeepalives(mockContext) + assertArrayEquals(expectedValidRes, actual) + } + + @Test + fun testGetSupportedKeepalivesForNetworkCapabilities() { + // Mock customized supported keepalives for each transport type, and assuming: + // 3 for cellular, + // 6 for wifi, + // 0 for others. + val cust = IntArray(MAX_TRANSPORT + 1).apply { + this[TRANSPORT_CELLULAR] = 3 + this[TRANSPORT_WIFI] = 6 + } + + val nc = NetworkCapabilities() + // Check supported keepalives with single transport type. + nc.transportTypes = intArrayOf(TRANSPORT_CELLULAR) + assertEquals(3, KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities(cust, nc)) + + // Check supported keepalives with multiple transport types. + nc.transportTypes = intArrayOf(TRANSPORT_WIFI, TRANSPORT_VPN) + assertEquals(0, KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities(cust, nc)) + + // Check supported keepalives with non-customized transport type. + nc.transportTypes = intArrayOf(TRANSPORT_ETHERNET) + assertEquals(0, KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities(cust, nc)) + + // Check supported keepalives with undefined transport type. + nc.transportTypes = intArrayOf(MAX_TRANSPORT + 1) + try { + KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities(cust, nc) + fail("Expected ArrayIndexOutOfBoundsException") + } catch (expected: ArrayIndexOutOfBoundsException) { + } + } +} diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index fe1378736e68..b0cc20785cbf 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -4342,8 +4342,9 @@ public class ConnectivityServiceTest { } // Check that there is no port leaked after all keepalives and sockets are closed. - assertFalse(isUdpPortInUse(srcPort)); - assertFalse(isUdpPortInUse(srcPort2)); + // TODO: enable this check after ensuring a valid free port. See b/129512753#comment7. + // assertFalse(isUdpPortInUse(srcPort)); + // assertFalse(isUdpPortInUse(srcPort2)); mWiFiNetworkAgent.disconnect(); waitFor(mWiFiNetworkAgent.getDisconnectedCV()); @@ -4471,7 +4472,8 @@ public class ConnectivityServiceTest { assertEquals(anyIPv4, sa.getAddress()); testPfd.close(); - assertFalse(isUdpPortInUse(srcPort)); + // TODO: enable this check after ensuring a valid free port. See b/129512753#comment7. + // assertFalse(isUdpPortInUse(srcPort)); mWiFiNetworkAgent.disconnect(); waitFor(mWiFiNetworkAgent.getDisconnectedCV()); diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java index d5b2c87ffe46..3a071667a542 100644 --- a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java +++ b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java @@ -21,11 +21,8 @@ import static android.net.metrics.INetdEventListener.EVENT_GETHOSTBYNAME; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; @@ -59,16 +56,11 @@ import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.io.PrintWriter; import java.io.StringWriter; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; @RunWith(AndroidJUnit4.class) @SmallTest @@ -98,48 +90,6 @@ public class IpConnectivityMetricsTest { } @Test - public void testLoggingEvents() throws Exception { - IpConnectivityLog logger = new IpConnectivityLog(mMockService); - - assertTrue(logger.log(1, FAKE_EV)); - assertTrue(logger.log(2, FAKE_EV)); - assertTrue(logger.log(3, FAKE_EV)); - - List<ConnectivityMetricsEvent> got = verifyEvents(3); - assertEventsEqual(expectedEvent(1), got.get(0)); - assertEventsEqual(expectedEvent(2), got.get(1)); - assertEventsEqual(expectedEvent(3), got.get(2)); - } - - @Test - public void testLoggingEventsWithMultipleCallers() throws Exception { - IpConnectivityLog logger = new IpConnectivityLog(mMockService); - - final int nCallers = 10; - final int nEvents = 10; - for (int n = 0; n < nCallers; n++) { - final int i = n; - new Thread() { - public void run() { - for (int j = 0; j < nEvents; j++) { - assertTrue(logger.log(1 + i * 100 + j, FAKE_EV)); - } - } - }.start(); - } - - List<ConnectivityMetricsEvent> got = verifyEvents(nCallers * nEvents, 200); - Collections.sort(got, EVENT_COMPARATOR); - Iterator<ConnectivityMetricsEvent> iter = got.iterator(); - for (int i = 0; i < nCallers; i++) { - for (int j = 0; j < nEvents; j++) { - int expectedTimestamp = 1 + i * 100 + j; - assertEventsEqual(expectedEvent(expectedTimestamp), iter.next()); - } - } - } - - @Test public void testBufferFlushing() { String output1 = getdump("flush"); assertEquals("", output1); @@ -653,16 +603,7 @@ public class IpConnectivityMetricsTest { return nai; } - List<ConnectivityMetricsEvent> verifyEvents(int n, int timeoutMs) throws Exception { - ArgumentCaptor<ConnectivityMetricsEvent> captor = - ArgumentCaptor.forClass(ConnectivityMetricsEvent.class); - verify(mMockService, timeout(timeoutMs).times(n)).logEvent(captor.capture()); - return captor.getAllValues(); - } - List<ConnectivityMetricsEvent> verifyEvents(int n) throws Exception { - return verifyEvents(n, 10); - } static void verifySerialization(String want, String output) { try { @@ -674,28 +615,4 @@ public class IpConnectivityMetricsTest { fail(e.toString()); } } - - static String joinLines(String ... elems) { - StringBuilder b = new StringBuilder(); - for (String s : elems) { - b.append(s).append("\n"); - } - return b.toString(); - } - - static ConnectivityMetricsEvent expectedEvent(int timestamp) { - ConnectivityMetricsEvent ev = new ConnectivityMetricsEvent(); - ev.timestamp = timestamp; - ev.data = FAKE_EV; - return ev; - } - - /** Outer equality for ConnectivityMetricsEvent to avoid overriding equals() and hashCode(). */ - static void assertEventsEqual(ConnectivityMetricsEvent expected, ConnectivityMetricsEvent got) { - assertEquals(expected.timestamp, got.timestamp); - assertEquals(expected.data, got.data); - } - - static final Comparator<ConnectivityMetricsEvent> EVENT_COMPARATOR = - Comparator.comparingLong((ev) -> ev.timestamp); } diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java index 21fe22e3e7b0..c0c0361dd92f 100644 --- a/wifi/java/android/net/wifi/ScanResult.java +++ b/wifi/java/android/net/wifi/ScanResult.java @@ -155,6 +155,16 @@ public class ScanResult implements Parcelable { public static final int KEY_MGMT_EAP_SUITE_B_192 = 10; /** * @hide + * Security key management scheme: FT_SAE. + */ + public static final int KEY_MGMT_FT_SAE = 11; + /** + * @hide + * Security key management scheme: OWE in transition mode. + */ + public static final int KEY_MGMT_OWE_TRANSITION = 12; + /** + * @hide * No cipher suite. */ public static final int CIPHER_NONE = 0; |