diff options
523 files changed, 10345 insertions, 4592 deletions
diff --git a/Android.bp b/Android.bp index 9023a19b7282..6c5acd2b416b 100644 --- a/Android.bp +++ b/Android.bp @@ -273,6 +273,14 @@ java_library { installable: false, } +// NOTE: This filegroup is exposed for vendor libraries to depend on and is referenced in +// documentation. Do not remove without consulting the treble/hidl teams. +filegroup { + name: "framework-jarjar-rules", + srcs: ["framework-jarjar-rules.txt"], + visibility: ["//visibility:public"], +} + java_defaults { name: "framework-minus-apex-defaults", defaults: ["framework-aidl-export-defaults"], @@ -294,7 +302,7 @@ java_defaults { "--core-library", "--multi-dex", ], - jarjar_rules: "framework-jarjar-rules.txt", + jarjar_rules: ":framework-jarjar-rules", javac_shard_size: 150, plugins: [ "view-inspector-annotation-processor", diff --git a/StubLibraries.bp b/StubLibraries.bp index ed24d43eda10..b6c45eddf92f 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -255,7 +255,7 @@ modules_public_stubs = [ modules_system_stubs = [ "android.net.ipsec.ike.stubs.system", - "art.module.public.api.stubs", // Only has public stubs + "art.module.public.api.stubs.system", "conscrypt.module.public.api.stubs", // Only has public stubs "framework-appsearch.stubs.system", "framework-connectivity.stubs.system", diff --git a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java index b3c33b6615f4..144536ec2644 100644 --- a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java +++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java @@ -1229,7 +1229,11 @@ public class JobInfo implements Parcelable { * </ul> * Note that the system may choose to delay jobs with large network * usage estimates when the device has a poor network connection, in - * order to save battery. + * order to save battery and possible network costs. + * Starting from Android version {@link Build.VERSION_CODES#S}, JobScheduler may attempt + * to run large jobs when the device is charging and on an unmetered network, even if the + * network is slow. This gives large jobs an opportunity to make forward progress, even if + * they risk timing out. * <p> * The values provided here only reflect the traffic that will be * performed by the base job; if you're using {@link JobWorkItem} then diff --git a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java index 60f5769a46f7..cef065ddac9e 100644 --- a/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java +++ b/apex/jobscheduler/service/java/com/android/server/DeviceIdleController.java @@ -547,7 +547,7 @@ public class DeviceIdleController extends SystemService private int[] mPowerSaveWhitelistUserAppIdArray = new int[0]; /** - * List of end times for UIDs that are temporarily marked as being allowed to access + * List of end times for app-IDs that are temporarily marked as being allowed to access * the network and acquire wakelocks. Times are in milliseconds. */ private final SparseArray<Pair<MutableLong, String>> mTempWhitelistAppIdEndTimes diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java index 5365218203d9..1169391d2cd2 100644 --- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java @@ -121,7 +121,6 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.IAppOpsCallback; import com.android.internal.app.IAppOpsService; -import com.android.internal.os.BinderDeathDispatcher; import com.android.internal.util.DumpUtils; import com.android.internal.util.FrameworkStatsLog; import com.android.internal.util.LocalLog; @@ -184,8 +183,7 @@ public class AlarmManagerService extends SystemService { static final boolean DEBUG_BG_LIMIT = localLOGV || false; static final boolean DEBUG_STANDBY = localLOGV || false; static final boolean RECORD_ALARMS_IN_HISTORY = true; - // TODO(b/178484639) : Turn off once alarms and reminders work is complete. - static final boolean RECORD_DEVICE_IDLE_ALARMS = true; + static final boolean RECORD_DEVICE_IDLE_ALARMS = false; static final String TIMEZONE_PROPERTY = "persist.sys.timezone"; static final int TICK_HISTORY_DEPTH = 10; @@ -206,8 +204,6 @@ public class AlarmManagerService extends SystemService { .addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); - private static final BinderDeathDispatcher<IAlarmListener> sListenerDeathDispatcher = - new BinderDeathDispatcher<>(); final LocalLog mLog = new LocalLog(TAG); AppOpsManager mAppOps; @@ -1837,8 +1833,9 @@ public class AlarmManagerService extends SystemService { } if (directReceiver != null) { - if (sListenerDeathDispatcher.linkToDeath(directReceiver, mListenerDeathRecipient) - <= 0) { + try { + directReceiver.asBinder().linkToDeath(mListenerDeathRecipient, 0); + } catch (RemoteException e) { Slog.w(TAG, "Dropping unreachable alarm listener " + listenerTag); return; } @@ -2851,12 +2848,6 @@ public class AlarmManagerService extends SystemService { pw.println(); } - pw.println("Listener death dispatcher state:"); - pw.increaseIndent(); - sListenerDeathDispatcher.dump(pw); - pw.println(); - pw.decreaseIndent(); - if (mLog.dump(pw, "Recent problems:")) { pw.println(); } @@ -3448,6 +3439,9 @@ public class AlarmManagerService extends SystemService { for (final Alarm removed : removedAlarms) { decrementAlarmCount(removed.uid, 1); + if (removed.listener != null) { + removed.listener.asBinder().unlinkToDeath(mListenerDeathRecipient, 0); + } if (!RemovedAlarm.isLoggable(reason)) { continue; } @@ -4701,6 +4695,8 @@ public class AlarmManagerService extends SystemService { // Direct listener callback alarm mListenerCount++; + alarm.listener.asBinder().unlinkToDeath(mListenerDeathRecipient, 0); + if (RECORD_ALARMS_IN_HISTORY) { if (alarm.listener == mTimeTickTrigger) { mTickHistory[mNextTickHistory++] = nowELAPSED; diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java index 7b947fd3ab43..e8065aa535f3 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java @@ -25,12 +25,18 @@ import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.job.JobInfo; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkPolicyManager; import android.net.NetworkRequest; +import android.os.BatteryManager; +import android.os.BatteryManagerInternal; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -101,6 +107,8 @@ public final class ConnectivityController extends RestrictingController implemen private final ConnectivityManager mConnManager; private final NetworkPolicyManagerInternal mNetPolicyManagerInternal; + private final ChargingTracker mChargingTracker; + /** List of tracked jobs keyed by source UID. */ @GuardedBy("mLock") private final SparseArray<ArraySet<JobStatus>> mTrackedJobs = new SparseArray<>(); @@ -229,6 +237,9 @@ public final class ConnectivityController extends RestrictingController implemen // network changes against the active network for each UID with jobs. final NetworkRequest request = new NetworkRequest.Builder().clearCapabilities().build(); mConnManager.registerNetworkCallback(request, mNetworkCallback); + + mChargingTracker = new ChargingTracker(); + mChargingTracker.startTracking(); } @GuardedBy("mLock") @@ -538,6 +549,14 @@ public final class ConnectivityController extends RestrictingController implemen */ private boolean isInsane(JobStatus jobStatus, Network network, NetworkCapabilities capabilities, Constants constants) { + if (capabilities.hasCapability(NET_CAPABILITY_NOT_METERED) + && mChargingTracker.isCharging()) { + // We're charging and on an unmetered network. We don't have to be as conservative about + // making sure the job will run within its max execution time. Let's just hope the app + // supports interruptible work. + return false; + } + // Use the maximum possible time since it gives us an upper bound, even though the job // could end up stopping earlier. final long maxJobExecutionTimeMs = mService.getMaxJobExecutionTimeMs(jobStatus); @@ -922,7 +941,7 @@ public final class ConnectivityController extends RestrictingController implemen * {@link Network}, or {@code null} to update all tracked jobs. */ @GuardedBy("mLock") - private void updateTrackedJobsLocked(int filterUid, Network filterNetwork) { + private void updateTrackedJobsLocked(int filterUid, @Nullable Network filterNetwork) { boolean changed = false; if (filterUid == -1) { for (int i = mTrackedJobs.size() - 1; i >= 0; i--) { @@ -937,7 +956,8 @@ public final class ConnectivityController extends RestrictingController implemen } @GuardedBy("mLock") - private boolean updateTrackedJobsLocked(ArraySet<JobStatus> jobs, Network filterNetwork) { + private boolean updateTrackedJobsLocked(ArraySet<JobStatus> jobs, + @Nullable Network filterNetwork) { if (jobs == null || jobs.size() == 0) { return false; } @@ -993,6 +1013,51 @@ public final class ConnectivityController extends RestrictingController implemen } } + private final class ChargingTracker extends BroadcastReceiver { + /** + * Track whether we're "charging", where charging means that we're ready to commit to + * doing work. + */ + private boolean mCharging; + + ChargingTracker() {} + + public void startTracking() { + IntentFilter filter = new IntentFilter(); + filter.addAction(BatteryManager.ACTION_CHARGING); + filter.addAction(BatteryManager.ACTION_DISCHARGING); + mContext.registerReceiver(this, filter); + + // Initialise tracker state. + final BatteryManagerInternal batteryManagerInternal = + LocalServices.getService(BatteryManagerInternal.class); + mCharging = batteryManagerInternal.isPowered(BatteryManager.BATTERY_PLUGGED_ANY); + } + + public boolean isCharging() { + return mCharging; + } + + @Override + public void onReceive(Context context, Intent intent) { + synchronized (mLock) { + final String action = intent.getAction(); + if (BatteryManager.ACTION_CHARGING.equals(action)) { + if (mCharging) { + return; + } + mCharging = true; + } else if (BatteryManager.ACTION_DISCHARGING.equals(action)) { + if (!mCharging) { + return; + } + mCharging = false; + } + updateTrackedJobsLocked(-1, null); + } + } + } + private final NetworkCallback mNetworkCallback = new NetworkCallback() { @Override public void onAvailable(Network network) { diff --git a/apex/media/service/Android.bp b/apex/media/service/Android.bp index 9b3399e8b0e1..271fc5312f8f 100644 --- a/apex/media/service/Android.bp +++ b/apex/media/service/Android.bp @@ -23,10 +23,10 @@ package { filegroup { name: "service-media-s-sources", srcs: [ - "java/**/*.java", + "java/**/*.java", ], path: "java", - visibility: ["//frameworks/base/services"], // TODO(b/177640454): Should be private. + visibility: ["//visibility:private"], } java_sdk_library { diff --git a/api/Android.bp b/api/Android.bp index b85dc4613981..db1f64c57e2c 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -161,6 +161,7 @@ genrule { genrule { name: "frameworks-base-api-system-current.txt", srcs: [ + ":art.module.public.api{.system.api.txt}", ":android.net.ipsec.ike{.system.api.txt}", ":framework-appsearch{.system.api.txt}", ":framework-connectivity{.system.api.txt}", @@ -215,6 +216,7 @@ genrule { genrule { name: "frameworks-base-api-system-removed.txt", srcs: [ + ":art.module.public.api{.system.removed-api.txt}", ":android.net.ipsec.ike{.system.removed-api.txt}", ":framework-appsearch{.system.removed-api.txt}", ":framework-connectivity{.system.removed-api.txt}", @@ -251,6 +253,7 @@ genrule { genrule { name: "frameworks-base-api-module-lib-current.txt", srcs: [ + ":art.module.public.api{.module-lib.api.txt}", ":android.net.ipsec.ike{.module-lib.api.txt}", ":framework-appsearch{.module-lib.api.txt}", ":framework-connectivity{.module-lib.api.txt}", @@ -307,6 +310,7 @@ genrule { genrule { name: "frameworks-base-api-module-lib-removed.txt", srcs: [ + ":art.module.public.api{.module-lib.removed-api.txt}", ":android.net.ipsec.ike{.module-lib.removed-api.txt}", ":framework-appsearch{.module-lib.removed-api.txt}", ":framework-connectivity{.module-lib.removed-api.txt}", diff --git a/boot/hiddenapi/hiddenapi-max-target-o.txt b/boot/hiddenapi/hiddenapi-max-target-o.txt index 45ebbb1ea526..3cc28d908a38 100644 --- a/boot/hiddenapi/hiddenapi-max-target-o.txt +++ b/boot/hiddenapi/hiddenapi-max-target-o.txt @@ -93863,283 +93863,6 @@ Lcom/android/internal/widget/VerifyCredentialResponse;->setPayload([B)V Lcom/android/internal/widget/VerifyCredentialResponse;->setTimeout(I)V Lcom/android/internal/widget/VerifyCredentialResponse;->stripPayload()Lcom/android/internal/widget/VerifyCredentialResponse; Lcom/android/internal/widget/VerifyCredentialResponse;->TAG:Ljava/lang/String; -Lcom/android/org/conscrypt/AbstractConscryptSocket;-><init>()V -Lcom/android/org/conscrypt/AbstractConscryptSocket;-><init>(Ljava/lang/String;I)V -Lcom/android/org/conscrypt/AbstractConscryptSocket;-><init>(Ljava/lang/String;ILjava/net/InetAddress;I)V -Lcom/android/org/conscrypt/AbstractConscryptSocket;-><init>(Ljava/net/InetAddress;I)V -Lcom/android/org/conscrypt/AbstractConscryptSocket;-><init>(Ljava/net/InetAddress;ILjava/net/InetAddress;I)V -Lcom/android/org/conscrypt/AbstractConscryptSocket;->getFileDescriptor$()Ljava/io/FileDescriptor; -Lcom/android/org/conscrypt/AbstractConscryptSocket;->getTlsUnique()[B -Lcom/android/org/conscrypt/AbstractConscryptSocket;->peerInfoProvider()Lcom/android/org/conscrypt/PeerInfoProvider; -Lcom/android/org/conscrypt/AbstractConscryptSocket;->setApplicationProtocolSelector(Lcom/android/org/conscrypt/ApplicationProtocolSelector;)V -Lcom/android/org/conscrypt/ApplicationProtocolSelector;-><init>()V -Lcom/android/org/conscrypt/ApplicationProtocolSelector;->selectApplicationProtocol(Ljavax/net/ssl/SSLEngine;Ljava/util/List;)Ljava/lang/String; -Lcom/android/org/conscrypt/ApplicationProtocolSelector;->selectApplicationProtocol(Ljavax/net/ssl/SSLSocket;Ljava/util/List;)Ljava/lang/String; -Lcom/android/org/conscrypt/ApplicationProtocolSelectorAdapter;-><init>(Ljavax/net/ssl/SSLEngine;Lcom/android/org/conscrypt/ApplicationProtocolSelector;)V -Lcom/android/org/conscrypt/ApplicationProtocolSelectorAdapter;-><init>(Ljavax/net/ssl/SSLSocket;Lcom/android/org/conscrypt/ApplicationProtocolSelector;)V -Lcom/android/org/conscrypt/ApplicationProtocolSelectorAdapter;->engine:Ljavax/net/ssl/SSLEngine; -Lcom/android/org/conscrypt/ApplicationProtocolSelectorAdapter;->NO_PROTOCOL_SELECTED:I -Lcom/android/org/conscrypt/ApplicationProtocolSelectorAdapter;->selectApplicationProtocol([B)I -Lcom/android/org/conscrypt/ApplicationProtocolSelectorAdapter;->selector:Lcom/android/org/conscrypt/ApplicationProtocolSelector; -Lcom/android/org/conscrypt/ApplicationProtocolSelectorAdapter;->socket:Ljavax/net/ssl/SSLSocket; -Lcom/android/org/conscrypt/CertBlacklist;-><init>(Ljava/util/Set;Ljava/util/Set;)V -Lcom/android/org/conscrypt/CertBlacklist;->closeQuietly(Ljava/io/Closeable;)V -Lcom/android/org/conscrypt/CertBlacklist;->getDefault()Lcom/android/org/conscrypt/CertBlacklist; -Lcom/android/org/conscrypt/CertBlacklist;->HEX_TABLE:[B -Lcom/android/org/conscrypt/CertBlacklist;->isHex(Ljava/lang/String;)Z -Lcom/android/org/conscrypt/CertBlacklist;->isPubkeyHash(Ljava/lang/String;)Z -Lcom/android/org/conscrypt/CertBlacklist;->isPublicKeyBlackListed(Ljava/security/PublicKey;)Z -Lcom/android/org/conscrypt/CertBlacklist;->isSerialNumberBlackListed(Ljava/math/BigInteger;)Z -Lcom/android/org/conscrypt/CertBlacklist;->logger:Ljava/util/logging/Logger; -Lcom/android/org/conscrypt/CertBlacklist;->pubkeyBlacklist:Ljava/util/Set; -Lcom/android/org/conscrypt/CertBlacklist;->readBlacklist(Ljava/lang/String;)Ljava/lang/String; -Lcom/android/org/conscrypt/CertBlacklist;->readFileAsBytes(Ljava/lang/String;)Ljava/io/ByteArrayOutputStream; -Lcom/android/org/conscrypt/CertBlacklist;->readFileAsString(Ljava/lang/String;)Ljava/lang/String; -Lcom/android/org/conscrypt/CertBlacklist;->readPublicKeyBlackList(Ljava/lang/String;)Ljava/util/Set; -Lcom/android/org/conscrypt/CertBlacklist;->readSerialBlackList(Ljava/lang/String;)Ljava/util/Set; -Lcom/android/org/conscrypt/CertBlacklist;->serialBlacklist:Ljava/util/Set; -Lcom/android/org/conscrypt/CertBlacklist;->toHex([B)[B -Lcom/android/org/conscrypt/CertificatePriorityComparator;-><init>()V -Lcom/android/org/conscrypt/CertificatePriorityComparator;->ALGORITHM_OID_PRIORITY_MAP:Ljava/util/Map; -Lcom/android/org/conscrypt/CertificatePriorityComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I -Lcom/android/org/conscrypt/CertificatePriorityComparator;->compare(Ljava/security/cert/X509Certificate;Ljava/security/cert/X509Certificate;)I -Lcom/android/org/conscrypt/CertificatePriorityComparator;->compareKeyAlgorithm(Ljava/security/PublicKey;Ljava/security/PublicKey;)I -Lcom/android/org/conscrypt/CertificatePriorityComparator;->compareKeySize(Ljava/security/PublicKey;Ljava/security/PublicKey;)I -Lcom/android/org/conscrypt/CertificatePriorityComparator;->compareSignatureAlgorithm(Ljava/security/cert/X509Certificate;Ljava/security/cert/X509Certificate;)I -Lcom/android/org/conscrypt/CertificatePriorityComparator;->compareStrength(Ljava/security/cert/X509Certificate;Ljava/security/cert/X509Certificate;)I -Lcom/android/org/conscrypt/CertificatePriorityComparator;->getKeySize(Ljava/security/PublicKey;)I -Lcom/android/org/conscrypt/CertificatePriorityComparator;->PRIORITY_MD5:Ljava/lang/Integer; -Lcom/android/org/conscrypt/CertificatePriorityComparator;->PRIORITY_SHA1:Ljava/lang/Integer; -Lcom/android/org/conscrypt/CertificatePriorityComparator;->PRIORITY_SHA224:Ljava/lang/Integer; -Lcom/android/org/conscrypt/CertificatePriorityComparator;->PRIORITY_SHA256:Ljava/lang/Integer; -Lcom/android/org/conscrypt/CertificatePriorityComparator;->PRIORITY_SHA384:Ljava/lang/Integer; -Lcom/android/org/conscrypt/CertificatePriorityComparator;->PRIORITY_SHA512:Ljava/lang/Integer; -Lcom/android/org/conscrypt/CertificatePriorityComparator;->PRIORITY_UNKNOWN:Ljava/lang/Integer; -Lcom/android/org/conscrypt/CertPinManager;->checkChainPinning(Ljava/lang/String;Ljava/util/List;)V -Lcom/android/org/conscrypt/ConscryptSocketBase;-><init>()V -Lcom/android/org/conscrypt/ConscryptSocketBase;-><init>(Ljava/lang/String;I)V -Lcom/android/org/conscrypt/ConscryptSocketBase;-><init>(Ljava/lang/String;ILjava/net/InetAddress;I)V -Lcom/android/org/conscrypt/ConscryptSocketBase;-><init>(Ljava/net/InetAddress;I)V -Lcom/android/org/conscrypt/ConscryptSocketBase;-><init>(Ljava/net/InetAddress;ILjava/net/InetAddress;I)V -Lcom/android/org/conscrypt/ConscryptSocketBase;-><init>(Ljava/net/Socket;Ljava/lang/String;IZ)V -Lcom/android/org/conscrypt/ConscryptSocketBase;->autoClose:Z -Lcom/android/org/conscrypt/ConscryptSocketBase;->checkOpen()V -Lcom/android/org/conscrypt/ConscryptSocketBase;->getActiveSession()Ljavax/net/ssl/SSLSession; -Lcom/android/org/conscrypt/ConscryptSocketBase;->getFileDescriptor$()Ljava/io/FileDescriptor; -Lcom/android/org/conscrypt/ConscryptSocketBase;->isDelegating()Z -Lcom/android/org/conscrypt/ConscryptSocketBase;->listeners:Ljava/util/List; -Lcom/android/org/conscrypt/ConscryptSocketBase;->notifyHandshakeCompletedListeners()V -Lcom/android/org/conscrypt/ConscryptSocketBase;->peerHostname:Ljava/lang/String; -Lcom/android/org/conscrypt/ConscryptSocketBase;->peerInfoProvider()Lcom/android/org/conscrypt/PeerInfoProvider; -Lcom/android/org/conscrypt/ConscryptSocketBase;->peerInfoProvider:Lcom/android/org/conscrypt/PeerInfoProvider; -Lcom/android/org/conscrypt/ConscryptSocketBase;->peerPort:I -Lcom/android/org/conscrypt/ConscryptSocketBase;->readTimeoutMilliseconds:I -Lcom/android/org/conscrypt/ConscryptSocketBase;->setApplicationProtocolSelector(Lcom/android/org/conscrypt/ApplicationProtocolSelectorAdapter;)V -Lcom/android/org/conscrypt/NativeRef$EC_GROUP;-><init>(J)V -Lcom/android/org/conscrypt/NativeRef$EC_GROUP;->doFree(J)V -Lcom/android/org/conscrypt/NativeRef$EC_POINT;-><init>(J)V -Lcom/android/org/conscrypt/NativeRef$EC_POINT;->doFree(J)V -Lcom/android/org/conscrypt/NativeRef$EVP_CIPHER_CTX;-><init>(J)V -Lcom/android/org/conscrypt/NativeRef$EVP_CIPHER_CTX;->doFree(J)V -Lcom/android/org/conscrypt/NativeRef$EVP_MD_CTX;-><init>(J)V -Lcom/android/org/conscrypt/NativeRef$EVP_MD_CTX;->doFree(J)V -Lcom/android/org/conscrypt/NativeRef$EVP_PKEY;-><init>(J)V -Lcom/android/org/conscrypt/NativeRef$EVP_PKEY;->doFree(J)V -Lcom/android/org/conscrypt/NativeRef$EVP_PKEY_CTX;-><init>(J)V -Lcom/android/org/conscrypt/NativeRef$EVP_PKEY_CTX;->doFree(J)V -Lcom/android/org/conscrypt/NativeRef$HMAC_CTX;-><init>(J)V -Lcom/android/org/conscrypt/NativeRef$HMAC_CTX;->doFree(J)V -Lcom/android/org/conscrypt/NativeRef$SSL_SESSION;-><init>(J)V -Lcom/android/org/conscrypt/NativeRef$SSL_SESSION;->doFree(J)V -Lcom/android/org/conscrypt/NativeRef;-><init>(J)V -Lcom/android/org/conscrypt/NativeRef;->context:J -Lcom/android/org/conscrypt/NativeRef;->doFree(J)V -Lcom/android/org/conscrypt/OpenSSLKey;-><init>(JZ)V -Lcom/android/org/conscrypt/OpenSSLKey;->ctx:Lcom/android/org/conscrypt/NativeRef$EVP_PKEY; -Lcom/android/org/conscrypt/OpenSSLKey;->fromECPrivateKeyForTLSStackOnly(Ljava/security/PrivateKey;Ljava/security/spec/ECParameterSpec;)Lcom/android/org/conscrypt/OpenSSLKey; -Lcom/android/org/conscrypt/OpenSSLKey;->fromKeyMaterial(Ljava/security/PrivateKey;)Lcom/android/org/conscrypt/OpenSSLKey; -Lcom/android/org/conscrypt/OpenSSLKey;->fromPrivateKeyForTLSStackOnly(Ljava/security/PrivateKey;Ljava/security/PublicKey;)Lcom/android/org/conscrypt/OpenSSLKey; -Lcom/android/org/conscrypt/OpenSSLKey;->fromPrivateKeyPemInputStream(Ljava/io/InputStream;)Lcom/android/org/conscrypt/OpenSSLKey; -Lcom/android/org/conscrypt/OpenSSLKey;->fromPublicKey(Ljava/security/PublicKey;)Lcom/android/org/conscrypt/OpenSSLKey; -Lcom/android/org/conscrypt/OpenSSLKey;->fromPublicKeyPemInputStream(Ljava/io/InputStream;)Lcom/android/org/conscrypt/OpenSSLKey; -Lcom/android/org/conscrypt/OpenSSLKey;->getOpenSSLKey(Ljava/security/PrivateKey;)Lcom/android/org/conscrypt/OpenSSLKey; -Lcom/android/org/conscrypt/OpenSSLKey;->getPrivateKey()Ljava/security/PrivateKey; -Lcom/android/org/conscrypt/OpenSSLKey;->getPrivateKey(Ljava/security/spec/PKCS8EncodedKeySpec;I)Ljava/security/PrivateKey; -Lcom/android/org/conscrypt/OpenSSLKey;->getPublicKey(Ljava/security/spec/X509EncodedKeySpec;I)Ljava/security/PublicKey; -Lcom/android/org/conscrypt/OpenSSLKey;->isWrapped()Z -Lcom/android/org/conscrypt/OpenSSLKey;->wrapJCAPrivateKeyForTLSStackOnly(Ljava/security/PrivateKey;Ljava/security/PublicKey;)Lcom/android/org/conscrypt/OpenSSLKey; -Lcom/android/org/conscrypt/OpenSSLKey;->wrapped:Z -Lcom/android/org/conscrypt/OpenSSLKey;->wrapPrivateKey(Ljava/security/PrivateKey;)Lcom/android/org/conscrypt/OpenSSLKey; -Lcom/android/org/conscrypt/OpenSSLSocketImpl;-><init>()V -Lcom/android/org/conscrypt/OpenSSLSocketImpl;-><init>(Ljava/lang/String;I)V -Lcom/android/org/conscrypt/OpenSSLSocketImpl;-><init>(Ljava/lang/String;ILjava/net/InetAddress;I)V -Lcom/android/org/conscrypt/OpenSSLSocketImpl;-><init>(Ljava/net/InetAddress;I)V -Lcom/android/org/conscrypt/OpenSSLSocketImpl;-><init>(Ljava/net/InetAddress;ILjava/net/InetAddress;I)V -Lcom/android/org/conscrypt/OpenSSLSocketImpl;-><init>(Ljava/net/Socket;Ljava/lang/String;IZ)V -Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getFileDescriptor$()Ljava/io/FileDescriptor; -Lcom/android/org/conscrypt/OpenSSLX509Certificate;-><init>(J)V -Lcom/android/org/conscrypt/OpenSSLX509Certificate;-><init>(JLjava/util/Date;Ljava/util/Date;)V -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->alternativeNameArrayToList([[Ljava/lang/Object;)Ljava/util/Collection; -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->fromCertificate(Ljava/security/cert/Certificate;)Lcom/android/org/conscrypt/OpenSSLX509Certificate; -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->fromPkcs7DerInputStream(Ljava/io/InputStream;)Ljava/util/List; -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->fromPkcs7PemInputStream(Ljava/io/InputStream;)Ljava/util/List; -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->fromX509Der([B)Lcom/android/org/conscrypt/OpenSSLX509Certificate; -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->fromX509DerInputStream(Ljava/io/InputStream;)Lcom/android/org/conscrypt/OpenSSLX509Certificate; -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->getContext()J -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->mHashCode:Ljava/lang/Integer; -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->notAfter:Ljava/util/Date; -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->notBefore:Ljava/util/Date; -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->toDate(J)Ljava/util/Date; -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->verifyInternal(Ljava/security/PublicKey;Ljava/lang/String;)V -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->verifyOpenSSL(Lcom/android/org/conscrypt/OpenSSLKey;)V -Lcom/android/org/conscrypt/OpenSSLX509Certificate;->withDeletedExtension(Ljava/lang/String;)Lcom/android/org/conscrypt/OpenSSLX509Certificate; -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$Parser;-><init>()V -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$Parser;->fromPkcs7DerInputStream(Ljava/io/InputStream;)Ljava/util/List; -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$Parser;->fromPkcs7PemInputStream(Ljava/io/InputStream;)Ljava/util/List; -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$Parser;->fromX509DerInputStream(Ljava/io/InputStream;)Ljava/lang/Object; -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$Parser;->fromX509PemInputStream(Ljava/io/InputStream;)Ljava/lang/Object; -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$Parser;->generateItem(Ljava/io/InputStream;)Ljava/lang/Object; -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$Parser;->generateItems(Ljava/io/InputStream;)Ljava/util/Collection; -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$ParsingException;-><init>(Ljava/lang/Exception;)V -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$ParsingException;-><init>(Ljava/lang/String;)V -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$ParsingException;-><init>(Ljava/lang/String;Ljava/lang/Exception;)V -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory;-><init>()V -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory;->certificateParser:Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$Parser; -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory;->crlParser:Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory$Parser; -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory;->PKCS7_MARKER:[B -Lcom/android/org/conscrypt/OpenSSLX509CertificateFactory;->PUSHBACK_SIZE:I -Lcom/android/org/conscrypt/OpenSSLX509CRL;-><init>(J)V -Lcom/android/org/conscrypt/OpenSSLX509CRL;->fromPkcs7DerInputStream(Ljava/io/InputStream;)Ljava/util/List; -Lcom/android/org/conscrypt/OpenSSLX509CRL;->fromPkcs7PemInputStream(Ljava/io/InputStream;)Ljava/util/List; -Lcom/android/org/conscrypt/OpenSSLX509CRL;->fromX509DerInputStream(Ljava/io/InputStream;)Lcom/android/org/conscrypt/OpenSSLX509CRL; -Lcom/android/org/conscrypt/OpenSSLX509CRL;->fromX509PemInputStream(Ljava/io/InputStream;)Lcom/android/org/conscrypt/OpenSSLX509CRL; -Lcom/android/org/conscrypt/OpenSSLX509CRL;->mContext:J -Lcom/android/org/conscrypt/OpenSSLX509CRL;->nextUpdate:Ljava/util/Date; -Lcom/android/org/conscrypt/OpenSSLX509CRL;->thisUpdate:Ljava/util/Date; -Lcom/android/org/conscrypt/OpenSSLX509CRL;->toDate(J)Ljava/util/Date; -Lcom/android/org/conscrypt/OpenSSLX509CRL;->verifyInternal(Ljava/security/PublicKey;Ljava/lang/String;)V -Lcom/android/org/conscrypt/OpenSSLX509CRL;->verifyOpenSSL(Lcom/android/org/conscrypt/OpenSSLKey;)V -Lcom/android/org/conscrypt/PeerInfoProvider;-><init>()V -Lcom/android/org/conscrypt/PeerInfoProvider;->forHostAndPort(Ljava/lang/String;I)Lcom/android/org/conscrypt/PeerInfoProvider; -Lcom/android/org/conscrypt/PeerInfoProvider;->getHostname()Ljava/lang/String; -Lcom/android/org/conscrypt/PeerInfoProvider;->getHostnameOrIP()Ljava/lang/String; -Lcom/android/org/conscrypt/PeerInfoProvider;->getPort()I -Lcom/android/org/conscrypt/PeerInfoProvider;->nullProvider()Lcom/android/org/conscrypt/PeerInfoProvider; -Lcom/android/org/conscrypt/PeerInfoProvider;->NULL_PEER_INFO_PROVIDER:Lcom/android/org/conscrypt/PeerInfoProvider; -Lcom/android/org/conscrypt/SSLClientSessionCache;->getSessionData(Ljava/lang/String;I)[B -Lcom/android/org/conscrypt/SSLClientSessionCache;->putSessionData(Ljavax/net/ssl/SSLSession;[B)V -Lcom/android/org/conscrypt/TrustedCertificateIndex;-><init>()V -Lcom/android/org/conscrypt/TrustedCertificateIndex;-><init>(Ljava/util/Set;)V -Lcom/android/org/conscrypt/TrustedCertificateIndex;->findAllByIssuerAndSignature(Ljava/security/cert/X509Certificate;)Ljava/util/Set; -Lcom/android/org/conscrypt/TrustedCertificateIndex;->findByIssuerAndSignature(Ljava/security/cert/X509Certificate;)Ljava/security/cert/TrustAnchor; -Lcom/android/org/conscrypt/TrustedCertificateIndex;->findBySubjectAndPublicKey(Ljava/security/cert/X509Certificate;)Ljava/security/cert/TrustAnchor; -Lcom/android/org/conscrypt/TrustedCertificateIndex;->findBySubjectAndPublicKey(Ljava/security/cert/X509Certificate;Ljava/util/Collection;)Ljava/security/cert/TrustAnchor; -Lcom/android/org/conscrypt/TrustedCertificateIndex;->index(Ljava/security/cert/TrustAnchor;)V -Lcom/android/org/conscrypt/TrustedCertificateIndex;->index(Ljava/security/cert/X509Certificate;)Ljava/security/cert/TrustAnchor; -Lcom/android/org/conscrypt/TrustedCertificateIndex;->index(Ljava/util/Set;)V -Lcom/android/org/conscrypt/TrustedCertificateIndex;->reset()V -Lcom/android/org/conscrypt/TrustedCertificateIndex;->reset(Ljava/util/Set;)V -Lcom/android/org/conscrypt/TrustedCertificateIndex;->subjectToTrustAnchors:Ljava/util/Map; -Lcom/android/org/conscrypt/TrustedCertificateStore$CertSelector;->match(Ljava/security/cert/X509Certificate;)Z -Lcom/android/org/conscrypt/TrustedCertificateStore$PreloadHolder;-><init>()V -Lcom/android/org/conscrypt/TrustedCertificateStore$PreloadHolder;->defaultCaCertsAddedDir:Ljava/io/File; -Lcom/android/org/conscrypt/TrustedCertificateStore$PreloadHolder;->defaultCaCertsDeletedDir:Ljava/io/File; -Lcom/android/org/conscrypt/TrustedCertificateStore$PreloadHolder;->defaultCaCertsSystemDir:Ljava/io/File; -Lcom/android/org/conscrypt/TrustedCertificateStore;-><init>(Ljava/io/File;Ljava/io/File;Ljava/io/File;)V -Lcom/android/org/conscrypt/TrustedCertificateStore;->addAliases(Ljava/util/Set;Ljava/lang/String;Ljava/io/File;)V -Lcom/android/org/conscrypt/TrustedCertificateStore;->addedDir:Ljava/io/File; -Lcom/android/org/conscrypt/TrustedCertificateStore;->aliases()Ljava/util/Set; -Lcom/android/org/conscrypt/TrustedCertificateStore;->allSystemAliases()Ljava/util/Set; -Lcom/android/org/conscrypt/TrustedCertificateStore;->CERT_FACTORY:Ljava/security/cert/CertificateFactory; -Lcom/android/org/conscrypt/TrustedCertificateStore;->containsAlias(Ljava/lang/String;)Z -Lcom/android/org/conscrypt/TrustedCertificateStore;->containsAlias(Ljava/lang/String;Z)Z -Lcom/android/org/conscrypt/TrustedCertificateStore;->convertToOpenSSLIfNeeded(Ljava/security/cert/X509Certificate;)Lcom/android/org/conscrypt/OpenSSLX509Certificate; -Lcom/android/org/conscrypt/TrustedCertificateStore;->deleteCertificateEntry(Ljava/lang/String;)V -Lcom/android/org/conscrypt/TrustedCertificateStore;->deletedDir:Ljava/io/File; -Lcom/android/org/conscrypt/TrustedCertificateStore;->file(Ljava/io/File;Ljava/lang/String;I)Ljava/io/File; -Lcom/android/org/conscrypt/TrustedCertificateStore;->fileForAlias(Ljava/lang/String;)Ljava/io/File; -Lcom/android/org/conscrypt/TrustedCertificateStore;->findAllIssuers(Ljava/security/cert/X509Certificate;)Ljava/util/Set; -Lcom/android/org/conscrypt/TrustedCertificateStore;->findCert(Ljava/io/File;Ljavax/security/auth/x500/X500Principal;Lcom/android/org/conscrypt/TrustedCertificateStore$CertSelector;Ljava/lang/Class;)Ljava/lang/Object; -Lcom/android/org/conscrypt/TrustedCertificateStore;->findIssuer(Ljava/security/cert/X509Certificate;)Ljava/security/cert/X509Certificate; -Lcom/android/org/conscrypt/TrustedCertificateStore;->getCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate; -Lcom/android/org/conscrypt/TrustedCertificateStore;->getCertificate(Ljava/lang/String;Z)Ljava/security/cert/Certificate; -Lcom/android/org/conscrypt/TrustedCertificateStore;->getCertificateAlias(Ljava/security/cert/Certificate;)Ljava/lang/String; -Lcom/android/org/conscrypt/TrustedCertificateStore;->getCertificateAlias(Ljava/security/cert/Certificate;Z)Ljava/lang/String; -Lcom/android/org/conscrypt/TrustedCertificateStore;->getCertificateFile(Ljava/io/File;Ljava/security/cert/X509Certificate;)Ljava/io/File; -Lcom/android/org/conscrypt/TrustedCertificateStore;->getCreationDate(Ljava/lang/String;)Ljava/util/Date; -Lcom/android/org/conscrypt/TrustedCertificateStore;->getTrustAnchor(Ljava/security/cert/X509Certificate;)Ljava/security/cert/X509Certificate; -Lcom/android/org/conscrypt/TrustedCertificateStore;->hash(Ljavax/security/auth/x500/X500Principal;)Ljava/lang/String; -Lcom/android/org/conscrypt/TrustedCertificateStore;->installCertificate(Ljava/security/cert/X509Certificate;)V -Lcom/android/org/conscrypt/TrustedCertificateStore;->isDeletedSystemCertificate(Ljava/security/cert/X509Certificate;)Z -Lcom/android/org/conscrypt/TrustedCertificateStore;->isSelfIssuedCertificate(Lcom/android/org/conscrypt/OpenSSLX509Certificate;)Z -Lcom/android/org/conscrypt/TrustedCertificateStore;->isSystem(Ljava/lang/String;)Z -Lcom/android/org/conscrypt/TrustedCertificateStore;->isTombstone(Ljava/io/File;)Z -Lcom/android/org/conscrypt/TrustedCertificateStore;->isUser(Ljava/lang/String;)Z -Lcom/android/org/conscrypt/TrustedCertificateStore;->isUserAddedCertificate(Ljava/security/cert/X509Certificate;)Z -Lcom/android/org/conscrypt/TrustedCertificateStore;->PREFIX_SYSTEM:Ljava/lang/String; -Lcom/android/org/conscrypt/TrustedCertificateStore;->PREFIX_USER:Ljava/lang/String; -Lcom/android/org/conscrypt/TrustedCertificateStore;->readCertificate(Ljava/io/File;)Ljava/security/cert/X509Certificate; -Lcom/android/org/conscrypt/TrustedCertificateStore;->removeUnnecessaryTombstones(Ljava/lang/String;)V -Lcom/android/org/conscrypt/TrustedCertificateStore;->setDefaultUserDirectory(Ljava/io/File;)V -Lcom/android/org/conscrypt/TrustedCertificateStore;->systemDir:Ljava/io/File; -Lcom/android/org/conscrypt/TrustedCertificateStore;->userAliases()Ljava/util/Set; -Lcom/android/org/conscrypt/TrustedCertificateStore;->writeCertificate(Ljava/io/File;Ljava/security/cert/X509Certificate;)V -Lcom/android/org/conscrypt/TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker;-><init>(ZLjava/security/cert/X509Certificate;)V -Lcom/android/org/conscrypt/TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker;->clientAuth:Z -Lcom/android/org/conscrypt/TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker;->EKU_anyExtendedKeyUsage:Ljava/lang/String; -Lcom/android/org/conscrypt/TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker;->EKU_clientAuth:Ljava/lang/String; -Lcom/android/org/conscrypt/TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker;->EKU_msSGC:Ljava/lang/String; -Lcom/android/org/conscrypt/TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker;->EKU_nsSGC:Ljava/lang/String; -Lcom/android/org/conscrypt/TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker;->EKU_OID:Ljava/lang/String; -Lcom/android/org/conscrypt/TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker;->EKU_serverAuth:Ljava/lang/String; -Lcom/android/org/conscrypt/TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker;->leaf:Ljava/security/cert/X509Certificate; -Lcom/android/org/conscrypt/TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker;->SUPPORTED_EXTENSIONS:Ljava/util/Set; -Lcom/android/org/conscrypt/TrustManagerImpl$TrustAnchorComparator;-><init>()V -Lcom/android/org/conscrypt/TrustManagerImpl$TrustAnchorComparator;->CERT_COMPARATOR:Lcom/android/org/conscrypt/CertificatePriorityComparator; -Lcom/android/org/conscrypt/TrustManagerImpl$TrustAnchorComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I -Lcom/android/org/conscrypt/TrustManagerImpl$TrustAnchorComparator;->compare(Ljava/security/cert/TrustAnchor;Ljava/security/cert/TrustAnchor;)I -Lcom/android/org/conscrypt/TrustManagerImpl;-><init>(Ljava/security/KeyStore;Lcom/android/org/conscrypt/CertPinManager;)V -Lcom/android/org/conscrypt/TrustManagerImpl;-><init>(Ljava/security/KeyStore;Lcom/android/org/conscrypt/CertPinManager;Lcom/android/org/conscrypt/TrustedCertificateStore;)V -Lcom/android/org/conscrypt/TrustManagerImpl;-><init>(Ljava/security/KeyStore;Lcom/android/org/conscrypt/CertPinManager;Lcom/android/org/conscrypt/TrustedCertificateStore;Lcom/android/org/conscrypt/CertBlacklist;)V -Lcom/android/org/conscrypt/TrustManagerImpl;-><init>(Ljava/security/KeyStore;Lcom/android/org/conscrypt/CertPinManager;Lcom/android/org/conscrypt/TrustedCertificateStore;Lcom/android/org/conscrypt/CertBlacklist;Lcom/android/org/conscrypt/ct/CTLogStore;Lcom/android/org/conscrypt/ct/CTVerifier;Lcom/android/org/conscrypt/ct/CTPolicy;)V -Lcom/android/org/conscrypt/TrustManagerImpl;->acceptedIssuers(Ljava/security/KeyStore;)[Ljava/security/cert/X509Certificate; -Lcom/android/org/conscrypt/TrustManagerImpl;->acceptedIssuers:[Ljava/security/cert/X509Certificate; -Lcom/android/org/conscrypt/TrustManagerImpl;->blacklist:Lcom/android/org/conscrypt/CertBlacklist; -Lcom/android/org/conscrypt/TrustManagerImpl;->checkBlacklist(Ljava/security/cert/X509Certificate;)V -Lcom/android/org/conscrypt/TrustManagerImpl;->checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List; -Lcom/android/org/conscrypt/TrustManagerImpl;->checkCT(Ljava/lang/String;Ljava/util/List;[B[B)V -Lcom/android/org/conscrypt/TrustManagerImpl;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljavax/net/ssl/SSLSession;)Ljava/util/List; -Lcom/android/org/conscrypt/TrustManagerImpl;->checkTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljavax/net/ssl/SSLSession;Ljavax/net/ssl/SSLParameters;Z)Ljava/util/List; -Lcom/android/org/conscrypt/TrustManagerImpl;->checkTrusted([Ljava/security/cert/X509Certificate;[B[BLjava/lang/String;Ljava/lang/String;Z)Ljava/util/List; -Lcom/android/org/conscrypt/TrustManagerImpl;->checkTrustedRecursive([Ljava/security/cert/X509Certificate;[B[BLjava/lang/String;ZLjava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/Set;)Ljava/util/List; -Lcom/android/org/conscrypt/TrustManagerImpl;->ctEnabledOverride:Z -Lcom/android/org/conscrypt/TrustManagerImpl;->ctPolicy:Lcom/android/org/conscrypt/ct/CTPolicy; -Lcom/android/org/conscrypt/TrustManagerImpl;->ctVerifier:Lcom/android/org/conscrypt/ct/CTVerifier; -Lcom/android/org/conscrypt/TrustManagerImpl;->err:Ljava/lang/Exception; -Lcom/android/org/conscrypt/TrustManagerImpl;->factory:Ljava/security/cert/CertificateFactory; -Lcom/android/org/conscrypt/TrustManagerImpl;->findAllTrustAnchorsByIssuerAndSignature(Ljava/security/cert/X509Certificate;)Ljava/util/Set; -Lcom/android/org/conscrypt/TrustManagerImpl;->findTrustAnchorBySubjectAndPublicKey(Ljava/security/cert/X509Certificate;)Ljava/security/cert/TrustAnchor; -Lcom/android/org/conscrypt/TrustManagerImpl;->getHandshakeSessionOrThrow(Ljavax/net/ssl/SSLSocket;)Ljavax/net/ssl/SSLSession; -Lcom/android/org/conscrypt/TrustManagerImpl;->getOcspDataFromSession(Ljavax/net/ssl/SSLSession;)[B -Lcom/android/org/conscrypt/TrustManagerImpl;->getTlsSctDataFromSession(Ljavax/net/ssl/SSLSession;)[B -Lcom/android/org/conscrypt/TrustManagerImpl;->getTrustedChainForServer([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/net/Socket;)Ljava/util/List; -Lcom/android/org/conscrypt/TrustManagerImpl;->getTrustedChainForServer([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)Ljava/util/List; -Lcom/android/org/conscrypt/TrustManagerImpl;->handleTrustStorageUpdate()V -Lcom/android/org/conscrypt/TrustManagerImpl;->intermediateIndex:Lcom/android/org/conscrypt/TrustedCertificateIndex; -Lcom/android/org/conscrypt/TrustManagerImpl;->isUserAddedCertificate(Ljava/security/cert/X509Certificate;)Z -Lcom/android/org/conscrypt/TrustManagerImpl;->pinManager:Lcom/android/org/conscrypt/CertPinManager; -Lcom/android/org/conscrypt/TrustManagerImpl;->rootKeyStore:Ljava/security/KeyStore; -Lcom/android/org/conscrypt/TrustManagerImpl;->setCTEnabledOverride(Z)V -Lcom/android/org/conscrypt/TrustManagerImpl;->setCTPolicy(Lcom/android/org/conscrypt/ct/CTPolicy;)V -Lcom/android/org/conscrypt/TrustManagerImpl;->setCTVerifier(Lcom/android/org/conscrypt/ct/CTVerifier;)V -Lcom/android/org/conscrypt/TrustManagerImpl;->setOcspResponses(Ljava/security/cert/PKIXParameters;Ljava/security/cert/X509Certificate;[B)V -Lcom/android/org/conscrypt/TrustManagerImpl;->sortPotentialAnchors(Ljava/util/Set;)Ljava/util/Collection; -Lcom/android/org/conscrypt/TrustManagerImpl;->trustAnchors([Ljava/security/cert/X509Certificate;)Ljava/util/Set; -Lcom/android/org/conscrypt/TrustManagerImpl;->trustedCertificateIndex:Lcom/android/org/conscrypt/TrustedCertificateIndex; -Lcom/android/org/conscrypt/TrustManagerImpl;->trustedCertificateStore:Lcom/android/org/conscrypt/TrustedCertificateStore; -Lcom/android/org/conscrypt/TrustManagerImpl;->TRUST_ANCHOR_COMPARATOR:Lcom/android/org/conscrypt/TrustManagerImpl$TrustAnchorComparator; -Lcom/android/org/conscrypt/TrustManagerImpl;->validator:Ljava/security/cert/CertPathValidator; -Lcom/android/org/conscrypt/TrustManagerImpl;->verifyChain(Ljava/util/List;Ljava/util/List;Ljava/lang/String;Z[B[B)Ljava/util/List; Lorg/apache/http/conn/ssl/AbstractVerifier;->IPV4_PATTERN:Ljava/util/regex/Pattern; Lorg/apache/http/conn/ssl/AbstractVerifier;->isIPv4Address(Ljava/lang/String;)Z Lorg/apache/http/conn/ssl/SSLSocketFactory$NoPreloadHolder;-><init>()V diff --git a/core/api/current.txt b/core/api/current.txt index f546f531b08f..4c61afea3b59 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -5958,7 +5958,6 @@ package android.app { method @NonNull public android.app.Notification.Builder setRemoteInputHistory(CharSequence[]); method @NonNull public android.app.Notification.Builder setSettingsText(CharSequence); method @NonNull public android.app.Notification.Builder setShortcutId(String); - method @Deprecated @NonNull public android.app.Notification.Builder setShowForegroundImmediately(boolean); method @NonNull public android.app.Notification.Builder setShowWhen(boolean); method @NonNull public android.app.Notification.Builder setSmallIcon(@DrawableRes int); method @NonNull public android.app.Notification.Builder setSmallIcon(@DrawableRes int, int); @@ -31965,7 +31964,6 @@ package android.os { method public long getUserCreationTime(android.os.UserHandle); method public android.os.UserHandle getUserForSerialNumber(long); method @NonNull @RequiresPermission(anyOf={"android.permission.MANAGE_USERS", android.Manifest.permission.GET_ACCOUNTS_PRIVILEGED, "android.permission.CREATE_USERS"}, conditional=true) public String getUserName(); - method public int getUserPrivacySensitivity(); method public java.util.List<android.os.UserHandle> getUserProfiles(); method public android.os.Bundle getUserRestrictions(); method @RequiresPermission(anyOf={"android.permission.MANAGE_USERS", "android.permission.INTERACT_ACROSS_USERS"}, conditional=true) public android.os.Bundle getUserRestrictions(android.os.UserHandle); @@ -32046,8 +32044,6 @@ package android.os { field public static final String DISALLOW_USER_SWITCH = "no_user_switch"; field public static final String ENSURE_VERIFY_APPS = "ensure_verify_apps"; field public static final String KEY_RESTRICTIONS_PENDING = "restrictions_pending"; - field public static final int PRIVACY_SENSITIVITY_DEFAULT = 0; // 0x0 - field public static final int PRIVACY_SENSITIVITY_LOCATION = 1; // 0x1 field public static final int QUIET_MODE_DISABLE_ONLY_IF_CREDENTIAL_NOT_REQUIRED = 1; // 0x1 field public static final int USER_CREATION_FAILED_NOT_PERMITTED = 1; // 0x1 field public static final int USER_CREATION_FAILED_NO_MORE_USERS = 2; // 0x2 @@ -52897,8 +52893,6 @@ package android.view.translation { public static final class TranslationRequest.Builder { ctor public TranslationRequest.Builder(); - method @Deprecated @NonNull public android.view.translation.TranslationRequest.Builder addTranslationRequestValue(@NonNull android.view.translation.TranslationRequestValue); - method @Deprecated @NonNull public android.view.translation.TranslationRequest.Builder addViewTranslationRequest(@NonNull android.view.translation.ViewTranslationRequest); method @NonNull public android.view.translation.TranslationRequest build(); method @NonNull public android.view.translation.TranslationRequest.Builder setFlags(int); method @NonNull public android.view.translation.TranslationRequest.Builder setTranslationRequestValues(@NonNull java.util.List<android.view.translation.TranslationRequestValue>); @@ -52932,7 +52926,6 @@ package android.view.translation { method @NonNull public android.view.translation.TranslationResponse.Builder setFinalResponse(boolean); method @NonNull public android.view.translation.TranslationResponse.Builder setTranslationResponseValue(int, @NonNull android.view.translation.TranslationResponseValue); method @NonNull public android.view.translation.TranslationResponse.Builder setTranslationResponseValues(@NonNull android.util.SparseArray<android.view.translation.TranslationResponseValue>); - method @Deprecated @NonNull public android.view.translation.TranslationResponse.Builder setTranslationStatus(int); method @NonNull public android.view.translation.TranslationResponse.Builder setViewTranslationResponse(int, @NonNull android.view.translation.ViewTranslationResponse); method @NonNull public android.view.translation.TranslationResponse.Builder setViewTranslationResponses(@NonNull android.util.SparseArray<android.view.translation.ViewTranslationResponse>); } diff --git a/core/api/removed.txt b/core/api/removed.txt index cdb6a5814217..57e1598b4c33 100644 --- a/core/api/removed.txt +++ b/core/api/removed.txt @@ -560,6 +560,15 @@ package android.view.translation { method @Deprecated public void removeTranslationCapabilityUpdateListener(int, int, @NonNull android.app.PendingIntent); } + public static final class TranslationRequest.Builder { + method @Deprecated @NonNull public android.view.translation.TranslationRequest.Builder addTranslationRequestValue(@NonNull android.view.translation.TranslationRequestValue); + method @Deprecated @NonNull public android.view.translation.TranslationRequest.Builder addViewTranslationRequest(@NonNull android.view.translation.ViewTranslationRequest); + } + + public static final class TranslationResponse.Builder { + method @Deprecated @NonNull public android.view.translation.TranslationResponse.Builder setTranslationStatus(int); + } + public final class TranslationSpec implements android.os.Parcelable { ctor @Deprecated public TranslationSpec(@NonNull String, int); method @Deprecated @NonNull public String getLanguage(); diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 9befc3b4e1af..7072bbeade29 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -4930,10 +4930,6 @@ package android.location { field @Deprecated public static final String EXTRA_NO_GPS_LOCATION = "noGPSLocation"; } - public final class LocationDeviceConfig { - field public static final String IGNORE_SETTINGS_ALLOWLIST = "ignore_settings_allowlist"; - } - public class LocationManager { method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void addProviderRequestChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.location.provider.ProviderRequest.ChangedListener); method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void flushGnssBatch(); @@ -4946,7 +4942,6 @@ package android.location { method public boolean isLocationEnabledForUser(@NonNull android.os.UserHandle); method public boolean isProviderEnabledForUser(@NonNull String, @NonNull android.os.UserHandle); method @Deprecated @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public boolean isProviderPackage(@NonNull String); - method @Deprecated @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public boolean isProviderPackage(@Nullable String, @NonNull String); method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public boolean isProviderPackage(@Nullable String, @NonNull String, @Nullable String); method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.UPDATE_APP_OPS_STATS}) public boolean registerGnssBatchedLocationCallback(long, boolean, @NonNull android.location.BatchedLocationCallback, @Nullable android.os.Handler); method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssMeasurementsCallback(@NonNull android.location.GnssRequest, @NonNull java.util.concurrent.Executor, @NonNull android.location.GnssMeasurementsEvent.Callback); @@ -10529,7 +10524,7 @@ package android.service.voice { method @Nullable public android.media.MediaSyncEvent getMediaSyncEvent(); method public int getPersonalizedScore(); method public int getScore(); - method public boolean isPersonalizedHotwordDetection(); + method public boolean isHotwordDetectionPersonalized(); method public void writeToParcel(@NonNull android.os.Parcel, int); field public static final int AUDIO_CHANNEL_UNSET = -1; // 0xffffffff field public static final int CONFIDENCE_LEVEL_HIGH = 5; // 0x5 @@ -10549,11 +10544,11 @@ package android.service.voice { method @NonNull public android.service.voice.HotwordDetectedResult.Builder setAudioChannel(int); method @NonNull public android.service.voice.HotwordDetectedResult.Builder setConfidenceLevel(int); method @NonNull public android.service.voice.HotwordDetectedResult.Builder setExtras(@NonNull android.os.PersistableBundle); + method @NonNull public android.service.voice.HotwordDetectedResult.Builder setHotwordDetectionPersonalized(boolean); method @NonNull public android.service.voice.HotwordDetectedResult.Builder setHotwordDurationMillis(int); method @NonNull public android.service.voice.HotwordDetectedResult.Builder setHotwordOffsetMillis(int); method @NonNull public android.service.voice.HotwordDetectedResult.Builder setHotwordPhraseId(int); method @NonNull public android.service.voice.HotwordDetectedResult.Builder setMediaSyncEvent(@NonNull android.media.MediaSyncEvent); - method @NonNull public android.service.voice.HotwordDetectedResult.Builder setPersonalizedHotwordDetection(boolean); method @NonNull public android.service.voice.HotwordDetectedResult.Builder setPersonalizedScore(int); method @NonNull public android.service.voice.HotwordDetectedResult.Builder setScore(int); } @@ -10565,6 +10560,7 @@ package android.service.voice { method public void onDetect(@NonNull android.service.voice.AlwaysOnHotwordDetector.EventPayload, long, @NonNull android.service.voice.HotwordDetectionService.Callback); method public void onDetect(@NonNull android.service.voice.HotwordDetectionService.Callback); method public void onDetect(@NonNull android.os.ParcelFileDescriptor, @NonNull android.media.AudioFormat, @Nullable android.os.PersistableBundle, @NonNull android.service.voice.HotwordDetectionService.Callback); + method public void onStopDetection(); method public void onUpdateState(@Nullable android.os.PersistableBundle, @Nullable android.os.SharedMemory, long, @Nullable java.util.function.IntConsumer); field public static final int INITIALIZATION_STATUS_SUCCESS = 0; // 0x0 field public static final int INITIALIZATION_STATUS_UNKNOWN = 100; // 0x64 @@ -10604,6 +10600,12 @@ package android.service.voice { field @NonNull public static final android.os.Parcelable.Creator<android.service.voice.HotwordRejectedResult> CREATOR; } + public static final class HotwordRejectedResult.Builder { + ctor public HotwordRejectedResult.Builder(); + method @NonNull public android.service.voice.HotwordRejectedResult build(); + method @NonNull public android.service.voice.HotwordRejectedResult.Builder setConfidenceLevel(int); + } + public class VoiceInteractionService extends android.app.Service { method @NonNull public final android.service.voice.AlwaysOnHotwordDetector createAlwaysOnHotwordDetector(String, java.util.Locale, android.service.voice.AlwaysOnHotwordDetector.Callback); method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_HOTWORD_DETECTION) public final android.service.voice.AlwaysOnHotwordDetector createAlwaysOnHotwordDetector(String, java.util.Locale, @Nullable android.os.PersistableBundle, @Nullable android.os.SharedMemory, android.service.voice.AlwaysOnHotwordDetector.Callback); @@ -12836,7 +12838,6 @@ package android.telephony.ims { method public void onCreated(@NonNull android.telephony.ims.stub.SipDelegate, @Nullable java.util.Set<android.telephony.ims.FeatureTagState>); method public void onDestroyed(int); method public void onFeatureTagRegistrationChanged(@NonNull android.telephony.ims.DelegateRegistrationState); - method @Deprecated public void onImsConfigurationChanged(@NonNull android.telephony.ims.SipDelegateImsConfiguration); } public final class FeatureTagState implements android.os.Parcelable { @@ -13651,74 +13652,12 @@ package android.telephony.ims { } public interface SipDelegateConnection { - method public default void cleanupSession(@NonNull String); - method @Deprecated public default void closeDialog(@NonNull String); + method public void cleanupSession(@NonNull String); method public void notifyMessageReceiveError(@NonNull String, int); method public void notifyMessageReceived(@NonNull String); method public void sendMessage(@NonNull android.telephony.ims.SipMessage, long); } - @Deprecated public final class SipDelegateImsConfiguration implements android.os.Parcelable { - method @Deprecated public boolean containsKey(@NonNull String); - method @Deprecated @NonNull public android.os.PersistableBundle copyBundle(); - method @Deprecated public int describeContents(); - method @Deprecated public boolean getBoolean(@NonNull String, boolean); - method @Deprecated public int getInt(@NonNull String, int); - method @Deprecated @Nullable public String getString(@NonNull String); - method @Deprecated public long getVersion(); - method @Deprecated public void writeToParcel(@NonNull android.os.Parcel, int); - field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.SipDelegateImsConfiguration> CREATOR; - field @Deprecated public static final String IPTYPE_IPV4 = "IPV4"; - field @Deprecated public static final String IPTYPE_IPV6 = "IPV6"; - field @Deprecated public static final String KEY_SIP_CONFIG_AUTHENTICATION_HEADER_STRING = "sip_config_auhentication_header_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_AUTHENTICATION_NONCE_STRING = "sip_config_authentication_nonce_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_CELLULAR_NETWORK_INFO_HEADER_STRING = "sip_config_cellular_network_info_header_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_HOME_DOMAIN_STRING = "sip_config_home_domain_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_IMEI_STRING = "sip_config_imei_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_IPTYPE_STRING = "sip_config_iptype_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_IS_COMPACT_FORM_ENABLED_BOOL = "sip_config_is_compact_form_enabled_bool"; - field @Deprecated public static final String KEY_SIP_CONFIG_IS_GRUU_ENABLED_BOOL = "sip_config_is_gruu_enabled_bool"; - field @Deprecated public static final String KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL = "sip_config_is_ipsec_enabled_bool"; - field @Deprecated public static final String KEY_SIP_CONFIG_IS_KEEPALIVE_ENABLED_BOOL = "sip_config_is_keepalive_enabled_bool"; - field @Deprecated public static final String KEY_SIP_CONFIG_IS_NAT_ENABLED_BOOL = "sip_config_is_nat_enabled_bool"; - field @Deprecated public static final String KEY_SIP_CONFIG_MAX_PAYLOAD_SIZE_ON_UDP_INT = "sip_config_udp_max_payload_size_int"; - field @Deprecated public static final String KEY_SIP_CONFIG_PATH_HEADER_STRING = "sip_config_path_header_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_P_ACCESS_NETWORK_INFO_HEADER_STRING = "sip_config_p_access_network_info_header_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_P_ASSOCIATED_URI_HEADER_STRING = "sip_config_p_associated_uri_header_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_P_LAST_ACCESS_NETWORK_INFO_HEADER_STRING = "sip_config_p_last_access_network_info_header_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_SECURITY_VERIFY_HEADER_STRING = "sip_config_security_verify_header_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_SERVER_DEFAULT_IPADDRESS_STRING = "sip_config_server_default_ipaddress_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_SERVER_DEFAULT_PORT_INT = "sip_config_server_default_port_int"; - field @Deprecated public static final String KEY_SIP_CONFIG_SERVER_IPSEC_CLIENT_PORT_INT = "sip_config_server_ipsec_client_port_int"; - field @Deprecated public static final String KEY_SIP_CONFIG_SERVER_IPSEC_OLD_CLIENT_PORT_INT = "sip_config_server_ipsec_old_client_port_int"; - field @Deprecated public static final String KEY_SIP_CONFIG_SERVER_IPSEC_SERVER_PORT_INT = "sip_config_server_ipsec_server_port_int"; - field @Deprecated public static final String KEY_SIP_CONFIG_SERVICE_ROUTE_HEADER_STRING = "sip_config_service_route_header_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_TRANSPORT_TYPE_STRING = "sip_config_protocol_type_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_UE_DEFAULT_IPADDRESS_STRING = "sip_config_ue_default_ipaddress_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_UE_DEFAULT_PORT_INT = "sip_config_ue_default_port_int"; - field @Deprecated public static final String KEY_SIP_CONFIG_UE_IPSEC_CLIENT_PORT_INT = "sip_config_ue_ipsec_client_port_int"; - field @Deprecated public static final String KEY_SIP_CONFIG_UE_IPSEC_OLD_CLIENT_PORT_INT = "sip_config_ue_ipsec_old_client_port_int"; - field @Deprecated public static final String KEY_SIP_CONFIG_UE_IPSEC_SERVER_PORT_INT = "sip_config_ue_ipsec_server_port_int"; - field @Deprecated public static final String KEY_SIP_CONFIG_UE_PRIVATE_USER_ID_STRING = "sip_config_ue_private_user_id_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_UE_PUBLIC_GRUU_STRING = "sip_config_ue_public_gruu_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_UE_PUBLIC_IPADDRESS_WITH_NAT_STRING = "sip_config_ue_public_ipaddress_with_nat_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_UE_PUBLIC_PORT_WITH_NAT_INT = "sip_config_ue_public_port_with_nat_int"; - field @Deprecated public static final String KEY_SIP_CONFIG_UE_PUBLIC_USER_ID_STRING = "sip_config_ue_public_user_id_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_URI_USER_PART_STRING = "sip_config_uri_user_part_string"; - field @Deprecated public static final String KEY_SIP_CONFIG_USER_AGENT_HEADER_STRING = "sip_config_sip_user_agent_header_string"; - field @Deprecated public static final String SIP_TRANSPORT_TCP = "TCP"; - field @Deprecated public static final String SIP_TRANSPORT_UDP = "UDP"; - } - - @Deprecated public static final class SipDelegateImsConfiguration.Builder { - ctor @Deprecated public SipDelegateImsConfiguration.Builder(int); - ctor @Deprecated public SipDelegateImsConfiguration.Builder(@NonNull android.telephony.ims.SipDelegateImsConfiguration); - method @Deprecated @NonNull public android.telephony.ims.SipDelegateImsConfiguration.Builder addBoolean(@NonNull String, boolean); - method @Deprecated @NonNull public android.telephony.ims.SipDelegateImsConfiguration.Builder addInt(@NonNull String, int); - method @Deprecated @NonNull public android.telephony.ims.SipDelegateImsConfiguration.Builder addString(@NonNull String, @NonNull String); - method @Deprecated @NonNull public android.telephony.ims.SipDelegateImsConfiguration build(); - } - public class SipDelegateManager { method @RequiresPermission(android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void createSipDelegate(@NonNull android.telephony.ims.DelegateRequest, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.stub.DelegateConnectionStateCallback, @NonNull android.telephony.ims.stub.DelegateConnectionMessageCallback) throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION) public void destroySipDelegate(@NonNull android.telephony.ims.SipDelegateConnection, int); @@ -13886,11 +13825,10 @@ package android.telephony.ims.stub { } public interface DelegateConnectionStateCallback { - method public default void onConfigurationChanged(@NonNull android.telephony.ims.SipDelegateConfiguration); + method public void onConfigurationChanged(@NonNull android.telephony.ims.SipDelegateConfiguration); method public void onCreated(@NonNull android.telephony.ims.SipDelegateConnection); method public void onDestroyed(int); method public void onFeatureTagStatusChanged(@NonNull android.telephony.ims.DelegateRegistrationState, @NonNull java.util.Set<android.telephony.ims.FeatureTagState>); - method @Deprecated public default void onImsConfigurationChanged(@NonNull android.telephony.ims.SipDelegateImsConfiguration); } public class ImsCallSessionImplBase implements java.lang.AutoCloseable { @@ -14104,8 +14042,7 @@ package android.telephony.ims.stub { } public interface SipDelegate { - method public default void cleanupSession(@NonNull String); - method @Deprecated public default void closeDialog(@NonNull String); + method public void cleanupSession(@NonNull String); method public void notifyMessageReceiveError(@NonNull String, int); method public void notifyMessageReceived(@NonNull String); method public void sendMessage(@NonNull android.telephony.ims.SipMessage, long); diff --git a/core/api/system-removed.txt b/core/api/system-removed.txt index 7cf007640b1a..9a8a49397322 100644 --- a/core/api/system-removed.txt +++ b/core/api/system-removed.txt @@ -135,6 +135,7 @@ package android.location { public class LocationManager { method @Deprecated public boolean addGpsMeasurementListener(android.location.GpsMeasurementsEvent.Listener); method @Deprecated public boolean addGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener); + method @Deprecated @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public boolean isProviderPackage(@Nullable String, @NonNull String); method @Deprecated public void removeGpsMeasurementListener(android.location.GpsMeasurementsEvent.Listener); method @Deprecated public void removeGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener); method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setLocationControllerExtraPackage(String); @@ -231,6 +232,83 @@ package android.telephony.data { } +package android.telephony.ims { + + public interface DelegateStateCallback { + method @Deprecated public void onImsConfigurationChanged(@NonNull android.telephony.ims.SipDelegateImsConfiguration); + } + + @Deprecated public final class SipDelegateImsConfiguration implements android.os.Parcelable { + method public boolean containsKey(@NonNull String); + method @NonNull public android.os.PersistableBundle copyBundle(); + method public int describeContents(); + method public boolean getBoolean(@NonNull String, boolean); + method public int getInt(@NonNull String, int); + method @Nullable public String getString(@NonNull String); + method public long getVersion(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.SipDelegateImsConfiguration> CREATOR; + field public static final String IPTYPE_IPV4 = "IPV4"; + field public static final String IPTYPE_IPV6 = "IPV6"; + field public static final String KEY_SIP_CONFIG_AUTHENTICATION_HEADER_STRING = "sip_config_auhentication_header_string"; + field public static final String KEY_SIP_CONFIG_AUTHENTICATION_NONCE_STRING = "sip_config_authentication_nonce_string"; + field public static final String KEY_SIP_CONFIG_CELLULAR_NETWORK_INFO_HEADER_STRING = "sip_config_cellular_network_info_header_string"; + field public static final String KEY_SIP_CONFIG_HOME_DOMAIN_STRING = "sip_config_home_domain_string"; + field public static final String KEY_SIP_CONFIG_IMEI_STRING = "sip_config_imei_string"; + field public static final String KEY_SIP_CONFIG_IPTYPE_STRING = "sip_config_iptype_string"; + field public static final String KEY_SIP_CONFIG_IS_COMPACT_FORM_ENABLED_BOOL = "sip_config_is_compact_form_enabled_bool"; + field public static final String KEY_SIP_CONFIG_IS_GRUU_ENABLED_BOOL = "sip_config_is_gruu_enabled_bool"; + field public static final String KEY_SIP_CONFIG_IS_IPSEC_ENABLED_BOOL = "sip_config_is_ipsec_enabled_bool"; + field public static final String KEY_SIP_CONFIG_IS_KEEPALIVE_ENABLED_BOOL = "sip_config_is_keepalive_enabled_bool"; + field public static final String KEY_SIP_CONFIG_IS_NAT_ENABLED_BOOL = "sip_config_is_nat_enabled_bool"; + field public static final String KEY_SIP_CONFIG_MAX_PAYLOAD_SIZE_ON_UDP_INT = "sip_config_udp_max_payload_size_int"; + field public static final String KEY_SIP_CONFIG_PATH_HEADER_STRING = "sip_config_path_header_string"; + field public static final String KEY_SIP_CONFIG_P_ACCESS_NETWORK_INFO_HEADER_STRING = "sip_config_p_access_network_info_header_string"; + field public static final String KEY_SIP_CONFIG_P_ASSOCIATED_URI_HEADER_STRING = "sip_config_p_associated_uri_header_string"; + field public static final String KEY_SIP_CONFIG_P_LAST_ACCESS_NETWORK_INFO_HEADER_STRING = "sip_config_p_last_access_network_info_header_string"; + field public static final String KEY_SIP_CONFIG_SECURITY_VERIFY_HEADER_STRING = "sip_config_security_verify_header_string"; + field public static final String KEY_SIP_CONFIG_SERVER_DEFAULT_IPADDRESS_STRING = "sip_config_server_default_ipaddress_string"; + field public static final String KEY_SIP_CONFIG_SERVER_DEFAULT_PORT_INT = "sip_config_server_default_port_int"; + field public static final String KEY_SIP_CONFIG_SERVER_IPSEC_CLIENT_PORT_INT = "sip_config_server_ipsec_client_port_int"; + field public static final String KEY_SIP_CONFIG_SERVER_IPSEC_OLD_CLIENT_PORT_INT = "sip_config_server_ipsec_old_client_port_int"; + field public static final String KEY_SIP_CONFIG_SERVER_IPSEC_SERVER_PORT_INT = "sip_config_server_ipsec_server_port_int"; + field public static final String KEY_SIP_CONFIG_SERVICE_ROUTE_HEADER_STRING = "sip_config_service_route_header_string"; + field public static final String KEY_SIP_CONFIG_TRANSPORT_TYPE_STRING = "sip_config_protocol_type_string"; + field public static final String KEY_SIP_CONFIG_UE_DEFAULT_IPADDRESS_STRING = "sip_config_ue_default_ipaddress_string"; + field public static final String KEY_SIP_CONFIG_UE_DEFAULT_PORT_INT = "sip_config_ue_default_port_int"; + field public static final String KEY_SIP_CONFIG_UE_IPSEC_CLIENT_PORT_INT = "sip_config_ue_ipsec_client_port_int"; + field public static final String KEY_SIP_CONFIG_UE_IPSEC_OLD_CLIENT_PORT_INT = "sip_config_ue_ipsec_old_client_port_int"; + field public static final String KEY_SIP_CONFIG_UE_IPSEC_SERVER_PORT_INT = "sip_config_ue_ipsec_server_port_int"; + field public static final String KEY_SIP_CONFIG_UE_PRIVATE_USER_ID_STRING = "sip_config_ue_private_user_id_string"; + field public static final String KEY_SIP_CONFIG_UE_PUBLIC_GRUU_STRING = "sip_config_ue_public_gruu_string"; + field public static final String KEY_SIP_CONFIG_UE_PUBLIC_IPADDRESS_WITH_NAT_STRING = "sip_config_ue_public_ipaddress_with_nat_string"; + field public static final String KEY_SIP_CONFIG_UE_PUBLIC_PORT_WITH_NAT_INT = "sip_config_ue_public_port_with_nat_int"; + field public static final String KEY_SIP_CONFIG_UE_PUBLIC_USER_ID_STRING = "sip_config_ue_public_user_id_string"; + field public static final String KEY_SIP_CONFIG_URI_USER_PART_STRING = "sip_config_uri_user_part_string"; + field public static final String KEY_SIP_CONFIG_USER_AGENT_HEADER_STRING = "sip_config_sip_user_agent_header_string"; + field public static final String SIP_TRANSPORT_TCP = "TCP"; + field public static final String SIP_TRANSPORT_UDP = "UDP"; + } + + public static final class SipDelegateImsConfiguration.Builder { + ctor public SipDelegateImsConfiguration.Builder(int); + ctor public SipDelegateImsConfiguration.Builder(@NonNull android.telephony.ims.SipDelegateImsConfiguration); + method @NonNull public android.telephony.ims.SipDelegateImsConfiguration.Builder addBoolean(@NonNull String, boolean); + method @NonNull public android.telephony.ims.SipDelegateImsConfiguration.Builder addInt(@NonNull String, int); + method @NonNull public android.telephony.ims.SipDelegateImsConfiguration.Builder addString(@NonNull String, @NonNull String); + method @NonNull public android.telephony.ims.SipDelegateImsConfiguration build(); + } + +} + +package android.telephony.ims.stub { + + public interface DelegateConnectionStateCallback { + method @Deprecated public default void onImsConfigurationChanged(@NonNull android.telephony.ims.SipDelegateImsConfiguration); + } + +} + package android.view.translation { public final class UiTranslationManager { diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 8499b3739528..2f795f0e103f 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1360,10 +1360,6 @@ package android.location { method public void setType(int); } - public final class LocationDeviceConfig { - field public static final String IGNORE_SETTINGS_ALLOWLIST = "ignore_settings_allowlist"; - } - public class LocationManager { method @NonNull public String[] getBackgroundThrottlingWhitelist(); method @NonNull public android.os.PackageTagsList getIgnoreSettingsAllowlist(); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 92bdda3308e7..7149096ee806 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -73,8 +73,8 @@ import android.content.pm.IPackageManager; import android.content.pm.InstrumentationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.ApplicationInfoFlags; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ParceledListSlice; import android.content.pm.PermissionInfo; import android.content.pm.ProviderInfo; @@ -237,7 +237,6 @@ import java.util.Objects; import java.util.TimeZone; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; /** @@ -338,6 +337,11 @@ public final class ActivityThread extends ClientTransactionHandler */ @UnsupportedAppUsage final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>(); + /** + * Maps from activity token to local record of the activities that are preparing to be launched. + */ + final Map<IBinder, ActivityClientRecord> mLaunchingActivities = + Collections.synchronizedMap(new ArrayMap<IBinder, ActivityClientRecord>()); /** The activities to be truly destroyed (not include relaunch). */ final Map<IBinder, ClientTransactionItem> mActivitiesToBeDestroyed = Collections.synchronizedMap(new ArrayMap<IBinder, ClientTransactionItem>()); @@ -347,7 +351,6 @@ public final class ActivityThread extends ClientTransactionHandler // Number of activities that are currently visible on-screen. @UnsupportedAppUsage int mNumVisibleActivities = 0; - private final AtomicInteger mNumLaunchingActivities = new AtomicInteger(); @GuardedBy("mAppThread") private int mLastProcessState = PROCESS_STATE_UNKNOWN; @GuardedBy("mAppThread") @@ -1182,7 +1185,7 @@ public final class ActivityThread extends ClientTransactionHandler InetAddress.clearDnsCache(); // Allow libcore to perform the necessary actions as it sees fit upon a network // configuration change. - NetworkEventDispatcher.getInstance().onNetworkConfigurationChanged(); + NetworkEventDispatcher.getInstance().dispatchNetworkConfigurationChange(); } public void updateHttpProxy() { @@ -3256,6 +3259,21 @@ public final class ActivityThread extends ClientTransactionHandler } @Override + public void addLaunchingActivity(IBinder token, ActivityClientRecord activity) { + mLaunchingActivities.put(token, activity); + } + + @Override + public ActivityClientRecord getLaunchingActivity(IBinder token) { + return mLaunchingActivities.get(token); + } + + @Override + public void removeLaunchingActivity(IBinder token) { + mLaunchingActivities.remove(token); + } + + @Override public ActivityClientRecord getActivityClient(IBinder token) { return mActivities.get(token); } @@ -3299,7 +3317,7 @@ public final class ActivityThread extends ClientTransactionHandler // Defer the top state for VM to avoid aggressive JIT compilation affecting activity // launch time. if (processState == ActivityManager.PROCESS_STATE_TOP - && mNumLaunchingActivities.get() > 0) { + && !mLaunchingActivities.isEmpty()) { mPendingProcessState = processState; mH.postDelayed(this::applyPendingProcessState, PENDING_TOP_PROCESS_STATE_TIMEOUT); } else { @@ -3315,7 +3333,7 @@ public final class ActivityThread extends ClientTransactionHandler // Handle the pending configuration if the process state is changed from cached to // non-cached. Except the case where there is a launching activity because the // LaunchActivityItem will handle it. - if (wasCached && !isCachedProcessState() && mNumLaunchingActivities.get() == 0) { + if (wasCached && !isCachedProcessState() && mLaunchingActivities.isEmpty()) { final Configuration pendingConfig = mConfigurationController.getPendingConfiguration(false /* clearPending */); if (pendingConfig == null) { @@ -3353,11 +3371,6 @@ public final class ActivityThread extends ClientTransactionHandler } } - @Override - public void countLaunchingActivities(int num) { - mNumLaunchingActivities.getAndAdd(num); - } - @UnsupportedAppUsage public final void sendActivityResult( IBinder token, String id, int requestCode, @@ -4108,7 +4121,7 @@ public final class ActivityThread extends ClientTransactionHandler } synchronized (this) { if (mSplashScreenGlobal != null) { - mSplashScreenGlobal.dispatchOnExitAnimation(r.token, v); + mSplashScreenGlobal.handOverSplashScreenView(r.token, v); } } } @@ -6413,7 +6426,7 @@ public final class ActivityThread extends ClientTransactionHandler VMDebug.setAllocTrackerStackDepth(Integer.parseInt(property)); } if (data.trackAllocation) { - DdmVmInternal.enableRecentAllocations(true); + DdmVmInternal.setRecentAllocationsTrackingEnabled(true); } // Note when this process has started. Process.setStartTimes(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); diff --git a/core/java/android/app/ApplicationExitInfo.java b/core/java/android/app/ApplicationExitInfo.java index 4f94c9b5045b..d54452fb3004 100644 --- a/core/java/android/app/ApplicationExitInfo.java +++ b/core/java/android/app/ApplicationExitInfo.java @@ -334,6 +334,26 @@ public final class ApplicationExitInfo implements Parcelable { */ public static final int SUBREASON_CACHED_IDLE_FORCED_APP_STANDBY = 18; + /** + * The process was killed because it fails to freeze/unfreeze binder + * or query binder frozen info while being frozen. + * this would be set only when the reason is {@link #REASON_FREEZER}. + * + * For internal use only. + * @hide + */ + public static final int SUBREASON_FREEZER_BINDER_IOCTL = 19; + + /** + * The process was killed because it receives sync binder transactions + * while being frozen. + * this would be set only when the reason is {@link #REASON_FREEZER}. + * + * For internal use only. + * @hide + */ + public static final int SUBREASON_FREEZER_BINDER_TRANSACTION = 20; + // If there is any OEM code which involves additional app kill reasons, it should // be categorized in {@link #REASON_OTHER}, with subreason code starting from 1000. @@ -491,6 +511,8 @@ public final class ApplicationExitInfo implements Parcelable { SUBREASON_IMPERCEPTIBLE, SUBREASON_REMOVE_LRU, SUBREASON_ISOLATED_NOT_NEEDED, + SUBREASON_FREEZER_BINDER_IOCTL, + SUBREASON_FREEZER_BINDER_TRANSACTION, }) @Retention(RetentionPolicy.SOURCE) public @interface SubReason {} @@ -1032,6 +1054,8 @@ public final class ApplicationExitInfo implements Parcelable { pw.println(prefix + " user=" + UserHandle.getUserId(mPackageUid)); pw.println(prefix + " process=" + mProcessName); pw.println(prefix + " reason=" + mReason + " (" + reasonCodeToString(mReason) + ")"); + pw.println(prefix + " subreason=" + mSubReason + " (" + subreasonToString(mSubReason) + + ")"); pw.println(prefix + " status=" + mStatus); pw.println(prefix + " importance=" + mImportance); pw.print(prefix + " pss="); DebugUtils.printSizeValue(pw, mPss << 10); pw.println(); @@ -1055,6 +1079,8 @@ public final class ApplicationExitInfo implements Parcelable { sb.append(" process=").append(mProcessName); sb.append(" reason=").append(mReason).append(" (") .append(reasonCodeToString(mReason)).append(")"); + sb.append(" subreason=").append(mSubReason).append(" (") + .append(subreasonToString(mSubReason)).append(")"); sb.append(" status=").append(mStatus); sb.append(" importance=").append(mImportance); sb.append(" pss="); DebugUtils.sizeValueToString(mPss << 10, sb); @@ -1137,6 +1163,10 @@ public final class ApplicationExitInfo implements Parcelable { return "REMOVE LRU"; case SUBREASON_ISOLATED_NOT_NEEDED: return "ISOLATED NOT NEEDED"; + case SUBREASON_FREEZER_BINDER_IOCTL: + return "FREEZER BINDER IOCTL"; + case SUBREASON_FREEZER_BINDER_TRANSACTION: + return "FREEZER BINDER TRANSACTION"; default: return "UNKNOWN"; } diff --git a/core/java/android/app/ClientTransactionHandler.java b/core/java/android/app/ClientTransactionHandler.java index c752f34ab0bb..115101c0bff6 100644 --- a/core/java/android/app/ClientTransactionHandler.java +++ b/core/java/android/app/ClientTransactionHandler.java @@ -82,9 +82,6 @@ public abstract class ClientTransactionHandler { /** Set current process state. */ public abstract void updateProcessState(int processState, boolean fromIpc); - /** Count how many activities are launching. */ - public abstract void countLaunchingActivities(int num); - // Execute phase related logic and handlers. Methods here execute actual lifecycle transactions // and deliver callbacks. @@ -193,6 +190,26 @@ public abstract class ClientTransactionHandler { FixedRotationAdjustments fixedRotationAdjustments); /** + * Add {@link ActivityClientRecord} that is preparing to be launched. + * @param token Activity token. + * @param activity An initialized instance of {@link ActivityClientRecord} to use during launch. + */ + public abstract void addLaunchingActivity(IBinder token, ActivityClientRecord activity); + + /** + * Get {@link ActivityClientRecord} that is preparing to be launched. + * @param token Activity token. + * @return An initialized instance of {@link ActivityClientRecord} to use during launch. + */ + public abstract ActivityClientRecord getLaunchingActivity(IBinder token); + + /** + * Remove {@link ActivityClientRecord} from the launching activity list. + * @param token Activity token. + */ + public abstract void removeLaunchingActivity(IBinder token); + + /** * Get {@link android.app.ActivityThread.ActivityClientRecord} instance that corresponds to the * provided token. */ diff --git a/core/java/android/app/IUiModeManager.aidl b/core/java/android/app/IUiModeManager.aidl index 9f21bcc5f45c..440dd629c114 100644 --- a/core/java/android/app/IUiModeManager.aidl +++ b/core/java/android/app/IUiModeManager.aidl @@ -67,7 +67,6 @@ interface IUiModeManager { * 1 - notnight mode * 2 - night mode * 3 - automatic mode switching - * @throws RemoteException */ void setApplicationNightMode(in int mode); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 18651411cf13..432d99d80b89 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -22,7 +22,6 @@ import static android.graphics.drawable.Icon.TYPE_URI_ADAPTIVE_BITMAP; import static java.util.Objects.requireNonNull; -import android.annotation.AttrRes; import android.annotation.ColorInt; import android.annotation.ColorRes; import android.annotation.DimenRes; @@ -36,6 +35,7 @@ import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.StringRes; +import android.annotation.StyleableRes; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.TestApi; @@ -3314,6 +3314,19 @@ public class Notification implements Parcelable } /** + * Sets the token used for background operations for the pending intents associated with this + * notification. + * + * This token is automatically set during deserialization for you, you usually won't need to + * call this unless you want to change the existing token, if any. + * + * @hide + */ + public void setAllowlistToken(@Nullable IBinder token) { + mAllowlistToken = token; + } + + /** * @hide */ public static void addFieldsFromContext(Context context, Notification notification) { @@ -3750,19 +3763,11 @@ public class Notification implements Parcelable private boolean mIsLegacyInitialized; /** - * Caches a contrast-enhanced version of {@link #mCachedContrastColorIsFor}. - */ - private int mCachedContrastColor = COLOR_INVALID; - private int mCachedContrastColorIsFor = COLOR_INVALID; - - /** * Caches an instance of StandardTemplateParams. Note that this may have been used before, * so make sure to call {@link StandardTemplateParams#reset()} before using it. */ StandardTemplateParams mParams = new StandardTemplateParams(); - private int mTextColorsAreForBackground = COLOR_INVALID; - private int mPrimaryTextColor = COLOR_INVALID; - private int mSecondaryTextColor = COLOR_INVALID; + Colors mColors = new Colors(); private boolean mTintActionButtons; private boolean mInNightMode; @@ -4595,22 +4600,6 @@ public class Notification implements Parcelable } /** - * Set to {@code true} to require that the Notification associated with a - * foreground service is shown as soon as the service's {@code startForeground()} - * method is called, even if the system's UI policy might otherwise defer - * its visibility to a later time. - * @deprecated Use setForegroundServiceBehavior(int) instead - */ - @Deprecated - @NonNull - public Builder setShowForegroundImmediately(boolean showImmediately) { - setForegroundServiceBehavior(showImmediately - ? FOREGROUND_SERVICE_IMMEDIATE - : FOREGROUND_SERVICE_DEFAULT); - return this; - } - - /** * Specify a desired visibility policy for a Notification associated with a * foreground service. By default, the system can choose to defer * visibility of the notification for a short time after the service is @@ -5035,7 +5024,7 @@ public class Notification implements Parcelable contentView.setDrawableTint( R.id.phishing_alert, false /* targetBackground */, - getErrorColor(p), + getColors(p).getErrorColor(), PorterDuff.Mode.SRC_ATOP); } @@ -5082,8 +5071,8 @@ public class Notification implements Parcelable contentView.setDrawableTint( R.id.alerted_icon, false /* targetBackground */, - getHeaderIconColor(p), - PorterDuff.Mode.SRC_ATOP); + getColors(p).getSecondaryTextColor(), + PorterDuff.Mode.SRC_IN); } /** @@ -5211,8 +5200,7 @@ public class Notification implements Parcelable */ @VisibleForTesting public @ColorInt int getPrimaryTextColor(StandardTemplateParams p) { - ensureColors(p); - return mPrimaryTextColor; + return getColors(p).getPrimaryTextColor(); } /** @@ -5222,8 +5210,7 @@ public class Notification implements Parcelable */ @VisibleForTesting public @ColorInt int getSecondaryTextColor(StandardTemplateParams p) { - ensureColors(p); - return mSecondaryTextColor; + return getColors(p).getSecondaryTextColor(); } private void setTextViewColorSecondary(RemoteViews contentView, @IdRes int id, @@ -5231,29 +5218,9 @@ public class Notification implements Parcelable contentView.setTextColor(id, getSecondaryTextColor(p)); } - private void ensureColors(StandardTemplateParams p) { - int backgroundColor = getUnresolvedBackgroundColor(p); - if (mPrimaryTextColor == COLOR_INVALID - || mSecondaryTextColor == COLOR_INVALID - || mTextColorsAreForBackground != backgroundColor) { - mTextColorsAreForBackground = backgroundColor; - int defaultPrimaryTextColor = ContrastColorUtil.resolvePrimaryColor(mContext, - backgroundColor, mInNightMode); - int defaultSecondaryTextColor = ContrastColorUtil.resolveSecondaryColor(mContext, - backgroundColor, mInNightMode); - boolean colorized = backgroundColor != COLOR_DEFAULT; - if (colorized) { - mPrimaryTextColor = ContrastColorUtil.findAlphaToMeetContrast( - defaultPrimaryTextColor, backgroundColor, 4.5); - mSecondaryTextColor = ContrastColorUtil.findAlphaToMeetContrast( - defaultSecondaryTextColor, backgroundColor, 4.5); - } else { - mPrimaryTextColor = obtainThemeColor(R.attr.textColorPrimary, - defaultPrimaryTextColor); - mSecondaryTextColor = obtainThemeColor(R.attr.textColorSecondary, - defaultSecondaryTextColor); - } - } + private Colors getColors(StandardTemplateParams p) { + mColors.resolvePalette(mContext, mN.color, isBackgroundColorized(p), mInNightMode); + return mColors; } private void updateBackgroundColor(RemoteViews contentView, @@ -5278,7 +5245,7 @@ public class Notification implements Parcelable contentView.setProgressBar(R.id.progress, max, progress, ind); contentView.setProgressBackgroundTintList(R.id.progress, mContext.getColorStateList(R.color.notification_progress_background_color)); - ColorStateList progressTint = ColorStateList.valueOf(getAccentColor(p)); + ColorStateList progressTint = ColorStateList.valueOf(getPrimaryAccentColor(p)); contentView.setProgressTintList(R.id.progress, progressTint); contentView.setProgressIndeterminateTintList(R.id.progress, progressTint); return true; @@ -5412,13 +5379,13 @@ public class Notification implements Parcelable private void bindExpandButton(RemoteViews contentView, StandardTemplateParams p) { // set default colors int textColor = getPrimaryTextColor(p); - int pillColor = getProtectionColor(p); + int pillColor = getColors(p).getProtectionColor(); contentView.setInt(R.id.expand_button, "setDefaultTextColor", textColor); contentView.setInt(R.id.expand_button, "setDefaultPillColor", pillColor); // Use different highlighted colors for conversations' unread count if (p.mHighlightExpander) { textColor = getBackgroundColor(p); - pillColor = getAccentColor(p); + pillColor = getPrimaryAccentColor(p); } contentView.setInt(R.id.expand_button, "setHighlightTextColor", textColor); contentView.setInt(R.id.expand_button, "setHighlightPillColor", pillColor); @@ -5731,7 +5698,7 @@ public class Notification implements Parcelable showSpinner ? View.VISIBLE : View.GONE); big.setProgressIndeterminateTintList( R.id.notification_material_reply_progress, - ColorStateList.valueOf(getAccentColor(p))); + ColorStateList.valueOf(getPrimaryAccentColor(p))); if (replyText.length > 1 && !TextUtils.isEmpty(replyText[1].getText()) && p.maxRemoteInputHistory > 1) { @@ -6126,7 +6093,7 @@ public class Notification implements Parcelable // change the background bgColor CharSequence title = action.title; ColorStateList[] outResultColor = new ColorStateList[1]; - int background = getSecondaryAccentColor(p); + int background = getColors(p).getSecondaryAccentColor(); if (isLegacy()) { title = ContrastColorUtil.clearColorSpans(title); } else { @@ -6286,7 +6253,7 @@ public class Notification implements Parcelable if (largeIcon != null && isLegacy() && getColorUtil().isGrayscaleIcon(mContext, largeIcon)) { // resolve color will fall back to the default when legacy - int color = getContrastColor(p); + int color = getSmallIconColor(p); contentView.setInt(R.id.icon, "setOriginalIconColor", color); } } @@ -6302,14 +6269,7 @@ public class Notification implements Parcelable */ private @ColorInt int getStandardActionColor(Notification.StandardTemplateParams p) { return mTintActionButtons || isBackgroundColorized(p) - ? getAccentColor(p) : getNeutralColor(p); - } - - /** - * Gets a neutral color that can be used for icons or similar that should not stand out. - */ - private @ColorInt int getHeaderIconColor(StandardTemplateParams p) { - return isBackgroundColorized(p) ? getSecondaryTextColor(p) : getNeutralColor(p); + ? getPrimaryAccentColor(p) : getSecondaryTextColor(p); } /** @@ -6317,134 +6277,12 @@ public class Notification implements Parcelable * is the primary text color, otherwise it's the contrast-adjusted app-provided color. */ private @ColorInt int getSmallIconColor(StandardTemplateParams p) { - return getContrastColor(p); - } - - /** - * Gets the accent color for colored UI elements. If we're tinting with the theme - * accent, this is the theme accent color, otherwise this would be identical to - * {@link #getSmallIconColor(StandardTemplateParams)}. - */ - private @ColorInt int getAccentColor(StandardTemplateParams p) { - if (isBackgroundColorized(p)) { - return getPrimaryTextColor(p); - } - int color = obtainThemeColor(R.attr.colorAccent, COLOR_INVALID); - if (color != COLOR_INVALID) { - return color; - } - return getContrastColor(p); + return getColors(p).getContrastColor(); } - /** - * Gets the secondary accent color for colored UI elements. If we're tinting with the theme - * accent, this is the theme accent color, otherwise this would be identical to - * {@link #getSmallIconColor(StandardTemplateParams)}. - */ - private @ColorInt int getSecondaryAccentColor(StandardTemplateParams p) { - if (isBackgroundColorized(p)) { - return getSecondaryTextColor(p); - } - int color = obtainThemeColor(R.attr.colorAccentSecondary, COLOR_INVALID); - if (color != COLOR_INVALID) { - return color; - } - return getContrastColor(p); - } - - /** - * Gets the "surface protection" color from the theme, or a variant of the normal background - * color when colorized, or when not using theme color tints. - */ - private @ColorInt int getProtectionColor(StandardTemplateParams p) { - if (!isBackgroundColorized(p)) { - int color = obtainThemeColor(R.attr.colorBackgroundFloating, COLOR_INVALID); - if (color != COLOR_INVALID) { - return color; - } - } - // TODO(b/181048615): What color should we use for the expander pill when colorized - return ColorUtils.blendARGB(getPrimaryTextColor(p), getBackgroundColor(p), 0.8f); - } - - /** - * Gets the theme's error color, or the primary text color for colorized notifications. - */ - private @ColorInt int getErrorColor(StandardTemplateParams p) { - if (!isBackgroundColorized(p)) { - int color = obtainThemeColor(R.attr.colorError, COLOR_INVALID); - if (color != COLOR_INVALID) { - return color; - } - } - return getPrimaryTextColor(p); - } - - /** - * Gets the theme's background color - */ - private @ColorInt int getDefaultBackgroundColor() { - return obtainThemeColor(R.attr.colorSurface, - mInNightMode ? Color.BLACK : Color.WHITE); - } - - /** - * Gets the contrast-adjusted version of the color provided by the app. - */ - private @ColorInt int getContrastColor(StandardTemplateParams p) { - if (isBackgroundColorized(p)) { - return getPrimaryTextColor(p); - } - int rawColor = getRawColor(p); - if (mCachedContrastColorIsFor == rawColor && mCachedContrastColor != COLOR_INVALID) { - return mCachedContrastColor; - } - - int color; - // TODO: Maybe use getBackgroundColor(p) instead -- but doing so could break the cache - int background = getDefaultBackgroundColor(); - if (rawColor == COLOR_DEFAULT) { - ensureColors(p); - color = obtainThemeColor(R.attr.colorAccent, COLOR_INVALID); - if (color == COLOR_INVALID) { - color = ContrastColorUtil.resolveDefaultColor(mContext, background, - mInNightMode); - } - } else { - color = ContrastColorUtil.resolveContrastColor(mContext, rawColor, - background, mInNightMode); - } - if (Color.alpha(color) < 255) { - // alpha doesn't go well for color filters, so let's blend it manually - color = ContrastColorUtil.compositeColors(color, background); - } - mCachedContrastColorIsFor = rawColor; - return mCachedContrastColor = color; - } - - /** - * Return the raw color of this Notification, which doesn't necessarily satisfy contrast. - * - * @see #getContrastColor(StandardTemplateParams) for the contrasted color - * @param p the template params to inflate this with - */ - private @ColorInt int getRawColor(StandardTemplateParams p) { - return mN.color; - } - - /** - * Gets a neutral palette color; this is a contrast-satisfied version of the default color. - * @param p the template params to inflate this with - */ - private @ColorInt int getNeutralColor(StandardTemplateParams p) { - int background = getBackgroundColor(p); - int neutralColor = ContrastColorUtil.resolveDefaultColor(mContext, background, - mInNightMode); - if (Color.alpha(neutralColor) < 255) { - // alpha doesn't go well for color filters, so let's blend it manually - neutralColor = ContrastColorUtil.compositeColors(neutralColor, background); - } - return neutralColor; + /** @return the theme's accent color for colored UI elements. */ + private @ColorInt int getPrimaryAccentColor(StandardTemplateParams p) { + return getColors(p).getPrimaryAccentColor(); } /** @@ -6590,23 +6428,6 @@ public class Notification implements Parcelable } /** - * Returns the color for the given Theme.DeviceDefault.DayNight attribute, or - * defValue if that could not be completed - */ - private @ColorInt int obtainThemeColor(@AttrRes int attrRes, @ColorInt int defaultColor) { - Resources.Theme theme = mContext.getTheme(); - if (theme == null) { - // Running unit tests with mocked context - return defaultColor; - } - theme = new ContextThemeWrapper(mContext, R.style.Theme_DeviceDefault_DayNight) - .getTheme(); - try (TypedArray ta = theme.obtainStyledAttributes(new int[]{attrRes})) { - return ta == null ? defaultColor : ta.getColor(0, defaultColor); - } - } - - /** * Apply this Builder to an existing {@link Notification} object. * * @hide @@ -6716,24 +6537,8 @@ public class Notification implements Parcelable return R.layout.notification_material_action_tombstone; } - /** - * Gets the background color, with {@link #COLOR_DEFAULT} being a valid return value, - * which must be resolved by the caller before being used. - */ - private @ColorInt int getUnresolvedBackgroundColor(StandardTemplateParams p) { - return isBackgroundColorized(p) ? getRawColor(p) : COLOR_DEFAULT; - } - - /** - * Same as {@link #getUnresolvedBackgroundColor(StandardTemplateParams)} except that it - * also resolves the default color to the background. - */ private @ColorInt int getBackgroundColor(StandardTemplateParams p) { - int backgroundColor = getUnresolvedBackgroundColor(p); - if (backgroundColor == COLOR_DEFAULT) { - backgroundColor = getDefaultBackgroundColor(); - } - return backgroundColor; + return getColors(p).getBackgroundColor(); } private boolean textColorsNeedInversion() { @@ -9115,8 +8920,7 @@ public class Notification implements Parcelable container.setDrawableTint(buttonId, false, tintColor, PorterDuff.Mode.SRC_ATOP); - int rippleAlpha = Color.alpha(mBuilder.obtainThemeColor( - android.R.attr.colorControlHighlight, COLOR_DEFAULT)); + int rippleAlpha = mBuilder.getColors(p).getRippleAlpha(); int rippleColor = Color.argb(rippleAlpha, Color.red(tintColor), Color.green(tintColor), Color.blue(tintColor)); container.setRippleDrawableColor(buttonId, ColorStateList.valueOf(rippleColor)); @@ -12447,4 +12251,219 @@ public class Notification implements Parcelable return this; } } + + /** + * A utility which stores and calculates the palette of colors used to color notifications. + * @hide + */ + @VisibleForTesting + public static class Colors { + private int mPaletteIsForRawColor = COLOR_INVALID; + private boolean mPaletteIsForColorized = false; + private boolean mPaletteIsForNightMode = false; + // The following colors are the palette + private int mBackgroundColor = COLOR_INVALID; + private int mProtectionColor = COLOR_INVALID; + private int mPrimaryTextColor = COLOR_INVALID; + private int mSecondaryTextColor = COLOR_INVALID; + private int mPrimaryAccentColor = COLOR_INVALID; + private int mSecondaryAccentColor = COLOR_INVALID; + private int mErrorColor = COLOR_INVALID; + private int mContrastColor = COLOR_INVALID; + private int mRippleAlpha = 0x33; + + /** + * A utility for obtaining a TypedArray of the given DayNight-styled attributes, which + * returns null when the context is a mock with no theme. + * + * NOTE: Calling this method is expensive, as creating a new ContextThemeWrapper + * instances can allocate as much as 5MB of memory, so its important to call this method + * only when necessary, getting as many attributes as possible from each call. + * + * @see Resources.Theme#obtainStyledAttributes(int[]) + */ + @Nullable + private static TypedArray obtainDayNightAttributes(@NonNull Context ctx, + @NonNull @StyleableRes int[] attrs) { + // when testing, the mock context may have no theme + if (ctx.getTheme() == null) { + return null; + } + Resources.Theme theme = new ContextThemeWrapper(ctx, + R.style.Theme_DeviceDefault_DayNight).getTheme(); + return theme.obtainStyledAttributes(attrs); + } + + /** A null-safe wrapper of TypedArray.getColor because mocks return null */ + private static @ColorInt int getColor(@Nullable TypedArray ta, int index, + @ColorInt int defValue) { + return ta == null ? defValue : ta.getColor(index, defValue); + } + + /** + * Resolve the palette. If the inputs have not changed, this will be a no-op. + * This does not handle invalidating the resolved colors when the context itself changes, + * because that case does not happen in the current notification inflation pipeline; we will + * recreate a new builder (and thus a new palette) when reinflating notifications for a new + * theme (admittedly, we do the same for night mode, but that's easy to check). + * + * @param ctx the builder context. + * @param rawColor the notification's color; may be COLOR_DEFAULT, but may never have alpha. + * @param isColorized whether the notification is colorized. + * @param nightMode whether the UI is in night mode. + */ + public void resolvePalette(Context ctx, int rawColor, + boolean isColorized, boolean nightMode) { + if (mPaletteIsForRawColor == rawColor + && mPaletteIsForColorized == isColorized + && mPaletteIsForNightMode == nightMode) { + return; + } + mPaletteIsForRawColor = rawColor; + mPaletteIsForColorized = isColorized; + mPaletteIsForNightMode = nightMode; + + if (isColorized) { + if (rawColor == COLOR_DEFAULT) { + int[] attrs = {R.attr.colorAccentTertiary}; + try (TypedArray ta = obtainDayNightAttributes(ctx, attrs)) { + mBackgroundColor = getColor(ta, 0, Color.WHITE); + } + } else { + mBackgroundColor = rawColor; + } + mProtectionColor = COLOR_INVALID; // filled in at the end + mPrimaryTextColor = ContrastColorUtil.findAlphaToMeetContrast( + ContrastColorUtil.resolvePrimaryColor(ctx, mBackgroundColor, nightMode), + mBackgroundColor, 4.5); + mSecondaryTextColor = ContrastColorUtil.findAlphaToMeetContrast( + ContrastColorUtil.resolveSecondaryColor(ctx, mBackgroundColor, nightMode), + mBackgroundColor, 4.5); + mContrastColor = mPrimaryTextColor; + mPrimaryAccentColor = mPrimaryTextColor; + mSecondaryAccentColor = mSecondaryTextColor; + mErrorColor = mPrimaryTextColor; + mRippleAlpha = 0x33; + } else { + int[] attrs = { + R.attr.colorBackground, + R.attr.colorBackgroundFloating, + R.attr.textColorPrimary, + R.attr.textColorSecondary, + R.attr.colorAccent, + R.attr.colorAccentSecondary, + R.attr.colorError, + R.attr.colorControlHighlight + }; + try (TypedArray ta = obtainDayNightAttributes(ctx, attrs)) { + mBackgroundColor = getColor(ta, 0, nightMode ? Color.BLACK : Color.WHITE); + mProtectionColor = getColor(ta, 1, COLOR_INVALID); + mPrimaryTextColor = getColor(ta, 2, COLOR_INVALID); + mSecondaryTextColor = getColor(ta, 3, COLOR_INVALID); + mPrimaryAccentColor = getColor(ta, 4, COLOR_INVALID); + mSecondaryAccentColor = getColor(ta, 5, COLOR_INVALID); + mErrorColor = getColor(ta, 6, COLOR_INVALID); + mRippleAlpha = Color.alpha(getColor(ta, 7, 0x33ffffff)); + } + mContrastColor = calculateContrastColor(ctx, rawColor, mPrimaryAccentColor, + mBackgroundColor, nightMode); + + // make sure every color has a valid value + if (mPrimaryTextColor == COLOR_INVALID) { + mPrimaryTextColor = ContrastColorUtil.resolvePrimaryColor( + ctx, mBackgroundColor, nightMode); + } + if (mSecondaryTextColor == COLOR_INVALID) { + mSecondaryTextColor = ContrastColorUtil.resolveSecondaryColor( + ctx, mBackgroundColor, nightMode); + } + if (mPrimaryAccentColor == COLOR_INVALID) { + mPrimaryAccentColor = mContrastColor; + } + if (mSecondaryAccentColor == COLOR_INVALID) { + mSecondaryAccentColor = mContrastColor; + } + if (mErrorColor == COLOR_INVALID) { + mErrorColor = mPrimaryTextColor; + } + } + // make sure every color has a valid value + if (mProtectionColor == COLOR_INVALID) { + mProtectionColor = ColorUtils.blendARGB(mPrimaryTextColor, mBackgroundColor, 0.8f); + } + } + + /** calculates the contrast color for the non-colorized notifications */ + private static @ColorInt int calculateContrastColor(Context ctx, @ColorInt int rawColor, + @ColorInt int accentColor, @ColorInt int backgroundColor, boolean nightMode) { + int color; + if (rawColor == COLOR_DEFAULT) { + color = accentColor; + if (color == COLOR_INVALID) { + color = ContrastColorUtil.resolveDefaultColor(ctx, backgroundColor, nightMode); + } + } else { + color = ContrastColorUtil.resolveContrastColor(ctx, rawColor, backgroundColor, + nightMode); + } + return flattenAlpha(color, backgroundColor); + } + + /** remove any alpha by manually blending it with the given background. */ + private static @ColorInt int flattenAlpha(@ColorInt int color, @ColorInt int background) { + return Color.alpha(color) == 0xff ? color + : ContrastColorUtil.compositeColors(color, background); + } + + /** @return the notification's background color */ + public @ColorInt int getBackgroundColor() { + return mBackgroundColor; + } + + /** + * @return the "surface protection" color from the theme, + * or a variant of the normal background color when colorized. + */ + public @ColorInt int getProtectionColor() { + return mProtectionColor; + } + + /** @return the color for the most prominent text */ + public @ColorInt int getPrimaryTextColor() { + return mPrimaryTextColor; + } + + /** @return the color for less prominent text */ + public @ColorInt int getSecondaryTextColor() { + return mSecondaryTextColor; + } + + /** @return the theme's accent color for colored UI elements. */ + public @ColorInt int getPrimaryAccentColor() { + return mPrimaryAccentColor; + } + + /** @return the theme's secondary accent color for colored UI elements. */ + public @ColorInt int getSecondaryAccentColor() { + return mSecondaryAccentColor; + } + + /** + * @return the contrast-adjusted version of the color provided by the app, or the + * primary text color when colorized. + */ + public @ColorInt int getContrastColor() { + return mContrastColor; + } + + /** @return the theme's error color, or the primary text color when colorized. */ + public @ColorInt int getErrorColor() { + return mErrorColor; + } + + /** @return the alpha component of the current theme's control highlight color. */ + public int getRippleAlpha() { + return mRippleAlpha; + } + } } diff --git a/core/java/android/app/WallpaperColors.java b/core/java/android/app/WallpaperColors.java index be62deb7696d..edd60473c522 100644 --- a/core/java/android/app/WallpaperColors.java +++ b/core/java/android/app/WallpaperColors.java @@ -101,7 +101,7 @@ public final class WallpaperColors implements Parcelable { // We also check if the image has dark pixels in it, // to avoid bright images with some dark spots. private static final float DARK_PIXEL_CONTRAST = 5.5f; - private static final float MAX_DARK_AREA = 0.025f; + private static final float MAX_DARK_AREA = 0.05f; private final List<Color> mMainColors; private final Map<Integer, Integer> mAllColors; diff --git a/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java b/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java index d5585db08994..032b57e65458 100644 --- a/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java +++ b/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java @@ -40,7 +40,8 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem { @Override public void preExecute(android.app.ClientTransactionHandler client, IBinder token) { - final ActivityClientRecord r = getActivityClientRecord(client, token); + final ActivityClientRecord r = getActivityClientRecord(client, token, + true /* includeLaunching */); // Notify the client of an upcoming change in the token configuration. This ensures that // batches of config change items only process the newest configuration. client.updatePendingActivityConfiguration(r, mConfiguration); diff --git a/core/java/android/app/servertransaction/ActivityTransactionItem.java b/core/java/android/app/servertransaction/ActivityTransactionItem.java index f7d7e9d20ab9..a539812fa8c6 100644 --- a/core/java/android/app/servertransaction/ActivityTransactionItem.java +++ b/core/java/android/app/servertransaction/ActivityTransactionItem.java @@ -55,15 +55,40 @@ public abstract class ActivityTransactionItem extends ClientTransactionItem { @NonNull ActivityClientRecord getActivityClientRecord( @NonNull ClientTransactionHandler client, IBinder token) { - final ActivityClientRecord r = client.getActivityClient(token); + return getActivityClientRecord(client, token, false /* includeLaunching */); + } + + /** + * Get the {@link ActivityClientRecord} instance that corresponds to the provided token. + * @param client Target client handler. + * @param token Target activity token. + * @param includeLaunching Indicate to also find the {@link ActivityClientRecord} in launching + * activity list. It should be noted that there is no activity in + * {@link ActivityClientRecord} from the launching activity list. + * @return The {@link ActivityClientRecord} instance that corresponds to the provided token. + */ + @NonNull ActivityClientRecord getActivityClientRecord( + @NonNull ClientTransactionHandler client, IBinder token, boolean includeLaunching) { + ActivityClientRecord r = client.getActivityClient(token); + if (r != null) { + if (client.getActivity(token) == null) { + throw new IllegalArgumentException("Activity must not be null to execute " + + "transaction item"); + } + return r; + } + // The activity may not be launched yet. Fallback to check launching activity. + if (includeLaunching) { + r = client.getLaunchingActivity(token); + } if (r == null) { throw new IllegalArgumentException("Activity client record must not be null to execute " + "transaction item"); } - if (client.getActivity(token) == null) { - throw new IllegalArgumentException("Activity must not be null to execute " - + "transaction item"); - } + + // We don't need to check the activity of launching activity client records because they + // have not been launched yet. + return r; } } diff --git a/core/java/android/app/servertransaction/LaunchActivityItem.java b/core/java/android/app/servertransaction/LaunchActivityItem.java index e281a0268184..34e4fcdb9140 100644 --- a/core/java/android/app/servertransaction/LaunchActivityItem.java +++ b/core/java/android/app/servertransaction/LaunchActivityItem.java @@ -82,7 +82,12 @@ public class LaunchActivityItem extends ClientTransactionItem { @Override public void preExecute(ClientTransactionHandler client, IBinder token) { - client.countLaunchingActivities(1); + ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo, + mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState, + mPendingResults, mPendingNewIntents, mActivityOptions, mIsForward, mProfilerInfo, + client, mAssistToken, mFixedRotationAdjustments, mShareableActivityToken, + mLaunchedFromBubble); + client.addLaunchingActivity(token, r); client.updateProcessState(mProcState, false); client.updatePendingConfiguration(mCurConfig); if (mActivityClientController != null) { @@ -94,11 +99,7 @@ public class LaunchActivityItem extends ClientTransactionItem { public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStart"); - ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo, - mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState, - mPendingResults, mPendingNewIntents, mActivityOptions, mIsForward, mProfilerInfo, - client, mAssistToken, mFixedRotationAdjustments, mShareableActivityToken, - mLaunchedFromBubble); + ActivityClientRecord r = client.getLaunchingActivity(token); client.handleLaunchActivity(r, pendingActions, null /* customIntent */); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } @@ -106,7 +107,7 @@ public class LaunchActivityItem extends ClientTransactionItem { @Override public void postExecute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { - client.countLaunchingActivities(-1); + client.removeLaunchingActivity(token); } diff --git a/core/java/android/app/servertransaction/MoveToDisplayItem.java b/core/java/android/app/servertransaction/MoveToDisplayItem.java index 944367e304e6..4b8a3476262e 100644 --- a/core/java/android/app/servertransaction/MoveToDisplayItem.java +++ b/core/java/android/app/servertransaction/MoveToDisplayItem.java @@ -40,7 +40,8 @@ public class MoveToDisplayItem extends ActivityTransactionItem { @Override public void preExecute(ClientTransactionHandler client, IBinder token) { - final ActivityClientRecord r = getActivityClientRecord(client, token); + final ActivityClientRecord r = getActivityClientRecord(client, token, + true /* includeLaunching */); // Notify the client of an upcoming change in the token configuration. This ensures that // batches of config change items only process the newest configuration. client.updatePendingActivityConfiguration(r, mConfiguration); diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index fc676cf5b9c2..886cd7f48d35 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -400,10 +400,7 @@ public abstract class Context { public static final int BIND_BYPASS_POWER_NETWORK_RESTRICTIONS = 0x00020000; /** - * Flag for {@link #bindService}: allow background foreground service starts from the bound - * service's process. - * This flag is only respected if the caller is holding - * {@link android.Manifest.permission#START_FOREGROUND_SERVICES_FROM_BACKGROUND}. + * Do not use. This flag is no longer needed nor used. * @hide */ @SystemApi diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index a436fa48a5f2..688483a5c969 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -1983,7 +1983,7 @@ public class Intent implements Parcelable, Cloneable { * activities that are not properly protected. * * <p> - * Input: {@link android.Manifest.permission_group} specifies the permission group + * Input: {@link #EXTRA_PERMISSION_GROUP_NAME} specifies the permission group * for which the launched UI would be targeted. * </p> * <p> @@ -2013,12 +2013,12 @@ public class Intent implements Parcelable, Cloneable { * Input: {@link #EXTRA_ATTRIBUTION_TAGS} specifies the attribution tags for the usage entry. * </p> * <p> - * Input: {@link #EXTRA_START_TIME} specifies the start time of the period. Both start time and - * end time are needed and start time must be <= end time. + * Input: {@link #EXTRA_START_TIME} specifies the start time of the period (epoch time in + * millis). Both start time and end time are needed and start time must be <= end time. * </p> * <p> - * Input: {@link #EXTRA_END_TIME} specifies the end time of the period. Both start time and end - * time are needed and start time must be <= end time. + * Input: {@link #EXTRA_END_TIME} specifies the end time of the period (epoch time in + * millis). Both start time and end time are needed and start time must be <= end time. * </p> * <p> * Output: Nothing. diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 33606e855220..33a34be1b968 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -4672,27 +4672,27 @@ public abstract class PackageManager { @PermissionGroupInfoFlags int flags); /** - * Get the platform permissions which belong to a particular permission group. + * Get the platform-defined permissions which belong to a particular permission group. * - * @param permissionGroupName The permission group whose permissions are desired - * @param executor Executor on which to invoke the callback - * @param callback A callback which will receive a list of the platform permissions in the - * group, or empty if the group is not a valid platform group, or there - * was an exception. + * @param permissionGroupName the permission group whose permissions are desired + * @param executor the {@link Executor} on which to invoke the callback + * @param callback the callback which will receive a list of the platform-defined permissions in + * the group, or empty if the group is not a valid platform-defined permission + * group, or there was an exception */ public void getPlatformPermissionsForGroup(@NonNull String permissionGroupName, @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<List<String>> callback) {} /** - * Get the platform group of a particular permission, if the permission is a platform - * permission. + * Get the platform-defined permission group of a particular permission, if the permission is a + * platform-defined permission. * - * @param permissionName The permission name whose group is desired - * @param executor Executor on which to invoke the callback - * @param callback A callback which will receive the name of the permission group this - * permission belongs to, or null if it has no group, is not a platform - * permission, or there was an exception. + * @param permissionName the permission whose group is desired + * @param executor the {@link Executor} on which to invoke the callback + * @param callback the callback which will receive the name of the permission group this + * permission belongs to, or {@code null} if it has no group, is not a + * platform-defined permission, or there was an exception */ public void getGroupOfPlatformPermission(@NonNull String permissionName, @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<String> callback) {} diff --git a/core/java/android/ddm/DdmHandle.java b/core/java/android/ddm/DdmHandle.java new file mode 100644 index 000000000000..0505feea9081 --- /dev/null +++ b/core/java/android/ddm/DdmHandle.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2021 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.ddm; + +import org.apache.harmony.dalvik.ddmc.ChunkHandler; + +import java.nio.ByteBuffer; + +/** + * Contains utility methods for chunk serialization and deserialization. + */ +public abstract class DdmHandle extends ChunkHandler { + + /** + * Utility function to copy a String out of a ByteBuffer. + * + * This is here because multiple chunk handlers can make use of it, + * and there's nowhere better to put it. + */ + public static String getString(ByteBuffer buf, int len) { + char[] data = new char[len]; + for (int i = 0; i < len; i++) { + data[i] = buf.getChar(); + } + return new String(data); + } + + /** + * Utility function to copy a String into a ByteBuffer. + */ + public static void putString(ByteBuffer buf, String str) { + int len = str.length(); + for (int i = 0; i < len; i++) { + buf.putChar(str.charAt(i)); + } + } + +} diff --git a/core/java/android/ddm/DdmHandleAppName.java b/core/java/android/ddm/DdmHandleAppName.java index 35da062329b3..e19f19f8fe8c 100644 --- a/core/java/android/ddm/DdmHandleAppName.java +++ b/core/java/android/ddm/DdmHandleAppName.java @@ -30,9 +30,9 @@ import java.nio.ByteBuffer; /** * Track our app name. We don't (currently) handle any inbound packets. */ -public class DdmHandleAppName extends ChunkHandler { +public class DdmHandleAppName extends DdmHandle { - public static final int CHUNK_APNM = type("APNM"); + public static final int CHUNK_APNM = ChunkHandler.type("APNM"); private static volatile Names sNames = new Names("", ""); @@ -51,13 +51,13 @@ public class DdmHandleAppName extends ChunkHandler { * Called when the DDM server connects. The handler is allowed to * send messages to the server. */ - public void connected() {} + public void onConnected() {} /** * Called when the DDM server disconnects. Can be used to disable * periodic transmissions or clean up saved state. */ - public void disconnected() {} + public void onDisconnected() {} /** * Handle a chunk of data. diff --git a/core/java/android/ddm/DdmHandleExit.java b/core/java/android/ddm/DdmHandleExit.java index 74ae37a42f56..a9e3d1607729 100644 --- a/core/java/android/ddm/DdmHandleExit.java +++ b/core/java/android/ddm/DdmHandleExit.java @@ -16,18 +16,20 @@ package android.ddm; +import android.util.Log; + import org.apache.harmony.dalvik.ddmc.Chunk; import org.apache.harmony.dalvik.ddmc.ChunkHandler; import org.apache.harmony.dalvik.ddmc.DdmServer; -import android.util.Log; + import java.nio.ByteBuffer; /** * Handle an EXIT chunk. */ -public class DdmHandleExit extends ChunkHandler { +public class DdmHandleExit extends DdmHandle { - public static final int CHUNK_EXIT = type("EXIT"); + public static final int CHUNK_EXIT = ChunkHandler.type("EXIT"); private static DdmHandleExit mInstance = new DdmHandleExit(); @@ -46,13 +48,13 @@ public class DdmHandleExit extends ChunkHandler { * Called when the DDM server connects. The handler is allowed to * send messages to the server. */ - public void connected() {} + public void onConnected() {} /** * Called when the DDM server disconnects. Can be used to disable * periodic transmissions or clean up saved state. */ - public void disconnected() {} + public void onDisconnected() {} /** * Handle a chunk of data. We're only registered for "EXIT". diff --git a/core/java/android/ddm/DdmHandleHeap.java b/core/java/android/ddm/DdmHandleHeap.java index 8fa235294451..2edb5c70cdf2 100644 --- a/core/java/android/ddm/DdmHandleHeap.java +++ b/core/java/android/ddm/DdmHandleHeap.java @@ -16,21 +16,18 @@ package android.ddm; +import android.util.Log; + import org.apache.harmony.dalvik.ddmc.Chunk; import org.apache.harmony.dalvik.ddmc.ChunkHandler; import org.apache.harmony.dalvik.ddmc.DdmServer; -import org.apache.harmony.dalvik.ddmc.DdmVmInternal; -import android.os.Debug; -import android.util.Log; -import java.io.IOException; -import java.nio.ByteBuffer; /** * Handle native and virtual heap requests. */ -public class DdmHandleHeap extends ChunkHandler { +public class DdmHandleHeap extends DdmHandle { - public static final int CHUNK_HPGC = type("HPGC"); + public static final int CHUNK_HPGC = ChunkHandler.type("HPGC"); private static DdmHandleHeap mInstance = new DdmHandleHeap(); @@ -49,13 +46,13 @@ public class DdmHandleHeap extends ChunkHandler { * Called when the DDM server connects. The handler is allowed to * send messages to the server. */ - public void connected() {} + public void onConnected() {} /** * Called when the DDM server disconnects. Can be used to disable * periodic transmissions or clean up saved state. */ - public void disconnected() {} + public void onDisconnected() {} /** * Handle a chunk of data. @@ -68,8 +65,7 @@ public class DdmHandleHeap extends ChunkHandler { if (type == CHUNK_HPGC) { return handleHPGC(request); } else { - throw new RuntimeException("Unknown packet " - + ChunkHandler.name(type)); + throw new RuntimeException("Unknown packet " + name(type)); } } diff --git a/core/java/android/ddm/DdmHandleHello.java b/core/java/android/ddm/DdmHandleHello.java index 60dfc8d7ee7b..41600294bfb5 100644 --- a/core/java/android/ddm/DdmHandleHello.java +++ b/core/java/android/ddm/DdmHandleHello.java @@ -31,11 +31,11 @@ import java.nio.ByteBuffer; /** * Handle "hello" messages and feature discovery. */ -public class DdmHandleHello extends ChunkHandler { +public class DdmHandleHello extends DdmHandle { - public static final int CHUNK_HELO = type("HELO"); - public static final int CHUNK_WAIT = type("WAIT"); - public static final int CHUNK_FEAT = type("FEAT"); + public static final int CHUNK_HELO = ChunkHandler.type("HELO"); + public static final int CHUNK_WAIT = ChunkHandler.type("WAIT"); + public static final int CHUNK_FEAT = ChunkHandler.type("FEAT"); private static final int CLIENT_PROTOCOL_VERSION = 1; @@ -61,15 +61,14 @@ public class DdmHandleHello extends ChunkHandler { * Called when the DDM server connects. The handler is allowed to * send messages to the server. */ - public void connected() { + public void onConnected() { if (false) Log.v("ddm-hello", "Connected!"); if (false) { /* test spontaneous transmission */ byte[] data = new byte[] { 0, 1, 2, 3, 4, -4, -3, -2, -1, 127 }; - Chunk testChunk = - new Chunk(ChunkHandler.type("TEST"), data, 1, data.length-2); + Chunk testChunk = new Chunk(ChunkHandler.type("TEST"), data, 1, data.length - 2); DdmServer.sendChunk(testChunk); } } @@ -78,7 +77,7 @@ public class DdmHandleHello extends ChunkHandler { * Called when the DDM server disconnects. Can be used to disable * periodic transmissions or clean up saved state. */ - public void disconnected() { + public void onDisconnected() { if (false) Log.v("ddm-hello", "Disconnected!"); } @@ -96,8 +95,7 @@ public class DdmHandleHello extends ChunkHandler { } else if (type == CHUNK_FEAT) { return handleFEAT(request); } else { - throw new RuntimeException("Unknown packet " - + ChunkHandler.name(type)); + throw new RuntimeException("Unknown packet " + name(type)); } } diff --git a/core/java/android/ddm/DdmHandleNativeHeap.java b/core/java/android/ddm/DdmHandleNativeHeap.java index 775c57027f78..dfd451c3ab4e 100644 --- a/core/java/android/ddm/DdmHandleNativeHeap.java +++ b/core/java/android/ddm/DdmHandleNativeHeap.java @@ -16,17 +16,18 @@ package android.ddm; +import android.util.Log; + import org.apache.harmony.dalvik.ddmc.Chunk; import org.apache.harmony.dalvik.ddmc.ChunkHandler; import org.apache.harmony.dalvik.ddmc.DdmServer; -import android.util.Log; /** * Handle thread-related traffic. */ -public class DdmHandleNativeHeap extends ChunkHandler { +public class DdmHandleNativeHeap extends DdmHandle { - public static final int CHUNK_NHGT = type("NHGT"); + public static final int CHUNK_NHGT = ChunkHandler.type("NHGT"); private static DdmHandleNativeHeap mInstance = new DdmHandleNativeHeap(); @@ -45,13 +46,13 @@ public class DdmHandleNativeHeap extends ChunkHandler { * Called when the DDM server connects. The handler is allowed to * send messages to the server. */ - public void connected() {} + public void onConnected() {} /** * Called when the DDM server disconnects. Can be used to disable * periodic transmissions or clean up saved state. */ - public void disconnected() {} + public void onDisconnected() {} /** * Handle a chunk of data. @@ -63,8 +64,7 @@ public class DdmHandleNativeHeap extends ChunkHandler { if (type == CHUNK_NHGT) { return handleNHGT(request); } else { - throw new RuntimeException("Unknown packet " - + ChunkHandler.name(type)); + throw new RuntimeException("Unknown packet " + name(type)); } } diff --git a/core/java/android/ddm/DdmHandleProfiling.java b/core/java/android/ddm/DdmHandleProfiling.java index cce4dd2005a8..806e4bd96f9c 100644 --- a/core/java/android/ddm/DdmHandleProfiling.java +++ b/core/java/android/ddm/DdmHandleProfiling.java @@ -16,25 +16,28 @@ package android.ddm; + +import android.os.Debug; +import android.util.Log; + import org.apache.harmony.dalvik.ddmc.Chunk; import org.apache.harmony.dalvik.ddmc.ChunkHandler; import org.apache.harmony.dalvik.ddmc.DdmServer; -import android.os.Debug; -import android.util.Log; + import java.nio.ByteBuffer; /** * Handle profiling requests. */ -public class DdmHandleProfiling extends ChunkHandler { +public class DdmHandleProfiling extends DdmHandle { - public static final int CHUNK_MPRS = type("MPRS"); - public static final int CHUNK_MPRE = type("MPRE"); - public static final int CHUNK_MPSS = type("MPSS"); - public static final int CHUNK_MPSE = type("MPSE"); - public static final int CHUNK_MPRQ = type("MPRQ"); - public static final int CHUNK_SPSS = type("SPSS"); - public static final int CHUNK_SPSE = type("SPSE"); + public static final int CHUNK_MPRS = ChunkHandler.type("MPRS"); + public static final int CHUNK_MPRE = ChunkHandler.type("MPRE"); + public static final int CHUNK_MPSS = ChunkHandler.type("MPSS"); + public static final int CHUNK_MPSE = ChunkHandler.type("MPSE"); + public static final int CHUNK_MPRQ = ChunkHandler.type("MPRQ"); + public static final int CHUNK_SPSS = ChunkHandler.type("SPSS"); + public static final int CHUNK_SPSE = ChunkHandler.type("SPSE"); private static final boolean DEBUG = false; private static DdmHandleProfiling mInstance = new DdmHandleProfiling(); @@ -60,13 +63,13 @@ public class DdmHandleProfiling extends ChunkHandler { * Called when the DDM server connects. The handler is allowed to * send messages to the server. */ - public void connected() {} + public void onConnected() {} /** * Called when the DDM server disconnects. Can be used to disable * periodic transmissions or clean up saved state. */ - public void disconnected() {} + public void onDisconnected() {} /** * Handle a chunk of data. @@ -91,8 +94,7 @@ public class DdmHandleProfiling extends ChunkHandler { } else if (type == CHUNK_SPSE) { return handleMPSEOrSPSE(request, "Sample"); } else { - throw new RuntimeException("Unknown packet " - + ChunkHandler.name(type)); + throw new RuntimeException("Unknown packet " + name(type)); } } diff --git a/core/java/android/ddm/DdmHandleViewDebug.java b/core/java/android/ddm/DdmHandleViewDebug.java index 5539dc92f82a..6b0f78f2c1c3 100644 --- a/core/java/android/ddm/DdmHandleViewDebug.java +++ b/core/java/android/ddm/DdmHandleViewDebug.java @@ -39,12 +39,12 @@ import java.nio.ByteBuffer; * Handle various requests related to profiling / debugging of the view system. * Support for these features are advertised via {@link DdmHandleHello}. */ -public class DdmHandleViewDebug extends ChunkHandler { +public class DdmHandleViewDebug extends DdmHandle { /** List {@link ViewRootImpl}'s of this process. */ - private static final int CHUNK_VULW = type("VULW"); + private static final int CHUNK_VULW = ChunkHandler.type("VULW"); /** Operation on view root, first parameter in packet should be one of VURT_* constants */ - private static final int CHUNK_VURT = type("VURT"); + private static final int CHUNK_VURT = ChunkHandler.type("VURT"); /** Dump view hierarchy. */ private static final int VURT_DUMP_HIERARCHY = 1; @@ -59,7 +59,7 @@ public class DdmHandleViewDebug extends ChunkHandler { * Generic View Operation, first parameter in the packet should be one of the * VUOP_* constants below. */ - private static final int CHUNK_VUOP = type("VUOP"); + private static final int CHUNK_VUOP = ChunkHandler.type("VUOP"); /** Capture View. */ private static final int VUOP_CAPTURE_VIEW = 1; @@ -99,11 +99,11 @@ public class DdmHandleViewDebug extends ChunkHandler { } @Override - public void connected() { + public void onConnected() { } @Override - public void disconnected() { + public void onDisconnected() { } @Override @@ -154,7 +154,7 @@ public class DdmHandleViewDebug extends ChunkHandler { return createFailChunk(ERR_INVALID_OP, "Unknown view operation: " + op); } } else { - throw new RuntimeException("Unknown packet " + ChunkHandler.name(type)); + throw new RuntimeException("Unknown packet " + name(type)); } } diff --git a/core/java/android/hardware/biometrics/BiometricFaceConstants.java b/core/java/android/hardware/biometrics/BiometricFaceConstants.java index 83e273a91f91..fe43c83d17f1 100644 --- a/core/java/android/hardware/biometrics/BiometricFaceConstants.java +++ b/core/java/android/hardware/biometrics/BiometricFaceConstants.java @@ -53,9 +53,6 @@ public interface BiometricFaceConstants { // authentication or removal. Must agree with the list in HAL h file // - /** - * @hide - */ @IntDef({FACE_ERROR_HW_UNAVAILABLE, FACE_ERROR_UNABLE_TO_PROCESS, FACE_ERROR_TIMEOUT, @@ -110,8 +107,6 @@ public interface BiometricFaceConstants { /** * The {@link FaceManager#remove} call failed. Typically this will happen when the * provided face id was incorrect. - * - * @hide */ int FACE_ERROR_UNABLE_TO_REMOVE = 6; @@ -160,8 +155,6 @@ public interface BiometricFaceConstants { /** * The user pressed the negative button. This is a placeholder that is currently only used * by the support library. - * - * @hide */ int FACE_ERROR_NEGATIVE_BUTTON = 13; @@ -177,24 +170,23 @@ public interface BiometricFaceConstants { * security update has addressed this issue. This error can be received if for example, * authentication was requested with {@link Authenticators#BIOMETRIC_STRONG}, but the * sensor's strength can currently only meet {@link Authenticators#BIOMETRIC_WEAK}. - * @hide */ int BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED = 15; /** * Authentication cannot proceed because re-enrollment is required. - * @hide */ int BIOMETRIC_ERROR_RE_ENROLL = 16; /** * Unknown error received from the HAL. - * @hide */ int FACE_ERROR_UNKNOWN = 17; /** - * @hide + * Vendor codes received from the HAL start at 0. Codes that the framework exposes to keyguard + * append this value for some reason. We should probably remove this and just send the actual + * vendor code. */ int FACE_ERROR_VENDOR_BASE = 1000; @@ -203,9 +195,6 @@ public interface BiometricFaceConstants { // existing constants. These must agree with face@1.0/types.hal. // - /** - * @hide - */ @IntDef({FACE_ACQUIRED_GOOD, FACE_ACQUIRED_INSUFFICIENT, FACE_ACQUIRED_TOO_BRIGHT, @@ -229,7 +218,10 @@ public interface BiometricFaceConstants { FACE_ACQUIRED_START, FACE_ACQUIRED_SENSOR_DIRTY, FACE_ACQUIRED_VENDOR, - FACE_ACQUIRED_UNKNOWN}) + FACE_ACQUIRED_UNKNOWN, + FACE_ACQUIRED_FIRST_FRAME_RECEIVED, + FACE_ACQUIRED_DARK_GLASSES_DETECTED, + FACE_ACQUIRED_MOUTH_COVERING_DETECTED}) @Retention(RetentionPolicy.SOURCE) @interface FaceAcquired {} @@ -402,19 +394,35 @@ public interface BiometricFaceConstants { /** * Hardware vendors may extend this list if there are conditions that do not fall under one of * the above categories. Vendors are responsible for providing error strings for these errors. - * - * @hide */ int FACE_ACQUIRED_VENDOR = 22; /** * Unknown acquired code received from the HAL. - * @hide */ int FACE_ACQUIRED_UNKNOWN = 23; /** - * @hide + * The first frame from the camera has been received. + */ + int FACE_ACQUIRED_FIRST_FRAME_RECEIVED = 24; + + /** + * Dark glasses detected. This can be useful for providing relevant feedback to the user and + * enabling an alternative authentication logic if the implementation supports it. + */ + int FACE_ACQUIRED_DARK_GLASSES_DETECTED = 25; + + /** + * A face mask or face covering detected. This can be useful for providing relevant feedback to + * the user and enabling an alternative authentication logic if the implementation supports it. + */ + int FACE_ACQUIRED_MOUTH_COVERING_DETECTED = 26; + + /** + * Vendor codes received from the HAL start at 0. Codes that the framework exposes to keyguard + * append this value for some reason. We should probably remove this and just send the actual + * vendor code. */ int FACE_ACQUIRED_VENDOR_BASE = 1000; } diff --git a/core/java/android/hardware/biometrics/BiometricTestSession.java b/core/java/android/hardware/biometrics/BiometricTestSession.java index 41672b7cbaea..c62680f7354e 100644 --- a/core/java/android/hardware/biometrics/BiometricTestSession.java +++ b/core/java/android/hardware/biometrics/BiometricTestSession.java @@ -23,7 +23,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.TestApi; import android.content.Context; -import android.hardware.fingerprint.FingerprintManager; import android.os.RemoteException; import android.util.ArraySet; import android.util.Log; @@ -248,6 +247,12 @@ public class BiometricTestSession implements AutoCloseable { } } + if (!mUsersCleaningUp.isEmpty()) { + // TODO(b/186600837): this seems common on multi sensor devices + Log.e(getTag(), "Cleanup not finished before shutdown - pending: " + + mUsersCleaningUp.size()); + } + // Disable the test HAL after the sensor becomes idle. setTestHalEnabled(false); } diff --git a/core/java/android/hardware/face/FaceDataFrame.java b/core/java/android/hardware/face/FaceDataFrame.java index 092359c99173..4dbfc85f0969 100644 --- a/core/java/android/hardware/face/FaceDataFrame.java +++ b/core/java/android/hardware/face/FaceDataFrame.java @@ -17,6 +17,7 @@ package android.hardware.face; import android.annotation.NonNull; +import android.hardware.biometrics.BiometricFaceConstants; import android.os.Parcel; import android.os.Parcelable; @@ -26,7 +27,7 @@ import android.os.Parcelable; * @hide */ public final class FaceDataFrame implements Parcelable { - private final int mAcquiredInfo; + @BiometricFaceConstants.FaceAcquired private final int mAcquiredInfo; private final int mVendorCode; private final float mPan; private final float mTilt; @@ -48,7 +49,7 @@ public final class FaceDataFrame implements Parcelable { * @param isCancellable Whether the ongoing face operation should be canceled. */ public FaceDataFrame( - int acquiredInfo, + @BiometricFaceConstants.FaceAcquired int acquiredInfo, int vendorCode, float pan, float tilt, @@ -69,7 +70,7 @@ public final class FaceDataFrame implements Parcelable { * @param vendorCode An integer representing a custom vendor-specific message. Ignored unless * {@code acquiredInfo} is {@code FACE_ACQUIRED_VENDOR}. */ - public FaceDataFrame(int acquiredInfo, int vendorCode) { + public FaceDataFrame(@BiometricFaceConstants.FaceAcquired int acquiredInfo, int vendorCode) { mAcquiredInfo = acquiredInfo; mVendorCode = vendorCode; mPan = 0f; @@ -83,6 +84,7 @@ public final class FaceDataFrame implements Parcelable { * * @see android.hardware.biometrics.BiometricFaceConstants */ + @BiometricFaceConstants.FaceAcquired public int getAcquiredInfo() { return mAcquiredInfo; } diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java index 55c90ce2a32f..12557f9b73eb 100644 --- a/core/java/android/hardware/face/FaceManager.java +++ b/core/java/android/hardware/face/FaceManager.java @@ -1449,6 +1449,8 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan case FACE_ACQUIRED_ROLL_TOO_EXTREME: return context.getString(R.string.face_acquired_roll_too_extreme); case FACE_ACQUIRED_FACE_OBSCURED: + case FACE_ACQUIRED_DARK_GLASSES_DETECTED: + case FACE_ACQUIRED_MOUTH_COVERING_DETECTED: return context.getString(R.string.face_acquired_obscured); case FACE_ACQUIRED_SENSOR_DIRTY: return context.getString(R.string.face_acquired_sensor_dirty); diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index f0d410f46f81..881e0cfb58d7 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -481,6 +481,7 @@ public class InputMethodService extends AbstractInputMethodService { boolean mFullscreenApplied; boolean mIsFullscreen; + private boolean mLastWasInFullscreenMode; @UnsupportedAppUsage View mExtractView; boolean mExtractViewHidden; @@ -920,8 +921,17 @@ public class InputMethodService extends AbstractInputMethodService { if (mHandler == null) { mHandler = new Handler(getMainLooper()); } - mImeSurfaceScheduledForRemoval = true; - mHandler.postDelayed(() -> removeImeSurface(), TIMEOUT_SURFACE_REMOVAL_MILLIS); + + if (mLastWasInFullscreenMode) { + // Caching surface / delaying surface removal can cause mServedView to detach in certain + // cases in RecyclerView (b/187772544). + // TODO(b/188818557): Re-enable IME surface caching for fullscreen mode once detaching + // view issues is resolved in RecyclerView. + removeImeSurface(); + } else { + mImeSurfaceScheduledForRemoval = true; + mHandler.postDelayed(() -> removeImeSurface(), TIMEOUT_SURFACE_REMOVAL_MILLIS); + } } private void removeImeSurface() { @@ -2350,6 +2360,7 @@ public class InputMethodService extends AbstractInputMethodService { onWindowHidden(); mDecorViewWasVisible = false; } + mLastWasInFullscreenMode = mIsFullscreen; updateFullscreenMode(); } diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index 370052d47d16..f2857ceb59d7 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -368,27 +368,19 @@ public final class BatteryUsageStats implements Parcelable { }; /** Returns a proto (as used for atoms.proto) corresponding to this BatteryUsageStats. */ - public byte[] getStatsProto(long sessionEndTimestampMs) { - - final long sessionStartMillis = getStatsStartTimestamp(); - // TODO(b/187223764): Use the getStatsEndTimestamp() instead, once that is added. - final long sessionEndMillis = sessionEndTimestampMs; - final long sessionDurationMillis = sessionEndTimestampMs - getStatsStartTimestamp(); - + public byte[] getStatsProto() { final BatteryConsumer deviceBatteryConsumer = getAggregateBatteryConsumer( AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE); - final int sessionDischargePercentage = getDischargePercentage(); - final ProtoOutputStream proto = new ProtoOutputStream(); - proto.write(BatteryUsageStatsAtomsProto.SESSION_START_MILLIS, sessionStartMillis); - proto.write(BatteryUsageStatsAtomsProto.SESSION_END_MILLIS, sessionEndMillis); - proto.write(BatteryUsageStatsAtomsProto.SESSION_DURATION_MILLIS, sessionDurationMillis); + proto.write(BatteryUsageStatsAtomsProto.SESSION_START_MILLIS, getStatsStartTimestamp()); + proto.write(BatteryUsageStatsAtomsProto.SESSION_END_MILLIS, getStatsEndTimestamp()); + proto.write(BatteryUsageStatsAtomsProto.SESSION_DURATION_MILLIS, getStatsDuration()); deviceBatteryConsumer.writeStatsProto(proto, BatteryUsageStatsAtomsProto.DEVICE_BATTERY_CONSUMER); writeUidBatteryConsumersProto(proto); proto.write(BatteryUsageStatsAtomsProto.SESSION_DISCHARGE_PERCENTAGE, - sessionDischargePercentage); + getDischargePercentage()); return proto.getBytes(); } @@ -399,8 +391,8 @@ public final class BatteryUsageStats implements Parcelable { private void writeUidBatteryConsumersProto(ProtoOutputStream proto) { final List<UidBatteryConsumer> consumers = getUidBatteryConsumers(); - // TODO: Sort the list by power consumption. If during the for, proto.getRawSize() > 45kb, - // truncate the remainder of the list. + // TODO(b/189225426): Sort the list by power consumption. If during the for, + // proto.getRawSize() > 45kb, truncate the remainder of the list. final int size = consumers.size(); for (int i = 0; i < size; i++) { final UidBatteryConsumer consumer = consumers.get(i); diff --git a/core/java/android/os/BinderProxy.java b/core/java/android/os/BinderProxy.java index 2a9b703583a6..d44b016cb5d0 100644 --- a/core/java/android/os/BinderProxy.java +++ b/core/java/android/os/BinderProxy.java @@ -565,8 +565,7 @@ public final class BinderProxy implements IBinder { } try { - boolean replyOwnsNative = (reply == null) ? false : reply.ownsNativeParcelObject(); - return transactNative(code, data, reply, replyOwnsNative, flags); + return transactNative(code, data, reply, flags); } finally { if (transactListener != null) { transactListener.onTransactEnded(session); @@ -589,7 +588,7 @@ public final class BinderProxy implements IBinder { * Native implementation of transact() for proxies */ public native boolean transactNative(int code, Parcel data, Parcel reply, - boolean replyOwnsNativeParcelObject, int flags) throws RemoteException; + int flags) throws RemoteException; /** * See {@link IBinder#linkToDeath(DeathRecipient, int)} */ diff --git a/core/java/android/os/HidlMemory.java b/core/java/android/os/HidlMemory.java index 26fc6f0ae4ce..2539a6b2a0eb 100644 --- a/core/java/android/os/HidlMemory.java +++ b/core/java/android/os/HidlMemory.java @@ -79,6 +79,7 @@ public class HidlMemory implements Closeable { public void close() throws IOException { if (mHandle != null) { mHandle.close(); + mHandle = null; } } diff --git a/core/java/android/os/HidlMemoryUtil.java b/core/java/android/os/HidlMemoryUtil.java index 4252fe30f4ad..a1b2aef5884a 100644 --- a/core/java/android/os/HidlMemoryUtil.java +++ b/core/java/android/os/HidlMemoryUtil.java @@ -76,8 +76,7 @@ public final class HidlMemoryUtil { return new HidlMemory("ashmem", 0, null); } - try { - SharedMemory shmem = SharedMemory.create(name != null ? name : "", input.length); + try (SharedMemory shmem = SharedMemory.create(name != null ? name : "", input.length)) { ByteBuffer buffer = shmem.mapReadWrite(); buffer.put(input); shmem.unmap(buffer); @@ -119,8 +118,7 @@ public final class HidlMemoryUtil { return new HidlMemory("ashmem", 0, null); } - try { - SharedMemory shmem = SharedMemory.create(name != null ? name : "", input.size()); + try (SharedMemory shmem = SharedMemory.create(name != null ? name : "", input.size())) { ByteBuffer buffer = shmem.mapReadWrite(); for (Byte b : input) { buffer.put(b); @@ -214,8 +212,12 @@ public final class HidlMemoryUtil { if (fd == null) { return new HidlMemory("ashmem", 0, null); } - NativeHandle handle = new NativeHandle(fd, true); - return new HidlMemory("ashmem", size, handle); + try { + NativeHandle handle = new NativeHandle(Os.dup(fd), true); + return new HidlMemory("ashmem", size, handle); + } catch (ErrnoException e) { + throw new RuntimeException(e); + } } private static ByteBuffer getBuffer(@NonNull HidlMemory mem) { diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 50f390bce890..e06e7b6be90a 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -3736,9 +3736,4 @@ public final class Parcel { public long getBlobAshmemSize() { return nativeGetBlobAshmemSize(mNativePtr); } - - /** @hide */ - /*package*/ boolean ownsNativeParcelObject() { - return mOwnsNativeParcelObject; - } } diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 5848d2f1af2c..224cd84bc777 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -189,28 +189,6 @@ public class UserManager { public @interface QuietModeFlag {} /** - * Flag returned by {@link #getUserPrivacySensitivity} to indicate that the user isn't - * particularly sensitive about a certain aspect of privacy. - */ - public static final int PRIVACY_SENSITIVITY_DEFAULT = 0x0; - - /** - * Flag returned by {@link #getUserPrivacySensitivity} to indicate that the user is sensitive - * about location privacy. - */ - public static final int PRIVACY_SENSITIVITY_LOCATION = 0x1; - - /** - * List of flags available for the {@link #getUserPrivacySensitivity} method. - * @hide - */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(flag = true, prefix = { "PRIVACY_SENSITIVITY_" }, value = { - PRIVACY_SENSITIVITY_DEFAULT, - PRIVACY_SENSITIVITY_LOCATION}) - public @interface PrivacySensitivityFlag {} - - /** * @hide * No user restriction. */ @@ -3960,17 +3938,6 @@ public class UserManager { } /** - * Get the privacy sensitivity of the user. - * - * @return the privacy sensitivity of the user - */ - @PrivacySensitivityFlag - public int getUserPrivacySensitivity() { - // TODO: Add actual implementation. - return PRIVACY_SENSITIVITY_DEFAULT; - } - - /** * Returns whether the given user has a badge (generally to put on profiles' icons). * * @param userId userId of the user in question diff --git a/core/java/android/os/VibratorManager.java b/core/java/android/os/VibratorManager.java index 01cece39b922..c82a51669b86 100644 --- a/core/java/android/os/VibratorManager.java +++ b/core/java/android/os/VibratorManager.java @@ -94,6 +94,8 @@ public abstract class VibratorManager { * VibrationEffect VibrationEffects} to be played on one or more vibrators. * </p> * + * <p>The app should be in foreground for the vibration to happen.</p> + * * @param effect a combination of effects to be performed by one or more vibrators. */ @RequiresPermission(android.Manifest.permission.VIBRATE) @@ -109,6 +111,9 @@ public abstract class VibratorManager { * VibrationEffect} to be played on one or more vibrators. * </p> * + * <p>The app should be in foreground for the vibration to happen. Background apps should + * specify a ringtone, notification or alarm usage in order to vibrate.</p> + * * @param effect a combination of effects to be performed by one or more vibrators. * @param attributes {@link VibrationAttributes} corresponding to the vibration. For example, * specify {@link VibrationAttributes#USAGE_ALARM} for alarm vibrations or diff --git a/core/java/android/service/voice/HotwordDetectedResult.java b/core/java/android/service/voice/HotwordDetectedResult.java index 95e43f3cbb59..846f2f94d055 100644 --- a/core/java/android/service/voice/HotwordDetectedResult.java +++ b/core/java/android/service/voice/HotwordDetectedResult.java @@ -118,7 +118,7 @@ public final class HotwordDetectedResult implements Parcelable { * Returns whether the trigger has happened due to model having been personalized to fit user's * voice. */ - private boolean mPersonalizedHotwordDetection = false; + private boolean mHotwordDetectionPersonalized = false; /** * Score for the hotword trigger. @@ -270,7 +270,7 @@ public final class HotwordDetectedResult implements Parcelable { int hotwordOffsetMillis, int hotwordDurationMillis, int audioChannel, - boolean personalizedHotwordDetection, + boolean hotwordDetectionPersonalized, int score, int personalizedScore, int hotwordPhraseId, @@ -282,7 +282,7 @@ public final class HotwordDetectedResult implements Parcelable { this.mHotwordOffsetMillis = hotwordOffsetMillis; this.mHotwordDurationMillis = hotwordDurationMillis; this.mAudioChannel = audioChannel; - this.mPersonalizedHotwordDetection = personalizedHotwordDetection; + this.mHotwordDetectionPersonalized = hotwordDetectionPersonalized; this.mScore = score; this.mPersonalizedScore = personalizedScore; this.mHotwordPhraseId = hotwordPhraseId; @@ -334,8 +334,8 @@ public final class HotwordDetectedResult implements Parcelable { * voice. */ @DataClass.Generated.Member - public boolean isPersonalizedHotwordDetection() { - return mPersonalizedHotwordDetection; + public boolean isHotwordDetectionPersonalized() { + return mHotwordDetectionPersonalized; } /** @@ -400,7 +400,7 @@ public final class HotwordDetectedResult implements Parcelable { "hotwordOffsetMillis = " + mHotwordOffsetMillis + ", " + "hotwordDurationMillis = " + mHotwordDurationMillis + ", " + "audioChannel = " + mAudioChannel + ", " + - "personalizedHotwordDetection = " + mPersonalizedHotwordDetection + ", " + + "hotwordDetectionPersonalized = " + mHotwordDetectionPersonalized + ", " + "score = " + mScore + ", " + "personalizedScore = " + mPersonalizedScore + ", " + "hotwordPhraseId = " + mHotwordPhraseId + ", " + @@ -426,7 +426,7 @@ public final class HotwordDetectedResult implements Parcelable { && mHotwordOffsetMillis == that.mHotwordOffsetMillis && mHotwordDurationMillis == that.mHotwordDurationMillis && mAudioChannel == that.mAudioChannel - && mPersonalizedHotwordDetection == that.mPersonalizedHotwordDetection + && mHotwordDetectionPersonalized == that.mHotwordDetectionPersonalized && mScore == that.mScore && mPersonalizedScore == that.mPersonalizedScore && mHotwordPhraseId == that.mHotwordPhraseId @@ -445,7 +445,7 @@ public final class HotwordDetectedResult implements Parcelable { _hash = 31 * _hash + mHotwordOffsetMillis; _hash = 31 * _hash + mHotwordDurationMillis; _hash = 31 * _hash + mAudioChannel; - _hash = 31 * _hash + Boolean.hashCode(mPersonalizedHotwordDetection); + _hash = 31 * _hash + Boolean.hashCode(mHotwordDetectionPersonalized); _hash = 31 * _hash + mScore; _hash = 31 * _hash + mPersonalizedScore; _hash = 31 * _hash + mHotwordPhraseId; @@ -460,7 +460,7 @@ public final class HotwordDetectedResult implements Parcelable { // void parcelFieldName(Parcel dest, int flags) { ... } int flg = 0; - if (mPersonalizedHotwordDetection) flg |= 0x20; + if (mHotwordDetectionPersonalized) flg |= 0x20; if (mMediaSyncEvent != null) flg |= 0x2; dest.writeInt(flg); dest.writeInt(mConfidenceLevel); @@ -486,7 +486,7 @@ public final class HotwordDetectedResult implements Parcelable { // static FieldType unparcelFieldName(Parcel in) { ... } int flg = in.readInt(); - boolean personalizedHotwordDetection = (flg & 0x20) != 0; + boolean hotwordDetectionPersonalized = (flg & 0x20) != 0; int confidenceLevel = in.readInt(); MediaSyncEvent mediaSyncEvent = (flg & 0x2) == 0 ? null : (MediaSyncEvent) in.readTypedObject(MediaSyncEvent.CREATOR); int hotwordOffsetMillis = in.readInt(); @@ -504,7 +504,7 @@ public final class HotwordDetectedResult implements Parcelable { this.mHotwordOffsetMillis = hotwordOffsetMillis; this.mHotwordDurationMillis = hotwordDurationMillis; this.mAudioChannel = audioChannel; - this.mPersonalizedHotwordDetection = personalizedHotwordDetection; + this.mHotwordDetectionPersonalized = hotwordDetectionPersonalized; this.mScore = score; this.mPersonalizedScore = personalizedScore; this.mHotwordPhraseId = hotwordPhraseId; @@ -541,7 +541,7 @@ public final class HotwordDetectedResult implements Parcelable { private int mHotwordOffsetMillis; private int mHotwordDurationMillis; private int mAudioChannel; - private boolean mPersonalizedHotwordDetection; + private boolean mHotwordDetectionPersonalized; private int mScore; private int mPersonalizedScore; private int mHotwordPhraseId; @@ -618,10 +618,10 @@ public final class HotwordDetectedResult implements Parcelable { * voice. */ @DataClass.Generated.Member - public @NonNull Builder setPersonalizedHotwordDetection(boolean value) { + public @NonNull Builder setHotwordDetectionPersonalized(boolean value) { checkNotUsed(); mBuilderFieldsSet |= 0x20; - mPersonalizedHotwordDetection = value; + mHotwordDetectionPersonalized = value; return this; } @@ -708,7 +708,7 @@ public final class HotwordDetectedResult implements Parcelable { mAudioChannel = AUDIO_CHANNEL_UNSET; } if ((mBuilderFieldsSet & 0x20) == 0) { - mPersonalizedHotwordDetection = false; + mHotwordDetectionPersonalized = false; } if ((mBuilderFieldsSet & 0x40) == 0) { mScore = defaultScore(); @@ -728,7 +728,7 @@ public final class HotwordDetectedResult implements Parcelable { mHotwordOffsetMillis, mHotwordDurationMillis, mAudioChannel, - mPersonalizedHotwordDetection, + mHotwordDetectionPersonalized, mScore, mPersonalizedScore, mHotwordPhraseId, @@ -745,10 +745,10 @@ public final class HotwordDetectedResult implements Parcelable { } @DataClass.Generated( - time = 1621631039729L, + time = 1621943150502L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/service/voice/HotwordDetectedResult.java", - inputSignatures = "public static final int CONFIDENCE_LEVEL_NONE\npublic static final int CONFIDENCE_LEVEL_LOW\npublic static final int CONFIDENCE_LEVEL_LOW_MEDIUM\npublic static final int CONFIDENCE_LEVEL_MEDIUM\npublic static final int CONFIDENCE_LEVEL_MEDIUM_HIGH\npublic static final int CONFIDENCE_LEVEL_HIGH\npublic static final int CONFIDENCE_LEVEL_VERY_HIGH\npublic static final int HOTWORD_OFFSET_UNSET\npublic static final int AUDIO_CHANNEL_UNSET\nprivate final @android.service.voice.HotwordDetectedResult.HotwordConfidenceLevelValue int mConfidenceLevel\nprivate @android.annotation.Nullable android.media.MediaSyncEvent mMediaSyncEvent\nprivate int mHotwordOffsetMillis\nprivate int mHotwordDurationMillis\nprivate int mAudioChannel\nprivate boolean mPersonalizedHotwordDetection\nprivate final int mScore\nprivate final int mPersonalizedScore\nprivate final int mHotwordPhraseId\nprivate final @android.annotation.NonNull android.os.PersistableBundle mExtras\nprivate static int defaultConfidenceLevel()\nprivate static int defaultScore()\nprivate static int defaultPersonalizedScore()\npublic static int getMaxScore()\nprivate static int defaultHotwordPhraseId()\npublic static int getMaxHotwordPhraseId()\nprivate static android.os.PersistableBundle defaultExtras()\npublic static int getMaxBundleSize()\npublic @android.annotation.Nullable android.media.MediaSyncEvent getMediaSyncEvent()\nclass HotwordDetectedResult extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)") + inputSignatures = "public static final int CONFIDENCE_LEVEL_NONE\npublic static final int CONFIDENCE_LEVEL_LOW\npublic static final int CONFIDENCE_LEVEL_LOW_MEDIUM\npublic static final int CONFIDENCE_LEVEL_MEDIUM\npublic static final int CONFIDENCE_LEVEL_MEDIUM_HIGH\npublic static final int CONFIDENCE_LEVEL_HIGH\npublic static final int CONFIDENCE_LEVEL_VERY_HIGH\npublic static final int HOTWORD_OFFSET_UNSET\npublic static final int AUDIO_CHANNEL_UNSET\nprivate final @android.service.voice.HotwordDetectedResult.HotwordConfidenceLevelValue int mConfidenceLevel\nprivate @android.annotation.Nullable android.media.MediaSyncEvent mMediaSyncEvent\nprivate int mHotwordOffsetMillis\nprivate int mHotwordDurationMillis\nprivate int mAudioChannel\nprivate boolean mHotwordDetectionPersonalized\nprivate final int mScore\nprivate final int mPersonalizedScore\nprivate final int mHotwordPhraseId\nprivate final @android.annotation.NonNull android.os.PersistableBundle mExtras\nprivate static int defaultConfidenceLevel()\nprivate static int defaultScore()\nprivate static int defaultPersonalizedScore()\npublic static int getMaxScore()\nprivate static int defaultHotwordPhraseId()\npublic static int getMaxHotwordPhraseId()\nprivate static android.os.PersistableBundle defaultExtras()\npublic static int getMaxBundleSize()\npublic @android.annotation.Nullable android.media.MediaSyncEvent getMediaSyncEvent()\nclass HotwordDetectedResult extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)") @Deprecated private void __metadata() {} diff --git a/core/java/android/service/voice/HotwordDetectionService.java b/core/java/android/service/voice/HotwordDetectionService.java index 7dd3a1dd5ea7..deb6c01a3088 100644 --- a/core/java/android/service/voice/HotwordDetectionService.java +++ b/core/java/android/service/voice/HotwordDetectionService.java @@ -192,6 +192,11 @@ public abstract class HotwordDetectionService extends Service { mContentCaptureManager = new ContentCaptureManager( HotwordDetectionService.this, manager, options); } + + @Override + public void stopDetection() { + HotwordDetectionService.this.onStopDetection(); + } }; @Override @@ -349,6 +354,15 @@ public abstract class HotwordDetectionService extends Service { } /** + * Called when the {@link VoiceInteractionService} + * {@link HotwordDetector#stopRecognition() requests} that hotword recognition be stopped. + * <p> + * Any open {@link android.media.AudioRecord} should be closed here. + */ + public void onStopDetection() { + } + + /** * Callback for returning the detection result. * * @hide diff --git a/core/java/android/service/voice/HotwordRejectedResult.java b/core/java/android/service/voice/HotwordRejectedResult.java index 78664f604093..7b3f47d04e48 100644 --- a/core/java/android/service/voice/HotwordRejectedResult.java +++ b/core/java/android/service/voice/HotwordRejectedResult.java @@ -29,7 +29,7 @@ import com.android.internal.util.DataClass; */ @DataClass( genConstructor = false, - genHiddenBuilder = true, + genBuilder = true, genEqualsHashCode = true, genHiddenConstDefs = true, genParcelable = true, @@ -210,7 +210,6 @@ public final class HotwordRejectedResult implements Parcelable { /** * A builder for {@link HotwordRejectedResult} - * @hide */ @SuppressWarnings("WeakerAccess") @DataClass.Generated.Member @@ -256,10 +255,10 @@ public final class HotwordRejectedResult implements Parcelable { } @DataClass.Generated( - time = 1621551683210L, + time = 1621961370106L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/service/voice/HotwordRejectedResult.java", - inputSignatures = "public static final int CONFIDENCE_LEVEL_NONE\npublic static final int CONFIDENCE_LEVEL_LOW\npublic static final int CONFIDENCE_LEVEL_MEDIUM\npublic static final int CONFIDENCE_LEVEL_HIGH\nprivate final @android.service.voice.HotwordRejectedResult.HotwordConfidenceLevelValue int mConfidenceLevel\nprivate static int defaultConfidenceLevel()\nclass HotwordRejectedResult extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genHiddenBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)") + inputSignatures = "public static final int CONFIDENCE_LEVEL_NONE\npublic static final int CONFIDENCE_LEVEL_LOW\npublic static final int CONFIDENCE_LEVEL_MEDIUM\npublic static final int CONFIDENCE_LEVEL_HIGH\nprivate final @android.service.voice.HotwordRejectedResult.HotwordConfidenceLevelValue int mConfidenceLevel\nprivate static int defaultConfidenceLevel()\nclass HotwordRejectedResult extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)") @Deprecated private void __metadata() {} diff --git a/core/java/android/service/voice/IHotwordDetectionService.aidl b/core/java/android/service/voice/IHotwordDetectionService.aidl index 7ba00982e6a2..72dd45aeeb0f 100644 --- a/core/java/android/service/voice/IHotwordDetectionService.aidl +++ b/core/java/android/service/voice/IHotwordDetectionService.aidl @@ -53,4 +53,6 @@ oneway interface IHotwordDetectionService { void updateContentCaptureManager( in IContentCaptureManager contentCaptureManager, in ContentCaptureOptions options); + + void stopDetection(); } diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java index 3255dd65b193..b3caac07aa61 100644 --- a/core/java/android/view/InsetsAnimationControlImpl.java +++ b/core/java/android/view/InsetsAnimationControlImpl.java @@ -28,6 +28,8 @@ import static android.view.InsetsAnimationControlImplProto.TMP_MATRIX; import static android.view.InsetsController.ANIMATION_TYPE_SHOW; import static android.view.InsetsController.AnimationType; import static android.view.InsetsController.DEBUG; +import static android.view.InsetsController.LAYOUT_INSETS_DURING_ANIMATION_SHOWN; +import static android.view.InsetsController.LayoutInsetsDuringAnimation; import static android.view.InsetsState.ISIDE_BOTTOM; import static android.view.InsetsState.ISIDE_FLOATING; import static android.view.InsetsState.ISIDE_LEFT; @@ -85,6 +87,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll private final Matrix mTmpMatrix = new Matrix(); private final InsetsState mInitialInsetsState; private final @AnimationType int mAnimationType; + private final @LayoutInsetsDuringAnimation int mLayoutInsetsDuringAnimation; private final @InsetsType int mTypes; private @InsetsType int mControllingTypes; private final InsetsAnimationControlCallbacks mController; @@ -107,9 +110,10 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll @VisibleForTesting public InsetsAnimationControlImpl(SparseArray<InsetsSourceControl> controls, @Nullable Rect frame, InsetsState state, WindowInsetsAnimationControlListener listener, - @InsetsType int types, - InsetsAnimationControlCallbacks controller, long durationMs, Interpolator interpolator, - @AnimationType int animationType, CompatibilityInfo.Translator translator) { + @InsetsType int types, InsetsAnimationControlCallbacks controller, long durationMs, + Interpolator interpolator, @AnimationType int animationType, + @LayoutInsetsDuringAnimation int layoutInsetsDuringAnimation, + CompatibilityInfo.Translator translator) { mControls = controls; mListener = listener; mTypes = types; @@ -145,6 +149,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll durationMs); mAnimation.setAlpha(getCurrentAlpha()); mAnimationType = animationType; + mLayoutInsetsDuringAnimation = layoutInsetsDuringAnimation; mTranslator = translator; mController.startAnimation(this, listener, types, mAnimation, new Bounds(mHiddenInsets, mShownInsets)); @@ -299,6 +304,10 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll if (mFinished) { return; } + mPendingInsets = mLayoutInsetsDuringAnimation == LAYOUT_INSETS_DURING_ANIMATION_SHOWN + ? mShownInsets : mHiddenInsets; + mPendingAlpha = 1f; + applyChangeInsets(null); mCancelled = true; mListener.onCancelled(mReadyDispatched ? this : null); if (DEBUG) Log.d(TAG, "notify Control request cancelled for types: " + mTypes); diff --git a/core/java/android/view/InsetsAnimationThreadControlRunner.java b/core/java/android/view/InsetsAnimationThreadControlRunner.java index 436a17c0de0b..c6ebc9e52e84 100644 --- a/core/java/android/view/InsetsAnimationThreadControlRunner.java +++ b/core/java/android/view/InsetsAnimationThreadControlRunner.java @@ -29,6 +29,7 @@ import android.util.Log; import android.util.SparseArray; import android.util.proto.ProtoOutputStream; import android.view.InsetsController.AnimationType; +import android.view.InsetsController.LayoutInsetsDuringAnimation; import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsAnimation.Bounds; @@ -103,14 +104,15 @@ public class InsetsAnimationThreadControlRunner implements InsetsAnimationContro @UiThread public InsetsAnimationThreadControlRunner(SparseArray<InsetsSourceControl> controls, @Nullable Rect frame, InsetsState state, WindowInsetsAnimationControlListener listener, - @InsetsType int types, - InsetsAnimationControlCallbacks controller, long durationMs, Interpolator interpolator, - @AnimationType int animationType, CompatibilityInfo.Translator translator, - Handler mainThreadHandler) { + @InsetsType int types, InsetsAnimationControlCallbacks controller, long durationMs, + Interpolator interpolator, @AnimationType int animationType, + @LayoutInsetsDuringAnimation int layoutInsetsDuringAnimation, + CompatibilityInfo.Translator translator, Handler mainThreadHandler) { mMainThreadHandler = mainThreadHandler; mOuterCallbacks = controller; - mControl = new InsetsAnimationControlImpl(controls, frame, state, listener, - types, mCallbacks, durationMs, interpolator, animationType, translator); + mControl = new InsetsAnimationControlImpl(controls, frame, state, listener, types, + mCallbacks, durationMs, interpolator, animationType, layoutInsetsDuringAnimation, + translator); InsetsAnimationThread.getHandler().post(() -> { if (mControl.isCancelled()) { return; diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index d17b42edb815..d339c0471125 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -1053,10 +1053,11 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation final InsetsAnimationControlRunner runner = useInsetsAnimationThread ? new InsetsAnimationThreadControlRunner(controls, frame, mState, listener, typesReady, this, durationMs, interpolator, - animationType, mHost.getTranslator(), mHost.getHandler()) + animationType, layoutInsetsDuringAnimation, mHost.getTranslator(), + mHost.getHandler()) : new InsetsAnimationControlImpl(controls, frame, mState, listener, typesReady, this, durationMs, interpolator, - animationType, mHost.getTranslator()); + animationType, layoutInsetsDuringAnimation, mHost.getTranslator()); if ((typesReady & WindowInsets.Type.ime()) != 0) { ImeTracing.getInstance().triggerClientDump("InsetsAnimationControlImpl", mHost.getInputMethodManager(), null /* icProto */); diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 2fce4348cbb0..6b0bb9df5468 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -571,7 +571,10 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall // recreate this Surface, so only release it when we are fully // detached. if (mSurfacePackage != null) { - mTmpTransaction.reparent(mSurfacePackage.getSurfaceControl(), null).apply(); + final SurfaceControl sc = mSurfacePackage.getSurfaceControl(); + if (sc != null && sc.isValid()) { + mTmpTransaction.reparent(sc, null).apply(); + } mSurfacePackage.release(); mSurfacePackage = null; } @@ -1826,7 +1829,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall */ public void setChildSurfacePackage(@NonNull SurfaceControlViewHost.SurfacePackage p) { final SurfaceControl lastSc = mSurfacePackage != null ? - mSurfacePackage.getSurfaceControl() : null; + mSurfacePackage.getSurfaceControl() : null; if (mSurfaceControl != null && lastSc != null) { mTmpTransaction.reparent(lastSc, null).apply(); mSurfacePackage.release(); @@ -1839,8 +1842,11 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall private void reparentSurfacePackage(SurfaceControl.Transaction t, SurfaceControlViewHost.SurfacePackage p) { - initEmbeddedHierarchyForAccessibility(p); final SurfaceControl sc = p.getSurfaceControl(); + if (sc == null || !sc.isValid()) { + return; + } + initEmbeddedHierarchyForAccessibility(p); final SurfaceControl parent; if (mUseBlastAdapter) { parent = mBlastSurfaceControl; diff --git a/core/java/android/view/TunnelModeEnabledListener.java b/core/java/android/view/TunnelModeEnabledListener.java new file mode 100644 index 000000000000..c158da9dfa23 --- /dev/null +++ b/core/java/android/view/TunnelModeEnabledListener.java @@ -0,0 +1,98 @@ +/* + * Copyright 2021 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.view; + +import com.android.internal.annotations.VisibleForTesting; + +import java.util.concurrent.Executor; + +/** + * Listens for tunnel mode enabled/disabled events from SurfaceFlinger. + * {@hide} + */ +public abstract class TunnelModeEnabledListener { + + private long mNativeListener; + private final Executor mExecutor; + + public TunnelModeEnabledListener(Executor executor) { + mExecutor = executor; + mNativeListener = nativeCreate(this); + } + + /** + * Destroys the listener. + */ + public void destroy() { + if (mNativeListener == 0) { + return; + } + unregister(this); + nativeDestroy(mNativeListener); + mNativeListener = 0; + } + + @Override + protected void finalize() throws Throwable { + try { + destroy(); + } finally { + super.finalize(); + } + } + + /** + * Reports when tunnel mode has been enabled/disabled. + */ + public abstract void onTunnelModeEnabledChanged(boolean tunnelModeEnabled); + + /** + * Registers a listener. + */ + public static void register(TunnelModeEnabledListener listener) { + if (listener.mNativeListener == 0) { + return; + } + nativeRegister(listener.mNativeListener); + } + + /** + * Unregisters a listener. + */ + public static void unregister(TunnelModeEnabledListener listener) { + if (listener.mNativeListener == 0) { + return; + } + nativeUnregister(listener.mNativeListener); + } + + /** + * Dispatch tunnel mode enabled. + * + * Called from native code on a binder thread. + */ + @VisibleForTesting + public static void dispatchOnTunnelModeEnabledChanged(TunnelModeEnabledListener listener, + boolean tunnelModeEnabled) { + listener.mExecutor.execute(() -> listener.onTunnelModeEnabledChanged(tunnelModeEnabled)); + } + + private static native long nativeCreate(TunnelModeEnabledListener thiz); + private static native void nativeDestroy(long ptr); + private static native void nativeRegister(long ptr); + private static native void nativeUnregister(long ptr); +} diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 0acacb60da3f..908d236c6c02 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -9828,30 +9828,37 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if (mContext.getContentCaptureOptions() == null) return; if (appeared) { - if (!isLaidOut() || getVisibility() != VISIBLE - || (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) { + // The appeared event stops sending to AiAi. + // 1. The view is hidden. + // 2. The same event was sent. + // 3. The view is not laid out, and it will be laid out in the future. + // Some recycled views cached its layout and a relayout is unnecessary. In this case, + // system still needs to notify content capture the view appeared. When a view is + // recycled, it will set the flag PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED. + final boolean isRecycledWithoutRelayout = getNotifiedContentCaptureDisappeared() + && getVisibility() == VISIBLE + && !isLayoutRequested(); + if (getVisibility() != VISIBLE || getNotifiedContentCaptureAppeared() + || !(isLaidOut() || isRecycledWithoutRelayout)) { if (DEBUG_CONTENT_CAPTURE) { Log.v(CONTENT_CAPTURE_LOG_TAG, "Ignoring 'appeared' on " + this + ": laid=" + isLaidOut() + ", visibleToUser=" + isVisibleToUser() + ", visible=" + (getVisibility() == VISIBLE) - + ": alreadyNotifiedAppeared=" + ((mPrivateFlags4 - & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) - + ", alreadyNotifiedDisappeared=" + ((mPrivateFlags4 - & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0)); + + ": alreadyNotifiedAppeared=" + getNotifiedContentCaptureAppeared() + + ", alreadyNotifiedDisappeared=" + + getNotifiedContentCaptureDisappeared()); } return; } } else { - if ((mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) == 0 - || (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0) { + if (!getNotifiedContentCaptureAppeared() || getNotifiedContentCaptureDisappeared()) { if (DEBUG_CONTENT_CAPTURE) { Log.v(CONTENT_CAPTURE_LOG_TAG, "Ignoring 'disappeared' on " + this + ": laid=" + isLaidOut() + ", visibleToUser=" + isVisibleToUser() + ", visible=" + (getVisibility() == VISIBLE) - + ": alreadyNotifiedAppeared=" + ((mPrivateFlags4 - & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) - + ", alreadyNotifiedDisappeared=" + ((mPrivateFlags4 - & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0)); + + ": alreadyNotifiedAppeared=" + getNotifiedContentCaptureAppeared() + + ", alreadyNotifiedDisappeared=" + + getNotifiedContentCaptureDisappeared()); } return; } @@ -9899,6 +9906,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } + private boolean getNotifiedContentCaptureDisappeared() { + return (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0; + } + /** * Sets the (optional) {@link ContentCaptureSession} associated with this view. * diff --git a/core/java/android/view/translation/TranslationRequest.java b/core/java/android/view/translation/TranslationRequest.java index da1baf9a89d8..df4836ebde46 100644 --- a/core/java/android/view/translation/TranslationRequest.java +++ b/core/java/android/view/translation/TranslationRequest.java @@ -327,7 +327,9 @@ public final class TranslationRequest implements Parcelable { return this; } - /** @see #setTranslationRequestValues */ + /** @see #setTranslationRequestValues + * @removed + */ @DataClass.Generated.Member @Override @Deprecated @@ -350,7 +352,9 @@ public final class TranslationRequest implements Parcelable { return this; } - /** @see #setViewTranslationRequests */ + /** @see #setViewTranslationRequests + * @removed + */ @DataClass.Generated.Member @Override @Deprecated diff --git a/core/java/android/view/translation/TranslationResponse.java b/core/java/android/view/translation/TranslationResponse.java index 7d23e1976837..b77f2e282650 100644 --- a/core/java/android/view/translation/TranslationResponse.java +++ b/core/java/android/view/translation/TranslationResponse.java @@ -367,6 +367,7 @@ public final class TranslationResponse implements Parcelable { /** * The translation result status code. + * @removed */ @DataClass.Generated.Member @Override @@ -447,7 +448,7 @@ public final class TranslationResponse implements Parcelable { } @DataClass.Generated( - time = 1620089618357L, + time = 1621972659130L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/view/translation/TranslationResponse.java", inputSignatures = "public static final int TRANSLATION_STATUS_SUCCESS\npublic static final int TRANSLATION_STATUS_UNKNOWN_ERROR\npublic static final int TRANSLATION_STATUS_CONTEXT_UNSUPPORTED\nprivate final @android.view.translation.TranslationResponse.TranslationStatus int mTranslationStatus\nprivate final @android.annotation.NonNull android.util.SparseArray<android.view.translation.TranslationResponseValue> mTranslationResponseValues\nprivate final @android.annotation.NonNull android.util.SparseArray<android.view.translation.ViewTranslationResponse> mViewTranslationResponses\nprivate final boolean mFinalResponse\nprivate static android.util.SparseArray<android.view.translation.TranslationResponseValue> defaultTranslationResponseValues()\nprivate static android.util.SparseArray<android.view.translation.ViewTranslationResponse> defaultViewTranslationResponses()\nprivate static boolean defaultFinalResponse()\nclass TranslationResponse extends java.lang.Object implements [android.os.Parcelable]\npublic abstract @java.lang.Deprecated android.view.translation.TranslationResponse.Builder setTranslationStatus(int)\npublic @android.annotation.NonNull @java.lang.SuppressWarnings android.view.translation.TranslationResponse.Builder setTranslationResponseValue(int,android.view.translation.TranslationResponseValue)\npublic @android.annotation.NonNull @java.lang.SuppressWarnings android.view.translation.TranslationResponse.Builder setViewTranslationResponse(int,android.view.translation.ViewTranslationResponse)\nclass BaseBuilder extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genBuilder=true, genToString=true, genHiddenConstDefs=true)\npublic abstract @java.lang.Deprecated android.view.translation.TranslationResponse.Builder setTranslationStatus(int)\npublic @android.annotation.NonNull @java.lang.SuppressWarnings android.view.translation.TranslationResponse.Builder setTranslationResponseValue(int,android.view.translation.TranslationResponseValue)\npublic @android.annotation.NonNull @java.lang.SuppressWarnings android.view.translation.TranslationResponse.Builder setViewTranslationResponse(int,android.view.translation.ViewTranslationResponse)\nclass BaseBuilder extends java.lang.Object implements []") diff --git a/core/java/android/view/translation/TranslationResponseValue.java b/core/java/android/view/translation/TranslationResponseValue.java index a68ae5658b37..e2ef5d341c82 100644 --- a/core/java/android/view/translation/TranslationResponseValue.java +++ b/core/java/android/view/translation/TranslationResponseValue.java @@ -49,7 +49,24 @@ public final class TranslationResponseValue implements Parcelable { * <p>The dictionary definitions consists of groups of terms keyed by their corresponding parts * of speech. This map-like structure is stored in a {@link Bundle}. The individual parts of * speech can be traversed by {@link Bundle#keySet()} and used to get the corresponding list - * of terms as {@link CharSequence}s.</p> + * of terms as {@link CharSequence}s. + * + * <ul> + * <li>"noun" -> ["def1", "def2", ...]</li> + * <li>"verb" -> ["def3", "def4", ...]</li> + * <li>...</li> + * </ul> + * + * The set of parts of speech can then be used by + * {@link Bundle#getCharSequenceArrayList(String)} to get the list of terms. + * + * <b>Example</b>: + * + * {@code for (String partOfSpeech : extras.getBundle(EXTRA_DEFINITIONS).keySet()) { + * ArrayList<CharSequence> terms = + * extras.getBundle(EXTRA_DEFINITIONS).getCharSequenceArrayList(partOfSpeech); + * ... + * }}</p> */ public static final String EXTRA_DEFINITIONS = "android.view.translation.extra.DEFINITIONS"; @@ -70,7 +87,8 @@ public final class TranslationResponseValue implements Parcelable { /** * Extra results associated with the translated text. * - * <p>The bundle includes {@link #EXTRA_DEFINITIONS}, obtained by {@link Bundle#getBundle}.</p> + * <p>The bundle includes {@link #EXTRA_DEFINITIONS}, obtained by {@link Bundle#getBundle}. + * </p> */ @NonNull private final Bundle mExtras; @@ -190,7 +208,8 @@ public final class TranslationResponseValue implements Parcelable { /** * Extra results associated with the translated text. * - * <p>The bundle includes {@link #EXTRA_DEFINITIONS}, obtained by {@link Bundle#getBundle}.</p> + * <p>The bundle includes {@link #EXTRA_DEFINITIONS}, obtained by {@link Bundle#getBundle}. + * </p> */ @DataClass.Generated.Member public @NonNull Bundle getExtras() { @@ -370,7 +389,8 @@ public final class TranslationResponseValue implements Parcelable { /** * Extra results associated with the translated text. * - * <p>The bundle includes {@link #EXTRA_DEFINITIONS}, obtained by {@link Bundle#getBundle}.</p> + * <p>The bundle includes {@link #EXTRA_DEFINITIONS}, obtained by {@link Bundle#getBundle}. + * </p> */ @DataClass.Generated.Member public @NonNull Builder setExtras(@NonNull Bundle value) { @@ -423,7 +443,7 @@ public final class TranslationResponseValue implements Parcelable { } @DataClass.Generated( - time = 1621034223313L, + time = 1621623218037L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/view/translation/TranslationResponseValue.java", inputSignatures = "public static final int STATUS_SUCCESS\npublic static final int STATUS_ERROR\npublic static final java.lang.String EXTRA_DEFINITIONS\nprivate final @android.view.translation.TranslationResponseValue.Status int mStatusCode\nprivate final @android.annotation.Nullable java.lang.CharSequence mText\nprivate final @android.annotation.NonNull android.os.Bundle mExtras\nprivate final @android.annotation.Nullable java.lang.CharSequence mTransliteration\npublic static @android.annotation.NonNull android.view.translation.TranslationResponseValue forError()\nprivate static java.lang.CharSequence defaultText()\nprivate static android.os.Bundle defaultExtras()\nprivate static java.lang.CharSequence defaultTransliteration()\nclass TranslationResponseValue extends java.lang.Object implements [android.os.Parcelable]\nclass BaseBuilder extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genBuilder=true, genToString=true, genEqualsHashCode=true, genHiddenConstDefs=true)\nclass BaseBuilder extends java.lang.Object implements []") diff --git a/core/java/android/widget/AnalogClock.java b/core/java/android/widget/AnalogClock.java index 5bb8a8eccf50..40cce7c34049 100644 --- a/core/java/android/widget/AnalogClock.java +++ b/core/java/android/widget/AnalogClock.java @@ -18,6 +18,7 @@ package android.widget; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.AppGlobals; import android.compat.annotation.UnsupportedAppUsage; import android.content.BroadcastReceiver; import android.content.Context; @@ -61,8 +62,9 @@ import java.util.Locale; @Deprecated public class AnalogClock extends View { private static final String LOG_TAG = "AnalogClock"; + /** How many times per second that the seconds hand advances. */ - private static final long SECONDS_HAND_FPS = 30; + private final int mSecondsHandFps; private Clock mClock; @Nullable @@ -106,6 +108,10 @@ public class AnalogClock extends View { public AnalogClock(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); + mSecondsHandFps = AppGlobals.getIntCoreSetting( + WidgetFlags.KEY_ANALOG_CLOCK_SECONDS_HAND_FPS, + WidgetFlags.ANALOG_CLOCK_SECONDS_HAND_FPS_DEFAULT); + final TypedArray a = context.obtainStyledAttributes( attrs, com.android.internal.R.styleable.AnalogClock, defStyleAttr, defStyleRes); saveAttributeDataForStyleable(context, com.android.internal.R.styleable.AnalogClock, @@ -743,7 +749,7 @@ public class AnalogClock extends View { // n positions between two given numbers, where n is the number of ticks per second. This // ensures the second hand advances by a consistent distance despite our handler callbacks // occurring at inconsistent frequencies. - mSeconds = Math.round(rawSeconds * SECONDS_HAND_FPS) / (float) SECONDS_HAND_FPS; + mSeconds = Math.round(rawSeconds * mSecondsHandFps) / (float) mSecondsHandFps; mMinutes = localTime.getMinute() + mSeconds / 60.0f; mHour = localTime.getHour() + mMinutes / 60.0f; mChanged = true; @@ -781,7 +787,7 @@ public class AnalogClock extends View { // How many milliseconds through the second we currently are. long millisOfSecond = Duration.ofNanos(localTime.getNano()).toMillis(); // How many milliseconds there are between tick positions for the seconds hand. - double millisPerTick = 1000 / (double) SECONDS_HAND_FPS; + double millisPerTick = 1000 / (double) mSecondsHandFps; // How many milliseconds we are past the last tick position. long millisPastLastTick = Math.round(millisOfSecond % millisPerTick); // How many milliseconds there are until the next tick position. diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java index 7c04b1cc195b..6b3a698f118d 100644 --- a/core/java/android/widget/SpellChecker.java +++ b/core/java/android/widget/SpellChecker.java @@ -375,6 +375,13 @@ public class SpellChecker implements SpellCheckerSessionListener { final int sequenceNumber = suggestionsInfo.getSequence(); for (int k = 0; k < mLength; ++k) { if (sequenceNumber == mIds[k]) { + final SpellCheckSpan spellCheckSpan = mSpellCheckSpans[k]; + final int spellCheckSpanStart = editable.getSpanStart(spellCheckSpan); + if (spellCheckSpanStart < 0) { + // Skips the suggestion if the matched span has been removed. + return null; + } + final int attributes = suggestionsInfo.getSuggestionsAttributes(); final boolean isInDictionary = ((attributes & SuggestionsInfo.RESULT_ATTR_IN_THE_DICTIONARY) > 0); @@ -383,7 +390,11 @@ public class SpellChecker implements SpellCheckerSessionListener { final boolean looksLikeGrammarError = ((attributes & SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_GRAMMAR_ERROR) > 0); - final SpellCheckSpan spellCheckSpan = mSpellCheckSpans[k]; + // Validates the suggestions range in case the SpellCheckSpan is out-of-date but not + // removed as expected. + if (spellCheckSpanStart + offset + length > editable.length()) { + return spellCheckSpan; + } //TODO: we need to change that rule for results from a sentence-level spell // checker that will probably be in dictionary. if (!isInDictionary && (looksLikeTypo || looksLikeGrammarError)) { @@ -393,7 +404,6 @@ public class SpellChecker implements SpellCheckerSessionListener { // Valid word -- isInDictionary || !looksLikeTypo // Allow the spell checker to remove existing misspelled span by // overwriting the span over the same place - final int spellCheckSpanStart = editable.getSpanStart(spellCheckSpan); final int spellCheckSpanEnd = editable.getSpanEnd(spellCheckSpan); final int start; final int end; @@ -461,7 +471,6 @@ public class SpellChecker implements SpellCheckerSessionListener { @Override public void onGetSentenceSuggestions(SentenceSuggestionsInfo[] results) { final Editable editable = (Editable) mTextView.getText(); - final int sentenceLength = editable.length(); for (int i = 0; i < results.length; ++i) { final SentenceSuggestionsInfo ssi = results[i]; if (ssi == null) { @@ -475,9 +484,6 @@ public class SpellChecker implements SpellCheckerSessionListener { } final int offset = ssi.getOffsetAt(j); final int length = ssi.getLengthAt(j); - if (offset < 0 || offset + length > sentenceLength) { - continue; - } final SpellCheckSpan scs = onGetSuggestionsInternal( suggestionsInfo, offset, length); if (spellCheckSpan == null && scs != null) { @@ -821,7 +827,7 @@ public class SpellChecker implements SpellCheckerSessionListener { // The offset should be rounded up to word boundary. int uncheckedLength = sentenceEnd - textChangeStart; if (uncheckedLength > MAX_SENTENCE_LENGTH) { - sentenceEnd = findSeparator(sequence, sentenceStart + MAX_SENTENCE_LENGTH, + sentenceEnd = findSeparator(sequence, textChangeStart + MAX_SENTENCE_LENGTH, sentenceEnd); sentenceStart = roundUpToWordStart(sequence, textChangeStart, sentenceStart); } else { @@ -829,7 +835,7 @@ public class SpellChecker implements SpellCheckerSessionListener { sentenceStart); } } - return new Range(sentenceStart, sentenceEnd); + return new Range<>(sentenceStart, Math.max(sentenceStart, sentenceEnd)); } private int roundUpToWordStart(CharSequence sequence, int position, int frontBoundary) { diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 9959510d5ac0..3c4fd5e93580 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -10750,12 +10750,15 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener Editable text = (Editable) mText; T[] spans = text.getSpans(start, end, type); - final int length = spans.length; - for (int i = 0; i < length; i++) { - final int spanStart = text.getSpanStart(spans[i]); - final int spanEnd = text.getSpanEnd(spans[i]); - if (spanEnd == start || spanStart == end) break; - text.removeSpan(spans[i]); + ArrayList<T> spansToRemove = new ArrayList<>(); + for (T span : spans) { + final int spanStart = text.getSpanStart(span); + final int spanEnd = text.getSpanEnd(span); + if (spanEnd == start || spanStart == end) continue; + spansToRemove.add(span); + } + for (T span : spansToRemove) { + text.removeSpan(span); } } diff --git a/core/java/android/widget/WidgetFlags.java b/core/java/android/widget/WidgetFlags.java index 1a493653d811..097126807f71 100644 --- a/core/java/android/widget/WidgetFlags.java +++ b/core/java/android/widget/WidgetFlags.java @@ -199,6 +199,17 @@ public final class WidgetFlags { */ public static final float MAGNIFIER_ASPECT_RATIO_DEFAULT = 5.5f; + /** The flag of the fps of the analog clock seconds hand. */ + public static final String ANALOG_CLOCK_SECONDS_HAND_FPS = + "AnalogClockFeature__analog_clock_seconds_hand_fps"; + + /** The key name used in app core settings for {@link #ANALOG_CLOCK_SECONDS_HAND_FPS}. */ + public static final String KEY_ANALOG_CLOCK_SECONDS_HAND_FPS = + "widget__analog_clock_seconds_hand_fps"; + + /** Default value for the flag {@link #ANALOG_CLOCK_SECONDS_HAND_FPS}. */ + public static final int ANALOG_CLOCK_SECONDS_HAND_FPS_DEFAULT = 1; + private WidgetFlags() { } } diff --git a/core/java/android/window/SplashScreen.java b/core/java/android/window/SplashScreen.java index 7d222dbe7bd2..42a58fb65e39 100644 --- a/core/java/android/window/SplashScreen.java +++ b/core/java/android/window/SplashScreen.java @@ -220,7 +220,13 @@ public interface SplashScreen { } } - public void dispatchOnExitAnimation(IBinder token, SplashScreenView view) { + public void handOverSplashScreenView(@NonNull IBinder token, + @NonNull SplashScreenView splashScreenView) { + transferSurface(splashScreenView); + dispatchOnExitAnimation(token, splashScreenView); + } + + private void dispatchOnExitAnimation(IBinder token, SplashScreenView view) { synchronized (mGlobalLock) { final SplashScreenImpl impl = findImpl(token); if (impl == null) { @@ -240,5 +246,9 @@ public interface SplashScreen { return impl != null && impl.mExitAnimationListener != null; } } + + private void transferSurface(@NonNull SplashScreenView splashScreenView) { + splashScreenView.transferSurface(); + } } } diff --git a/core/java/android/window/SplashScreenView.java b/core/java/android/window/SplashScreenView.java index 6d7163909492..000dfb2bfa59 100644 --- a/core/java/android/window/SplashScreenView.java +++ b/core/java/android/window/SplashScreenView.java @@ -30,6 +30,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; @@ -38,13 +39,17 @@ import android.os.Parcelable; import android.os.Trace; import android.util.AttributeSet; import android.util.Log; +import android.view.Gravity; import android.view.LayoutInflater; +import android.view.SurfaceControlViewHost; +import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowInsetsController; import android.view.WindowManager; import android.widget.FrameLayout; +import android.widget.ImageView; import com.android.internal.R; import com.android.internal.policy.DecorView; @@ -92,6 +97,14 @@ public final class SplashScreenView extends FrameLayout { // The host activity when transfer view to it. private Activity mHostActivity; + + @Nullable + private SurfaceControlViewHost.SurfacePackage mSurfacePackageCopy; + @Nullable + private SurfaceControlViewHost.SurfacePackage mSurfacePackage; + @Nullable + private SurfaceView mSurfaceView; + // cache original window and status private Window mWindow; private int mAppWindowFlags; @@ -114,6 +127,7 @@ public final class SplashScreenView extends FrameLayout { private @ColorInt int mIconBackground; private Bitmap mParceledIconBitmap; private Drawable mIconDrawable; + private SurfaceControlViewHost.SurfacePackage mSurfacePackage; private int mBrandingImageWidth; private int mBrandingImageHeight; private Drawable mBrandingDrawable; @@ -133,7 +147,10 @@ public final class SplashScreenView extends FrameLayout { mIconSize = parcelable.getIconSize(); mBackgroundColor = parcelable.getBackgroundColor(); mIconBackground = parcelable.getIconBackground(); - if (parcelable.mIconBitmap != null) { + mSurfacePackage = parcelable.mSurfacePackage; + if (mSurfacePackage == null && parcelable.mIconBitmap != null) { + // We only create a Bitmap copies of immobile icons since animated icon are using + // a surface view mIconDrawable = new BitmapDrawable(mContext.getResources(), parcelable.mIconBitmap); mParceledIconBitmap = parcelable.mIconBitmap; } @@ -145,6 +162,9 @@ public final class SplashScreenView extends FrameLayout { } mIconAnimationStart = Instant.ofEpochMilli(parcelable.mIconAnimationStartMillis); mIconAnimationDuration = Duration.ofMillis(parcelable.mIconAnimationDurationMillis); + if (DEBUG) { + Log.d(TAG, String.format("Building from parcel drawable: %s", mIconDrawable)); + } return this; } @@ -167,7 +187,7 @@ public final class SplashScreenView extends FrameLayout { /** * Set the Drawable object to fill the center view. */ - public Builder setCenterViewDrawable(Drawable drawable) { + public Builder setCenterViewDrawable(@Nullable Drawable drawable) { mIconDrawable = drawable; return this; } @@ -191,7 +211,7 @@ public final class SplashScreenView extends FrameLayout { /** * Set the Drawable object and size for the branding view. */ - public Builder setBrandingDrawable(Drawable branding, int width, int height) { + public Builder setBrandingDrawable(@Nullable Drawable branding, int width, int height) { mBrandingDrawable = branding; mBrandingImageWidth = width; mBrandingImageHeight = height; @@ -209,22 +229,30 @@ public final class SplashScreenView extends FrameLayout { view.mInitBackgroundColor = mBackgroundColor; view.mInitIconBackgroundColor = mIconBackground; view.setBackgroundColor(mBackgroundColor); - view.mIconView = view.findViewById(R.id.splashscreen_icon_view); + view.mBrandingImageView = view.findViewById(R.id.splashscreen_branding_view); + // center icon - if (mIconSize != 0) { - final ViewGroup.LayoutParams params = view.mIconView.getLayoutParams(); - params.width = mIconSize; - params.height = mIconSize; - view.mIconView.setLayoutParams(params); - } - if (mIconDrawable != null) { - view.mIconView.setBackground(mIconDrawable); + if (mIconDrawable instanceof SplashScreenView.IconAnimateListener + || mSurfacePackage != null) { + view.mIconView = createSurfaceView(view); view.initIconAnimation(mIconDrawable, mIconAnimationDuration != null ? mIconAnimationDuration.toMillis() : 0); + view.mIconAnimationStart = mIconAnimationStart; + view.mIconAnimationDuration = mIconAnimationDuration; + } else { + view.mIconView = view.findViewById(R.id.splashscreen_icon_view); + if (mIconSize != 0) { + final ViewGroup.LayoutParams params = view.mIconView.getLayoutParams(); + params.width = mIconSize; + params.height = mIconSize; + view.mIconView.setLayoutParams(params); + if (mIconDrawable != null) { + view.mIconView.setBackground(mIconDrawable); + } + } } - view.mIconAnimationStart = mIconAnimationStart; - view.mIconAnimationDuration = mIconAnimationDuration; + if (mParceledIconBitmap != null) { view.mParceledIconBitmap = mParceledIconBitmap; } @@ -242,14 +270,60 @@ public final class SplashScreenView extends FrameLayout { view.mParceledBrandingBitmap = mParceledBrandingBitmap; } if (DEBUG) { - Log.d(TAG, " build " + view + " Icon: view: " + view.mIconView + " drawable: " - + mIconDrawable + " size: " + mIconSize + "\n Branding: view: " - + view.mBrandingImageView + " drawable: " + mBrandingDrawable - + " size w: " + mBrandingImageWidth + " h: " + mBrandingImageHeight); + Log.d(TAG, "Build " + view + + "\nIcon: view: " + view.mIconView + " drawable: " + + mIconDrawable + " size: " + mIconSize + + "\nBranding: view: " + view.mBrandingImageView + " drawable: " + + mBrandingDrawable + " size w: " + mBrandingImageWidth + " h: " + + mBrandingImageHeight); } Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); return view; } + + private SurfaceView createSurfaceView(@NonNull SplashScreenView view) { + final SurfaceView surfaceView = new SurfaceView(view.getContext()); + if (mSurfacePackage == null) { + if (DEBUG) { + Log.d(TAG, + "Creating Original SurfacePackage. SurfaceView: " + surfaceView); + } + + SurfaceControlViewHost viewHost = new SurfaceControlViewHost(mContext, + mContext.getDisplay(), + surfaceView.getHostToken()); + ImageView imageView = new ImageView(mContext); + imageView.setBackground(mIconDrawable); + viewHost.setView(imageView, mIconSize, mIconSize); + SurfaceControlViewHost.SurfacePackage surfacePackage = viewHost.getSurfacePackage(); + surfaceView.setChildSurfacePackage(surfacePackage); + view.mSurfacePackage = surfacePackage; + view.mSurfacePackageCopy = new SurfaceControlViewHost.SurfacePackage( + surfacePackage); + } else { + if (DEBUG) { + Log.d(TAG, "Using copy of SurfacePackage in the client"); + } + view.mSurfacePackage = mSurfacePackage; + } + if (mIconSize != 0) { + LayoutParams lp = new FrameLayout.LayoutParams(mIconSize, mIconSize); + lp.gravity = Gravity.CENTER; + surfaceView.setLayoutParams(lp); + if (DEBUG) { + Log.d(TAG, "Icon size " + mIconSize); + } + } + + // We ensure that we can blend the alpha of the surface view with the SplashScreenView + surfaceView.setUseAlpha(); + surfaceView.setZOrderOnTop(true); + surfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT); + + view.addView(surfaceView); + view.mSurfaceView = surfaceView; + return surfaceView; + } } /** @hide */ @@ -298,6 +372,35 @@ public final class SplashScreenView extends FrameLayout { } /** + * Called when this {@link SplashScreenView} has been copied to be transferred to the client. + * + * @hide + */ + public void onCopied() { + if (mSurfaceView == null) { + return; + } + if (DEBUG) { + Log.d(TAG, "Setting SurfaceView's SurfacePackage to null."); + } + // If we don't release the surface package, the surface will be reparented to this + // surface view. So once it's copied into the client process, we release it. + mSurfacePackage.release(); + mSurfacePackage = null; + } + + @Override + public void setAlpha(float alpha) { + super.setAlpha(alpha); + + // The surface view's alpha is not multiplied with the containing view's alpha, so we + // manually do it here + if (mSurfaceView != null) { + mSurfaceView.setAlpha(mSurfaceView.getAlpha() * alpha); + } + } + + /** * Returns the duration of the icon animation if icon is animatable. * * @see android.R.attr#windowSplashScreenAnimatedIcon @@ -316,6 +419,22 @@ public final class SplashScreenView extends FrameLayout { return mIconAnimationStart; } + + void transferSurface() { + if (mSurfacePackage == null) { + return; + } + if (DEBUG) { + mSurfacePackage.getSurfaceControl().addOnReparentListener( + (transaction, parent) -> Log.e(TAG, + String.format("SurfacePackage'surface reparented.\n Parent: %s", + parent), new Throwable())); + Log.d(TAG, "Transferring surface " + mSurfaceView.toString()); + } + mSurfaceView.setChildSurfacePackage(mSurfacePackage); + + } + void initIconAnimation(Drawable iconDrawable, long duration) { if (!(iconDrawable instanceof IconAnimateListener)) { return; @@ -477,7 +596,7 @@ public final class SplashScreenView extends FrameLayout { private int mBackgroundColor; private int mIconBackground; - private Bitmap mIconBitmap; + private Bitmap mIconBitmap = null; private int mBrandingWidth; private int mBrandingHeight; private Bitmap mBrandingBitmap; @@ -485,14 +604,20 @@ public final class SplashScreenView extends FrameLayout { private long mIconAnimationStartMillis; private long mIconAnimationDurationMillis; + private SurfaceControlViewHost.SurfacePackage mSurfacePackage; + public SplashScreenViewParcelable(SplashScreenView view) { - ViewGroup.LayoutParams params = view.getIconView().getLayoutParams(); - mIconSize = params.height; + mIconSize = view.mIconView.getWidth(); mBackgroundColor = view.getInitBackgroundColor(); mIconBackground = view.getIconBackgroundColor(); - mIconBitmap = copyDrawable(view.getIconView().getBackground()); + mSurfacePackage = view.mSurfacePackageCopy; + if (mSurfacePackage == null) { + // We only need to copy the drawable if we are not using a SurfaceView + mIconBitmap = copyDrawable(view.getIconView().getBackground()); + } mBrandingBitmap = copyDrawable(view.getBrandingView().getBackground()); - params = view.getBrandingView().getLayoutParams(); + + ViewGroup.LayoutParams params = view.getBrandingView().getLayoutParams(); mBrandingWidth = params.width; mBrandingHeight = params.height; @@ -535,6 +660,7 @@ public final class SplashScreenView extends FrameLayout { mIconAnimationStartMillis = source.readLong(); mIconAnimationDurationMillis = source.readLong(); mIconBackground = source.readInt(); + mSurfacePackage = source.readTypedObject(SurfaceControlViewHost.SurfacePackage.CREATOR); } @Override @@ -553,6 +679,7 @@ public final class SplashScreenView extends FrameLayout { dest.writeLong(mIconAnimationStartMillis); dest.writeLong(mIconAnimationDurationMillis); dest.writeInt(mIconBackground); + dest.writeTypedObject(mSurfacePackage, flags); } public static final @NonNull Parcelable.Creator<SplashScreenViewParcelable> CREATOR = diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 862c9001e380..28c2774cabb0 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -1093,6 +1093,7 @@ public class ChooserActivity extends ResolverActivity implements "", -1); + setResult(RESULT_OK); finish(); } } diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java index 0d041c4440d2..e693d9dd9a7d 100644 --- a/core/java/com/android/internal/os/CpuPowerCalculator.java +++ b/core/java/com/android/internal/os/CpuPowerCalculator.java @@ -201,7 +201,10 @@ public class CpuPowerCalculator extends PowerCalculator { result.packageWithHighestDrain = packageWithHighestDrain; } - private double calculateUidModeledPowerMah(BatteryStats.Uid u, int statsType) { + /** + * Calculates CPU power consumed by the specified app, using the PowerProfile model. + */ + public double calculateUidModeledPowerMah(BatteryStats.Uid u, int statsType) { // Constant battery drain when CPU is active double powerMah = calculateActiveCpuPowerMah(u.getCpuActiveTime()); diff --git a/core/java/com/android/internal/os/SystemServicePowerCalculator.java b/core/java/com/android/internal/os/SystemServicePowerCalculator.java index a26abc2ffab0..b4a2b637cae8 100644 --- a/core/java/com/android/internal/os/SystemServicePowerCalculator.java +++ b/core/java/com/android/internal/os/SystemServicePowerCalculator.java @@ -40,8 +40,10 @@ public class SystemServicePowerCalculator extends PowerCalculator { // to this layout: // {cluster1-speed1, cluster1-speed2, ..., cluster2-speed1, cluster2-speed2, ...} private final UsageBasedPowerEstimator[] mPowerEstimators; + private final CpuPowerCalculator mCpuPowerCalculator; public SystemServicePowerCalculator(PowerProfile powerProfile) { + mCpuPowerCalculator = new CpuPowerCalculator(powerProfile); int numFreqs = 0; final int numCpuClusters = powerProfile.getNumCpuClusters(); for (int cluster = 0; cluster < numCpuClusters; cluster++) { @@ -62,7 +64,22 @@ public class SystemServicePowerCalculator extends PowerCalculator { @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { - double systemServicePowerMah = calculateSystemServicePower(batteryStats); + final BatteryStats.Uid systemUid = batteryStats.getUidStats().get(Process.SYSTEM_UID); + if (systemUid == null) { + return; + } + + final long consumptionUC = systemUid.getCpuMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC, query); + + double systemServicePowerMah; + if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { + systemServicePowerMah = calculatePowerUsingMeasuredConsumption(batteryStats, + systemUid, consumptionUC); + } else { + systemServicePowerMah = calculatePowerUsingPowerProfile(batteryStats); + } + final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders = builder.getUidBatteryConsumerBuilders(); final UidBatteryConsumer.Builder systemServerConsumer = uidBatteryConsumerBuilders.get( @@ -76,7 +93,7 @@ public class SystemServicePowerCalculator extends PowerCalculator { // distributed to applications systemServerConsumer.setConsumedPower( BatteryConsumer.POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS, - -systemServicePowerMah); + -systemServicePowerMah, powerModel); } for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { @@ -84,7 +101,8 @@ public class SystemServicePowerCalculator extends PowerCalculator { if (app != systemServerConsumer) { final BatteryStats.Uid uid = app.getBatteryStatsUid(); app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES, - systemServicePowerMah * uid.getProportionalSystemServiceUsage()); + systemServicePowerMah * uid.getProportionalSystemServiceUsage(), + powerModel); } } @@ -102,7 +120,20 @@ public class SystemServicePowerCalculator extends PowerCalculator { public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { - double systemServicePowerMah = calculateSystemServicePower(batteryStats); + final BatteryStats.Uid systemUid = batteryStats.getUidStats().get(Process.SYSTEM_UID); + if (systemUid == null) { + return; + } + + final long consumptionUC = systemUid.getCpuMeasuredBatteryConsumptionUC(); + double systemServicePowerMah; + if (getPowerModel(consumptionUC) == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { + systemServicePowerMah = calculatePowerUsingMeasuredConsumption(batteryStats, + systemUid, consumptionUC); + } else { + systemServicePowerMah = calculatePowerUsingPowerProfile(batteryStats); + } + BatterySipper systemServerSipper = null; for (int i = sippers.size() - 1; i >= 0; i--) { final BatterySipper app = sippers.get(i); @@ -134,7 +165,21 @@ public class SystemServicePowerCalculator extends PowerCalculator { } } - private double calculateSystemServicePower(BatteryStats batteryStats) { + private double calculatePowerUsingMeasuredConsumption(BatteryStats batteryStats, + BatteryStats.Uid systemUid, long consumptionUC) { + // Use the PowerProfile based model to estimate the ratio between the power consumed + // while handling incoming binder calls and the entire System UID power consumption. + // Apply that ratio to the _measured_ system UID power consumption to get a more + // accurate estimate of the power consumed by incoming binder calls. + final double systemServiceModeledPowerMah = calculatePowerUsingPowerProfile(batteryStats); + final double systemUidModeledPowerMah = mCpuPowerCalculator.calculateUidModeledPowerMah( + systemUid, BatteryStats.STATS_SINCE_CHARGED); + + return uCtoMah(consumptionUC) * systemServiceModeledPowerMah + / systemUidModeledPowerMah; + } + + private double calculatePowerUsingPowerProfile(BatteryStats batteryStats) { final long[] systemServiceTimeAtCpuSpeeds = batteryStats.getSystemServiceTimeAtCpuSpeeds(); if (systemServiceTimeAtCpuSpeeds == null) { return 0; @@ -145,13 +190,12 @@ public class SystemServicePowerCalculator extends PowerCalculator { double powerMah = 0; final int size = Math.min(mPowerEstimators.length, systemServiceTimeAtCpuSpeeds.length); for (int i = 0; i < size; i++) { - powerMah += mPowerEstimators[i].calculatePower(systemServiceTimeAtCpuSpeeds[i]); + powerMah += mPowerEstimators[i].calculatePower(systemServiceTimeAtCpuSpeeds[i] / 1000); } if (DEBUG) { Log.d(TAG, "System service power:" + powerMah); } - return powerMah; } } diff --git a/core/java/com/android/internal/util/ContrastColorUtil.java b/core/java/com/android/internal/util/ContrastColorUtil.java index 8508a8dd71a4..8b3c1337c0c8 100644 --- a/core/java/com/android/internal/util/ContrastColorUtil.java +++ b/core/java/com/android/internal/util/ContrastColorUtil.java @@ -595,7 +595,9 @@ public class ContrastColorUtil { if (backgroundColor == Notification.COLOR_DEFAULT) { return !defaultBackgroundIsDark; } - return ColorUtilsFromCompat.calculateLuminance(backgroundColor) > 0.5; + // Color contrast ratio luminance midpoint, X: 1.05 / (X + 0.05) = (X + 0.05) / 0.05 + // Solved as X = sqrt(.05 * 1.05) - 0.05 = 0.17912878474 + return ColorUtilsFromCompat.calculateLuminance(backgroundColor) > 0.17912878474; } public static double calculateLuminance(int backgroundColor) { @@ -619,6 +621,7 @@ public class ContrastColorUtil { } public static boolean isColorLight(int backgroundColor) { + // TODO(b/188947832): Use 0.17912878474 instead of 0.5 to ensure better contrast return calculateLuminance(backgroundColor) > 0.5f; } diff --git a/core/jni/Android.bp b/core/jni/Android.bp index 1f805c94d51c..146863342f47 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -128,6 +128,7 @@ cc_library_shared { "android_graphics_BLASTBufferQueue.cpp", "android_view_SurfaceSession.cpp", "android_view_TextureView.cpp", + "android_view_TunnelModeEnabledListener.cpp", "android_view_VelocityTracker.cpp", "android_view_VerifiedKeyEvent.cpp", "android_view_VerifiedMotionEvent.cpp", diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index f76cccb65973..7e8fc7e6ba4f 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -127,6 +127,7 @@ extern int register_android_view_SurfaceControlHdrLayerInfoListener(JNIEnv* env) extern int register_android_view_SurfaceSession(JNIEnv* env); extern int register_android_view_CompositionSamplingListener(JNIEnv* env); extern int register_android_view_TextureView(JNIEnv* env); +extern int register_android_view_TunnelModeEnabledListener(JNIEnv* env); extern int register_android_database_CursorWindow(JNIEnv* env); extern int register_android_database_SQLiteConnection(JNIEnv* env); extern int register_android_database_SQLiteGlobal(JNIEnv* env); @@ -1521,6 +1522,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_view_SurfaceSession), REG_JNI(register_android_view_CompositionSamplingListener), REG_JNI(register_android_view_TextureView), + REG_JNI(register_android_view_TunnelModeEnabledListener), REG_JNI(register_com_google_android_gles_jni_EGLImpl), REG_JNI(register_com_google_android_gles_jni_GLImpl), REG_JNI(register_android_opengl_jni_EGL14), diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp index 3acbd1ecd16e..787d34822ef7 100644 --- a/core/jni/android_os_Parcel.cpp +++ b/core/jni/android_os_Parcel.cpp @@ -36,7 +36,6 @@ #include <utils/List.h> #include <utils/KeyedVector.h> #include <binder/Parcel.h> -#include <binder/ParcelRef.h> #include <binder/ProcessState.h> #include <binder/IServiceManager.h> #include <utils/threads.h> @@ -516,9 +515,8 @@ static jobject android_os_Parcel_readFileDescriptor(JNIEnv* env, jclass clazz, j static jlong android_os_Parcel_create(JNIEnv* env, jclass clazz) { - sp<ParcelRef> parcelRef = ParcelRef::create(); - parcelRef->incStrong(reinterpret_cast<const void*>(android_os_Parcel_create)); - return reinterpret_cast<jlong>(static_cast<Parcel *>(parcelRef.get())); + Parcel* parcel = new Parcel(); + return reinterpret_cast<jlong>(parcel); } static void android_os_Parcel_freeBuffer(JNIEnv* env, jclass clazz, jlong nativePtr) @@ -531,8 +529,8 @@ static void android_os_Parcel_freeBuffer(JNIEnv* env, jclass clazz, jlong native static void android_os_Parcel_destroy(JNIEnv* env, jclass clazz, jlong nativePtr) { - ParcelRef* derivative = static_cast<ParcelRef*>(reinterpret_cast<Parcel*>(nativePtr)); - derivative->decStrong(reinterpret_cast<const void*>(android_os_Parcel_create)); + Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); + delete parcel; } static jbyteArray android_os_Parcel_marshall(JNIEnv* env, jclass clazz, jlong nativePtr) diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 29f8ccf37654..793b4eba788c 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -35,7 +35,6 @@ #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> #include <binder/Parcel.h> -#include <binder/ParcelRef.h> #include <binder/ProcessState.h> #include <binder/Stability.h> #include <binderthreadstate/CallerUtils.h> @@ -1381,8 +1380,7 @@ static bool should_time_binder_calls() { } static jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj, - jint code, jobject dataObj, jobject replyObj, jboolean replyObjOwnsNativeParcel, - jint flags) // throws RemoteException + jint code, jobject dataObj, jobject replyObj, jint flags) // throws RemoteException { if (dataObj == NULL) { jniThrowNullPointerException(env, NULL); @@ -1424,21 +1422,6 @@ static jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj, status_t err = target->transact(code, *data, reply, flags); //if (reply) printf("Transact from Java code to %p received: ", target); reply->print(); - if (reply) { - if (replyObjOwnsNativeParcel) { - // as per Parcel java class constructor, here, "reply" MUST be a "ParcelRef" - // only for Parcel that contained Binder objects - if (reply->objectsCount() > 0) { - IPCThreadState::self()->createTransactionReference(static_cast<ParcelRef*>(reply)); - } - } else { - // as per Parcel.java, if Parcel java object NOT owning native Parcel object, it will - // NOT destroy the native Parcel object upon GC(finalize()), so, there will be no race - // condtion in this case. Please refer to the java class methods: Parcel.finalize(), - // Parcel.destroy(). - } - } - if (kEnableBinderSample) { if (time_binder_calls) { conditionally_log_binder_call(start_millis, target, code); @@ -1567,7 +1550,7 @@ static const JNINativeMethod gBinderProxyMethods[] = { {"pingBinder", "()Z", (void*)android_os_BinderProxy_pingBinder}, {"isBinderAlive", "()Z", (void*)android_os_BinderProxy_isBinderAlive}, {"getInterfaceDescriptor", "()Ljava/lang/String;", (void*)android_os_BinderProxy_getInterfaceDescriptor}, - {"transactNative", "(ILandroid/os/Parcel;Landroid/os/Parcel;ZI)Z", (void*)android_os_BinderProxy_transact}, + {"transactNative", "(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z", (void*)android_os_BinderProxy_transact}, {"linkToDeath", "(Landroid/os/IBinder$DeathRecipient;I)V", (void*)android_os_BinderProxy_linkToDeath}, {"unlinkToDeath", "(Landroid/os/IBinder$DeathRecipient;I)Z", (void*)android_os_BinderProxy_unlinkToDeath}, {"getNativeFinalizer", "()J", (void*)android_os_BinderProxy_getNativeFinalizer}, diff --git a/core/jni/android_view_TunnelModeEnabledListener.cpp b/core/jni/android_view_TunnelModeEnabledListener.cpp new file mode 100644 index 000000000000..af7bae8c89dd --- /dev/null +++ b/core/jni/android_view_TunnelModeEnabledListener.cpp @@ -0,0 +1,130 @@ +/* + * Copyright 2021 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. + */ + +#define LOG_TAG "TunnelModeEnabledListener" + +#include "android_util_Binder.h" +#include "core_jni_helpers.h" + +#include <nativehelper/JNIHelp.h> + +#include <android/gui/BnTunnelModeEnabledListener.h> +#include <android_runtime/AndroidRuntime.h> +#include <android_runtime/Log.h> +#include <utils/Log.h> + +#include <gui/SurfaceComposerClient.h> +#include <ui/Rect.h> + +namespace android { + +namespace { + +struct { + jclass mClass; + jmethodID mDispatchOnTunnelModeEnabledChanged; +} gListenerClassInfo; + +struct TunnelModeEnabledListener : public gui::BnTunnelModeEnabledListener { + TunnelModeEnabledListener(JNIEnv* env, jobject listener) + : mListener(env->NewWeakGlobalRef(listener)) {} + + binder::Status onTunnelModeEnabledChanged(bool tunnelModeEnabled) override { + JNIEnv* env = AndroidRuntime::getJNIEnv(); + LOG_ALWAYS_FATAL_IF(env == nullptr, + "Unable to retrieve JNIEnv in onTunnelModeEnabledChanged."); + + jobject listener = env->NewGlobalRef(mListener); + if (listener == NULL) { + // Weak reference went out of scope + return binder::Status::ok(); + } + env->CallStaticVoidMethod(gListenerClassInfo.mClass, + gListenerClassInfo.mDispatchOnTunnelModeEnabledChanged, listener, + static_cast<jboolean>(tunnelModeEnabled)); + env->DeleteGlobalRef(listener); + + if (env->ExceptionCheck()) { + ALOGE("TunnelModeEnabledListener.onTunnelModeEnabledChanged() failed."); + LOGE_EX(env); + env->ExceptionClear(); + } + return binder::Status::ok(); + } + +protected: + virtual ~TunnelModeEnabledListener() { + JNIEnv* env = AndroidRuntime::getJNIEnv(); + env->DeleteWeakGlobalRef(mListener); + } + +private: + jweak mListener; +}; + +jlong nativeCreate(JNIEnv* env, jclass clazz, jobject obj) { + TunnelModeEnabledListener* listener = new TunnelModeEnabledListener(env, obj); + listener->incStrong((void*)nativeCreate); + return reinterpret_cast<jlong>(listener); +} + +void nativeDestroy(JNIEnv* env, jclass clazz, jlong ptr) { + TunnelModeEnabledListener* listener = reinterpret_cast<TunnelModeEnabledListener*>(ptr); + listener->decStrong((void*)nativeCreate); +} + +void nativeRegister(JNIEnv* env, jclass clazz, jlong ptr) { + sp<TunnelModeEnabledListener> listener = reinterpret_cast<TunnelModeEnabledListener*>(ptr); + if (SurfaceComposerClient::addTunnelModeEnabledListener(listener) != OK) { + constexpr auto error_msg = "Couldn't addTunnelModeEnabledListener"; + ALOGE(error_msg); + jniThrowRuntimeException(env, error_msg); + } +} + +void nativeUnregister(JNIEnv* env, jclass clazz, jlong ptr) { + sp<TunnelModeEnabledListener> listener = reinterpret_cast<TunnelModeEnabledListener*>(ptr); + + if (SurfaceComposerClient::removeTunnelModeEnabledListener(listener) != OK) { + constexpr auto error_msg = "Couldn't removeTunnelModeEnabledListener"; + ALOGE(error_msg); + jniThrowRuntimeException(env, error_msg); + } +} + +const JNINativeMethod gMethods[] = { + /* name, signature, funcPtr */ + {"nativeCreate", "(Landroid/view/TunnelModeEnabledListener;)J", (void*)nativeCreate}, + {"nativeDestroy", "(J)V", (void*)nativeDestroy}, + {"nativeRegister", "(J)V", (void*)nativeRegister}, + {"nativeUnregister", "(J)V", (void*)nativeUnregister}}; + +} // namespace + +int register_android_view_TunnelModeEnabledListener(JNIEnv* env) { + int res = jniRegisterNativeMethods(env, "android/view/TunnelModeEnabledListener", gMethods, + NELEM(gMethods)); + LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods."); + + jclass clazz = env->FindClass("android/view/TunnelModeEnabledListener"); + gListenerClassInfo.mClass = MakeGlobalRefOrDie(env, clazz); + gListenerClassInfo.mDispatchOnTunnelModeEnabledChanged = + env->GetStaticMethodID(clazz, "dispatchOnTunnelModeEnabledChanged", + "(Landroid/view/TunnelModeEnabledListener;Z)V"); + return 0; +} + +} // namespace android diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 084d4d1c0c42..f457c5626fba 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2890,7 +2890,13 @@ <permission android:name="android.permission.SET_DISPLAY_OFFSET" android:protectionLevel="signature|privileged" /> - <!-- Allows a companion app to run in the background. + <!-- Allows a companion app to run in the background. This permission implies + {@link android.Manifest.permission#REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND}, + and allows to start a foreground service from the background. + If an app does not have to run in the background, but only needs to start a foreground + service from the background, consider using + {@link android.Manifest.permission#REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND}, + which is less powerful. <p>Protection level: normal --> <permission android:name="android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND" @@ -2900,6 +2906,7 @@ <!-- Allows a companion app to start a foreground service from the background. {@see android.Manifest.permission#REQUEST_COMPANION_RUN_IN_BACKGROUND} + <p>Protection level: normal --> <permission android:name="android.permission.REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND" android:protectionLevel="normal"/> diff --git a/core/res/res/color/text_color_on_accent_device_default.xml b/core/res/res/color/text_color_on_accent_device_default.xml new file mode 100644 index 000000000000..1379523258de --- /dev/null +++ b/core/res/res/color/text_color_on_accent_device_default.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2021 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. + --> +<!-- Please see primary_text_material_light.xml --> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="false" + android:color="@color/system_neutral1_400"/> + <item android:color="@color/system_neutral1_900"/> +</selector> diff --git a/core/res/res/drawable/notification_material_media_action_background.xml b/core/res/res/drawable/notification_material_media_action_background.xml index 4f50f1519465..b4ec7fd8190c 100644 --- a/core/res/res/drawable/notification_material_media_action_background.xml +++ b/core/res/res/drawable/notification_material_media_action_background.xml @@ -16,4 +16,10 @@ --> <ripple xmlns:android="http://schemas.android.com/apk/res/android" - android:color="@color/ripple_material_light" /> + android:color="@color/ripple_material_light"> + <item android:id="@id/mask"> + <shape android:shape="oval"> + <solid android:color="#333" /> + </shape> + </item> +</ripple> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 5e28c5d1dd7a..03e32a897914 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Vingerafdrukikoon"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"bestuur Gesigslothardeware"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Laat program toe om metodes te benut om gesigtemplate vir gebruik by te voeg en uit te vee."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"gebruik Gesigslothardeware"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Laat die program toe om Gesigslothardeware vir stawing te gebruik"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Gesigslot"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Skryf jou gesig weer in"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Skryf asseblief jou gesig weer in om herkenning te verbeter"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Stel Gesigslot op"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Ontsluit jou foon deur daarna te kyk"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Stel meer maniere op om te ontsluit"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tik om \'n vingerafdruk by te voeg"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Kan nie gesig verifieer nie. Hardeware nie beskikbaar nie."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Probeer Gesigslot weer."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Kan nie nuwe gesigdata berg nie. Vee eers \'n ou een uit."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Gesighandeling is gekanselleer."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Gebruiker het Gesigslot gekanselleer."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Te veel pogings. Probeer later weer."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Te veel pogings. Gesigslot is gedeaktiveer."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Kan nie gesig verifieer nie. Probeer weer."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Jy het nie Gesigslot opgestel nie."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Gesigslot word nie op hierdie toestel gesteun nie."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor is tydelik gedeaktiveer."</string> <string name="face_name_template" msgid="3877037340223318119">"Gesig <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Gebruik Gesigslot"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Gebruik Gesigslot of Skermslot"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Gebruik jou gesig om voort te gaan"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gebruik jou gesig of skermslot om voort te gaan"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Vou ontsluitruimte uit."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Sleep-ontsluit."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Patroon ontsluit."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Gesigslot."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"PIN ontsluit."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM-PIN-ontsluiting."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM-PUK-ontsluiting."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index f0c7ad9a98ab..0c1d45697917 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"የጣት አሻራ አዶ"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"በመልክ መክፈቻ ሃርድዌርን ማስተዳደር"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"መተግበሪያው ጥቅም ላይ እንዲውሉ የፊት ቅንብር ደንቦችን ለማከል እና ለመሰረዝ የሚያስችሉ ስልቶችን እንዲያስጀምር ያስችለዋል።"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"በመልክ መክፈት ሃርድዌርን መጠቀም"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"መተግበሪያው የመልክ መክፈቻ ሃርድዌርን ለማረጋገጥ እንዲጠቀም ያስችለዋል"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"በመልክ መክፈት"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"የእርስዎን ፊት ዳግመኛ ያስመዝግቡ"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"ማንነትን ለይቶ ማወቅን ለማሻሻል፣ እባክዎ የእርስዎን ፊት ዳግም ያስመዝግቡ"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"በመልክ መክፈቻን ያቀናብሩ"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"ስልክዎን በመመልከት ያስከፍቱት"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"የሚከፍቱባቸው ተጨማሪ መንገዶችን ያቀናብሩ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"የጣት አሻራን ለማከል መታ ያድርጉ"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"መልክን ማረጋገጥ አይቻልም። ሃርድዌር የለም።"</string> - <string name="face_error_timeout" msgid="522924647742024699">"በመልክ መክፈትን እንደገና ይሞክሩ።"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"አዲስ የመልክ ውውሂብ ማስቀመጥ አልተቻለም። መጀመሪያ የድሮውን ይሰርዙት።"</string> <string name="face_error_canceled" msgid="2164434737103802131">"የፊት ሥርዓተ ክወና ተሰርዟል።"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"በመልክ መክፈት በተጠቃሚ ተሰርዟል።"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"በጣም ብዙ ሙከራዎች። በመልክ መክፈት ተሰናክሏል።"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"ፊትን ማረጋገጥ አይቻልም። እንደገና ይሞክሩ።"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"በመልክ መክፈትን አላቀናበሩም።"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"በመልክ መክፈት መስጫ በዚህ መሣሪያ ላይ አይደገፍም።"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"ዳሳሽ ለጊዜው ተሰናክሏል።"</string> <string name="face_name_template" msgid="3877037340223318119">"ፊት <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"በመልክ መክፈትን ይጠቀሙ"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"የመልክ ወይም የማያ ገጽ መቆለፊያን ይጠቀሙ"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"ለመቀጠል መልክዎን ይጠቀሙ"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ለመቀጠል መልክዎን ወይም የማያ ገጽዎን መቆለፊያ ይጠቀሙ"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"የመክፈቻ አካባቢውን አስፋፋ።"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"በማንሸራተት ክፈት።"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"በስርዓተ-ጥለት መክፈት።"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"በመልክ መክፈት።"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"በፒን መክፈት።"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"የሲም ፒን ክፈት።"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"የሲም PUK ክፈት።"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index afc7268df2da..88ad4b3f2dd6 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -621,14 +621,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"رمز بصمة الإصبع"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"إدارة أجهزة ميزة \"فتح الجهاز بالتعرف على الوجه\""</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"السماح للتطبيق باستدعاء طرق لإضافة نماذج من الوجوه وحذفها"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"استخدام أجهزة ميزة \"فتح الجهاز بالتعرف على الوجه\""</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"السماح للتطبيق باستخدام أجهزة ميزة \"فتح الجهاز بالتعرف على الوجه\" لإجراء المصادقة"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"فتح الجهاز بالتعرف على الوجه"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"إعادة تسجيل وجهك"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"لتحسين قدرة الجهاز على معرفة وجهك، يُرجى إعادة تسجيل الوجه."</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\""</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"يمكنك فتح قفل هاتفك بمجرّد النظر إلى الشاشة."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"إعداد المزيد من الطرق لفتح قفل الجهاز"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"انقر لإضافة بصمة إصبع."</string> @@ -655,18 +653,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"يتعذّر التحقُّق من الوجه. الجهاز غير مُتاح."</string> - <string name="face_error_timeout" msgid="522924647742024699">"جرِّب استخدام ميزة \"فتح الجهاز بالتعرف على الوجه\" مرة أخرى."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"يتعذَّر تخزين بيانات الوجه الجديد. احذف الوجه القديم أولاً."</string> <string name="face_error_canceled" msgid="2164434737103802131">"تمّ إلغاء عملية مصادقة الوجه."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"ألغى المستخدم ميزة \"فتح الجهاز بالتعرف على الوجه\"."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"تمّ إجراء محاولات كثيرة. أعِد المحاولة لاحقًا."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"تم إجراء محاولات كثيرة، ولذا تم إيقاف ميزة \"فتح الجهاز بالتعرف على الوجه\"."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"يتعذّر التحقق من الوجه. حاول مرة أخرى."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"لم يسبق لك إعداد ميزة \"فتح الجهاز بالتعرف على الوجه\"."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"ميزة \"فتح الجهاز بالتعرف على الوجه\" غير متوفرة بهذا الجهاز."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"تم إيقاف جهاز الاستشعار مؤقتًا."</string> <string name="face_name_template" msgid="3877037340223318119">"الوجه <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"فتح الجهاز بالتعرف على الوجه"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"استخدام ميزة \"فتح الجهاز بالتعرف على الوجه\" أو ميزة \"قفل الشاشة\""</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"استخدِم الوجه للمتابعة"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"استخدام ميزة \"فتح القفل بالوجه\" أو ميزة \"قفل الشاشة\" للمتابعة"</string> @@ -969,7 +975,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"توسيع منطقة فتح القفل."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"فتح القفل باستخدام التمرير."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"فتح القفل باستخدام النقش."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"استخدام ميزة \"فتح الجهاز بالتعرف على الوجه\""</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"فتح القفل باستخدام رمز PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"فتح قفل رقم التعريف الشخصي لشريحة SIM."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"فتح قفل مفتاح PUK لشريحة SIM."</string> @@ -2208,9 +2215,9 @@ <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"سيتم كتم صوت الهاتف عند تلقي المكالمات والإشعارات"</string> <string name="notification_channel_system_changes" msgid="2462010596920209678">"تغييرات النظام"</string> <string name="notification_channel_do_not_disturb" msgid="7832584281883687653">"عدم الإزعاج"</string> - <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"جديد: يؤدي تفعيل وضع \"الرجاء عدم الإزعاج\" إلى إخفاء الإشعارات."</string> + <string name="zen_upgrade_notification_visd_title" msgid="2001148984371968620">"جديد: يؤدي تفعيل ميزة \"عدم الإزعاج\" إلى إخفاء الإشعارات."</string> <string name="zen_upgrade_notification_visd_content" msgid="3683314609114134946">"انقر لمعرفة مزيد من المعلومات وإجراء التغيير."</string> - <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"تم تغيير وضع \"الرجاء عدم الإزعاج\"."</string> + <string name="zen_upgrade_notification_title" msgid="8198167698095298717">"تم تغيير ميزة \"عدم الإزعاج\""</string> <string name="zen_upgrade_notification_content" msgid="5228458567180124005">"انقر للاطّلاع على ما تم حظره."</string> <string name="notification_app_name_system" msgid="3045196791746735601">"النظام"</string> <string name="notification_app_name_settings" msgid="9088548800899952531">"الإعدادات"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 68c270e7a51f..9299289c7673 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ফিংগাৰপ্ৰিণ্ট আইকন"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"ফেচ আনলক হার্ডৱেৰ পৰিচালনা কৰক"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"মুখমণ্ডলৰ টেম্প্লেট যোগ কৰাৰ বা মচাৰ পদ্ধতি কামত লগাবলৈ আহ্বান কৰিবলৈ এপটোক অনুমতি দিয়ে।"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"ফেচ আনলক হার্ডৱেৰ ব্যৱহাৰ কৰক"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে এপ্ক ফেচ আনলক কৰা হাৰ্ডৱেৰ ব্যৱহাৰ কৰিবলৈ দিয়ে"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ফেচ আনলক কৰা সুবিধা"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ণ কৰক"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"চিনাক্তকৰণৰ সুবিধাটো উন্নত কৰিবলৈ, অনুগ্ৰহ কৰি আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"ফেচ আনলক সুবিধাটো ছেট আপ কৰক"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"আপোনাৰ ফ’নটোলৈ চাই সেইটো আনলক কৰক"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"আনলক কৰাৰ অধিক উপায় ছেট আপ কৰক"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"এটা ফিংগাৰপ্ৰিণ্ট যোগ দিবলৈ টিপক"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। হাৰ্ডৱেৰ নাই।"</string> - <string name="face_error_timeout" msgid="522924647742024699">"পুনৰ ফেচ আনলক কৰি চাওক।"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"নতুন মুখমণ্ডলৰ ডেটা জমা কৰিব পৰা নাই। প্ৰথমে পুৰণি এখন মচক।"</string> <string name="face_error_canceled" msgid="2164434737103802131">"মুখমণ্ডলৰ প্ৰক্ৰিয়া বাতিল কৰা হ’ল।"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"ব্যৱহাৰকাৰীয়ে ফেচ আনলক কৰাটো বাতিল কৰিছে।"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"অত্যধিক ভুল প্ৰয়াস। কিছুসময়ৰ পাছত আকৌ চেষ্টা কৰক।"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"অতি বেছি প্ৰয়াস। ফেচ আনলক কৰাটো অক্ষম কৰা হৈছে।"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। আকৌ চেষ্টা কৰক।"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"আপুনি ফেচ আনলক ছেট আপ কৰা নাই।"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"এই ডিভাইচটোত ফেচ আনলক কৰা সুবিধাটো নচলে।"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"ছেন্সৰটো সাময়িকভাৱে অক্ষম হৈ আছে।"</string> <string name="face_name_template" msgid="3877037340223318119">"মুখমণ্ডল <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"ফেচ আনলক ব্যৱহাৰ কৰক"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ফেচ আনলক অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"অব্যাহত ৰাখিবলৈ নিজৰ মুখাৱয়ব ব্যৱহাৰ কৰক"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"অব্যাহত ৰাখিবলৈ আপোনাৰ মুখাৱয়ব অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"আনলক ক্ষেত্ৰ বিস্তাৰ কৰক।"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"শ্লাইডৰদ্বাৰা আনলক।"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"আৰ্হিৰদ্বাৰা আনলক।"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"ফেচ আনলক।"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"পিনৰদ্বাৰা আনলক।"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"ছিম পিন আনলক।"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"ছিম পিইউকে আনলক।"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index dee86cb72a9e..23127a4c7244 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Barmaq izi ikonası"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"Üz ilə kiliddən açma avadanlığını idarə edin"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Proqramdan istifadə üçün barmaq izi şablonlarını əlavə etmək və silmək məqsədilə üsullara müraciət etməyə imkan verir."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"üz ilə kiliddən açma işlədin"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"İdentifikasiya üçün tətbiqin Üz ilə Kiliddən Açmasına icazə verir"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Üz ilə Kiliddən Açma"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Üzünüzü yenidən qeydiyyatdan keçirin"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Tanınmanı təkmilləşdirmək üçün üzünüzü yenidən qeydiyyatdan keçirin"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Üz ilə kiliddən çıxarmanı ayarlayın"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefona baxaraq onu kiliddən çıxarın"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Kiliddən çıxarmağın daha çox yolunu ayarlayın"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Barmaq izi əlavə etmək üçün toxunun"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Üz doğrulanmadı. Avadanlıq əlçatan deyil."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Üz ilə Kiliddən Açmanı yenidən sınayın."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Yeni üz datası saxlanmadı. Əvvəlcə köhnə olanı silin."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Üz əməliyyatı ləğv edildi."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"İstifadəçi Üz ilə Kiliddən Açmanı ləğv edib."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Həddindən çox cəhd. Sonraya saxlayın."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Həddindən çox cəhd. Üz ilə Kiliddən Açma deaktiv edildi."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Üz doğrulanmadı. Yenidən cəhd edin."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Üz ilə Kiliddən Açmanı quraşdırmamısınız."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Üz ilə Kiliddən Açma bu cihazda dəstəklənmir."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor müvəqqəti deaktivdir."</string> <string name="face_name_template" msgid="3877037340223318119">"Üz <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Üz ilə kiliddən çıxarmadan istifadə edin"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Üz və ya ekran kilidindən istifadə edin"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Davam etmək üçün üzünüzdən istifadə edin"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Davam etmək üçün üz və ya ekran kilidinizdən istifadə edin"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Kilidi açma sahəsini genişləndir."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Sürüşdürmə kilidi."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Kild açma modeli."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Üz ilə Kiliddən Açma"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin kilid açması."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Sim Pin kilidini açın."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Sim Puk kilidini açın."</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index b8d573b55cd9..00a2233165e0 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -612,14 +612,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona otiska prsta"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"upravljanje hardv. za otključavanje licem"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Dozvoljava da aplikacija aktivira metode za dodavanje i brisanje šablona lica radi korišćenja."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"korišćenje hardvera za otključavanje licem"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Dozvoljava da aplikacija koristi hardver za otključavanje licem radi potvrde identiteta"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Otključavanje licem"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Ponovo registrujte lice"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Da biste poboljšali prepoznavanje, ponovo registrujte lice"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Podesite otključavanje licem"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Otključajte telefon tako što ćete ga pogledati"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Podesite još načina za otključavanje"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Dodirnite da biste dodali otisak prsta"</string> @@ -646,18 +644,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Provera lica nije uspela. Hardver nije dostupan."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Probajte ponovo otključavanje licem."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Novi podaci o licu nisu sačuvani. Prvo izbrišete prethodne."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Obrada lica je otkazana."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Korisnik je otkazao otključavanje licem"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Previše pokušaja. Probajte ponovo kasnije."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Previše pokušaja. Otključavanje licem je onemogućeno."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Provera lica nije uspela. Probajte ponovo."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Niste podesili otključavanje licem"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Otključavanje licem nije podržano na ovom uređaju"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Senzor je privremeno onemogućen."</string> <string name="face_name_template" msgid="3877037340223318119">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Koristite otključavanje licem"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Koristite zaključavanje licem ili zaključavanje ekrana"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Potvrdite identitet licem da biste nastavili"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Koristite lice ili zaključavanje ekrana da biste nastavili"</string> @@ -960,7 +966,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Proširi oblast otključavanja."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Otključavanje prevlačenjem."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Otključavanje šablonom."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Otključavanje licem."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Otključavanje PIN-om."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Otključava SIM karticu PIN-om."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Otključava SIM karticu PUK-om."</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index a957bfc5d419..b1a1f8eb236a 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -615,14 +615,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Значок адбіткаў пальцаў"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"кіраваць апаратным забеспячэннем для распазнавання твару"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Праграма зможа дадаваць і выдаляць шаблоны твару."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"выкарыстоўваць апаратнае забеспячэнне для распазнавання твару"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Для аўтэнтыфікацыі праграма зможа ўжываць апаратнае забеспячэнне для распазнавання твару"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Распазнаванне твару"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Паўтарыце рэгістрацыю твару"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Каб палепшыць распазнавальнасць, яшчэ раз выканайце рэгістрацыю твару"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Наладзьце распазнаванне твару"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Разблакіруйце свой тэлефон, паглядзеўшы на яго"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Наладзьце дадатковыя спосабы разблакіроўкі"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Націсніце, каб дадаць адбітак пальца"</string> @@ -649,18 +647,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Твар не спраўджаны. Абсталяванне недаступнае."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Выканайце распазнаванне твару паўторна."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Новыя даныя пра твар не захаваны. Спачатку выдаліце старыя."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Распазнаванне твару скасавана."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Распазнаванне твару скасавана карыстальнікам."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Занадта шмат спроб. Паўтарыце спробу пазней."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Занадта шмат спроб. Распазнаванне твару выключана."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Не ўдалося спраўдзіць твар. Паўтарыце спробу."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Вы не наладзілі распазнаванне твару."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"На гэтай прыладзе распазнаванне твару не падтрымліваецца."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Датчык часова выключаны."</string> <string name="face_name_template" msgid="3877037340223318119">"Твар <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Ужываць распазнаванне твару"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Выкарыстоўваць распазнаванне твару ці блакіроўку экрана"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Каб працягнуць, скарыстайце распазнаванне твару"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Каб працягнуць, скарыстайце распазнаванне твару ці сродак разблакіроўкі экрана"</string> @@ -963,7 +969,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Разгарнуць вобласць разблакіроўкі."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Разблакiроўка слайда."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Узор разблакiроўкі."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Распазнаванне твару"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"PIN-код разблакiроўкі."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Разблакіроўка SIM-карты з дапамогай PIN-кода."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Разблакіроўка SIM-карты з дапамогай PUK-кода."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index d24e3a4c2e05..b30dd1be756a 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Икона за отпечатък"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"управление на хардуера за отключване с лице"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Разрешава на прил. да извиква методи за добавяне и изтриване на лицеви шаблони за ползване"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"използване на хардуера за отключване с лице"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Разрешава на приложението да използва хардуера за отключване с лице с цел удостоверяване"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Отключване с лице"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Регистрирайте отново лицето си"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"С цел подобряване на разпознаването регистрирайте отново лицето си"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Настройване на отключването с лице"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Отключвайте телефона си, като го погледнете"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Настройване на още начини за отключване на телефона"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Докоснете, за да добавите отпечатък"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Лицето не може да се потвърди. Хардуерът не е налице."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Опитайте отново да отключите с лице."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Не може да се запази ново лице. Първо изтрийте старо."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Операцията с лице е анулирана."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Отключването с лице е анулирано от потребителя."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Твърде много опити. Опитайте отново по-късно."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Твърде много опити. Отключването с лице е деактивирано."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Лицето не може да се потвърди. Опитайте отново."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Не сте настроили отключването с лице."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Отключването с лице не се поддържа на това устройство."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Сензорът е временно деактивиран."</string> <string name="face_name_template" msgid="3877037340223318119">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Използване на отключв. с лице"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Използване на отключването с лице или опцията за заключване на екрана"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Използвайте лицето си, за да продължите"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Използвайте лицето си или опцията за заключване на екрана, за да продължите"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Разгъване на областта за отключване."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Отключване с плъзгане."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Отключване с фигура."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Отключване с лице."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Отключване с ПИН код."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Отключване на SIM картата с ПИН код."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Отключване на SIM картата с PUK код."</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index ab58e849240b..bca1b85cf4cb 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"আঙ্গুলের ছাপ আইকন"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"ফেস আনলক হার্ডওয়্যার ম্যানেজ করা"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"ব্যবহার করার জন্য ফেস টেম্পলেট যোগ করা এবং মোছার পদ্ধতি গ্রহণ করতে অ্যাপটিকে অনুমতি দেয়৷"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"ফেস আনলক হার্ডওয়্যার ব্যবহার করা"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"অ্যাপকে যাচাইকরণের জন্য ফেস আনলক হার্ডওয়্যার ব্যবহার করতে দেয়"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ফেস আনলক"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"আপনার ফেস আবার এনরোল করুন"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"শনাক্তকরণের উন্নতি করতে আপনার ফেস আবার এনরোল করুন"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"ফেস আনলক ফিচার সেট-আপ করুন"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"আপনার ফোনের দিকে তাকিয়ে এটিকে আনলক করুন"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"আনলক করার জন্য বিভিন্ন উপায়ে সেট আপ করুন"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"একটি আঙ্গুলের ছাপ যোগ করতে ট্যাপ করুন"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"ফেস যাচাই করা যায়নি। হার্ডওয়্যার উপলভ্য নেই।"</string> - <string name="face_error_timeout" msgid="522924647742024699">"আবার ফেস আনলকের মাধ্যমে চেষ্টা করুন।"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"নতুন ফেস ডেটা স্টোর করা যায়নি। প্রথমে পুরনোটি মুছে ফেলুন।"</string> <string name="face_error_canceled" msgid="2164434737103802131">"ফেস অপারেশন বাতিল করা হয়েছে৷"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"ব্যবহারকারী ফেস আনলক বাতিল করে দিয়েছেন।"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"অনেকবার চেষ্টা করা হয়েছে। পরে আবার চেষ্টা করুন।"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"অনেকবার চেষ্টা করেছেন। ফেস আনলক বন্ধ করা হয়েছে।"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"আপনার মুখ যাচাই করা যাচ্ছে না। আবার চেষ্টা করুন।"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"এখনও ফেস আনলক সেট-আপ করেননি।"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"এই ডিভাইসে ফেস আনলক সুবিধাটি কাজ করে না।"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"সেন্সর অস্থায়ীভাবে বন্ধ করা আছে।"</string> <string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> ফেস"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"ফেস আনলক ব্যবহার করুন"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ফেস অথবা স্ক্রিন লক ব্যবহার করুন"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"চালিয়ে যেতে আপনার মুখ ব্যবহার করুন"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"চালিয়ে যেতে আপনার ফেস বা স্ক্রিন লক ব্যবহার করুন"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"আনলক এলাকা প্রসারিত করুন৷"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"স্লাইড দিয়ে আনলক৷"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"প্যাটার্ন দিয়ে আনলক৷"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"ফেস আনলক৷"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"পিন দিয়ে আনলক৷"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"সিম পিন আনলক।"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"সিম পিইউকে আনলক।"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 6daed4620507..4a38db03f847 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -612,14 +612,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona za otisak prsta"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"upravljanje hardverom za otključavanje licem"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Omogućava aplikaciji korištenje metoda za dodavanje i brisanje šablona lica za upotrebu."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"korištenje hardvera za otključavanje licem"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Omogućava aplikaciji da za autentifikaciju koristi hardver za otključavanje licem"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Otključavanje licem"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Ponovo registrirajte lice"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Ponovo registrirajte lice da poboljšate prepoznavanje"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Postavite otključavanje licem"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Otključajte telefon gledajući u njega"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Postavite više načina otključavanja"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Dodirnite da dodate otisak prsta"</string> @@ -646,18 +644,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Nije moguće potvrditi lice. Hardver nije dostupan."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Pokušajte ponovo s otključavanjem licem."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Nije moguće sačuvati nove podatke o licu. Prvo izbrišite stare."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Prepoznavanje lica je otkazano."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Korisnik je otkazao otključavanje licem."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Previše pokušaja. Pokušajte ponovo kasnije."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Previše pokušaja. Otključavanje licem je onemogućeno."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Nije moguće potvrditi lice. Pokušajte ponovo."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Niste postavili otključavanje licem."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Otključavanje licem nije podržano na ovom uređaju."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Senzor je privremeno onemogućen."</string> <string name="face_name_template" msgid="3877037340223318119">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Koristi otključavanje licem"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Koristi otključavanje licem ili zaključavanje ekrana"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Koristite lice da nastavite"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Koristite lice ili zaključavanje ekrana da nastavite"</string> @@ -960,7 +966,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Proširi oblast za otključavanje."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Otključavanje pomoću klizača."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Otključavanje uzorkom."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Otključavanje licem."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Otključavanje pinom."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Otključavanje Pin-om za Sim."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Otključavanje SIM-a PUK-om"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 0ffdf7074b07..2528c1b7efc6 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icona d\'empremta digital"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"gestiona el maquinari de Desbloqueig facial"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Permet que l\'aplicació afegeixi i suprimeixi plantilles de cares que es puguin fer servir."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"utilitza el maquinari de Desbloqueig facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Permet que l\'aplicació faci servir el maquinari de Desbloqueig facial per a l\'autenticació"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueig facial"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Torna a registrar la cara"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Per millorar el reconeixement, torna a registrar la cara"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Configura el desbloqueig facial"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Mira el telèfon per desbloquejar-lo"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura més maneres de desbloquejar el dispositiu"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca per afegir una empremta digital"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"No es pot verificar la cara. Maquinari no disponible."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Torna a provar el desbloqueig facial."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"No es poden desar dades facials noves. Suprimeix-ne d\'antigues."</string> <string name="face_error_canceled" msgid="2164434737103802131">"S\'ha cancel·lat el reconeixement facial."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"L\'usuari ha cancel·lat el desbloqueig facial."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Massa intents. Torna-ho a provar més tard."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Massa intents. S\'ha desactivat Desbloqueig facial."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"No es pot verificar la cara. Torna-ho a provar."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"No has configurat el desbloqueig facial"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"El desbloqueig facial no és compatible amb el dispositiu."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"El sensor està desactivat temporalment."</string> <string name="face_name_template" msgid="3877037340223318119">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Utilitza el desbloqueig facial"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Utilitza el desbloqueig facial o de pantalla"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Utilitza la teva cara per continuar"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Utilitza la cara o el bloqueig de pantalla per continuar"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Desplega l\'àrea de desbloqueig."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Desbloqueig lliscant"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Desbloqueig mitjançant patró"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Desbloqueig facial"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Desbloqueig mitjançant PIN"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Desbloqueja la SIM amb el PIN."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Desbloqueja la SIM amb el PUK."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index d264f94f46e2..37b4c8c320b9 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -615,14 +615,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona otisku prstů"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"správa hardwaru k odemknutí obličejem"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Umožňuje aplikaci volat metody k přidání a smazání šablon obličeje, které budou použity."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"použití hardwaru k odemknutí obličejem"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Umožňuje aplikaci provést ověření pomocí hardwaru k odemknutí obličejem"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Odemknutí obličejem"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Zaznamenejte obličej znovu"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Chcete-li rozpoznání zdokonalit, zaznamenejte obličej znovu"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Nastavte odemknutí obličejem"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefon odemknete pohledem"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavte si více způsobů odemykání"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Klepnutím přidáte otisk prstu"</string> @@ -649,18 +647,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Obličej nelze ověřit. Hardware není dostupný."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Zopakujte odemknutí obličejem."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Údaje o novém obličeji nelze uložit. Nejdřív vymažte starý."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Operace snímání obličeje byla zrušena."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Odemknutí obličejem zrušil uživatel."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Příliš mnoho pokusů. Zkuste to později."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Příliš mnoho pokusů. Odemknutí obličejem bylo deaktivováno."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Obličej se nepodařilo ověřit. Zkuste to znovu."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Odemknutí obličejem nemáte nastavené."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Odemknutí obličejem na tomto zařízení není podporováno."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Senzor je dočasně deaktivován."</string> <string name="face_name_template" msgid="3877037340223318119">"Obličej <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Použít odemknutí obličejem"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Použít odemknutí obličejem nebo zámek obrazovky"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Pokračujte ověřením obličeje"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Pokračujte ověřením pomocí obličeje nebo zámku obrazovky"</string> @@ -963,7 +969,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Rozšířit oblast odemknutí"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Odemknutí přejetím prstem."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Odemknutí gestem."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Odemknutí obličejem."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Odemknutí kódem PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Odemknutí SIM karty kódem PIN."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Odemknutí SIM karty kódem PUK."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index b9045f185884..b20665ebdf85 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikon for fingeraftryk"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"administrere hardware til ansigtslås"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Tillader, at appen kan bruge metoder til at tilføje og slette ansigtsskabeloner."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"bruge hardware til ansigtslås"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Tillader, at appen bruger hardware til ansigtslås til godkendelse"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Ansigtslås"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Registrer dit ansigt igen"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Registrer dit ansigt igen for at forbedre genkendelsen af det"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Konfigurer ansigtslås"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Lås din telefon op ved at kigge på den"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfigurer flere måder at låse op på"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tryk for at tilføje et fingeraftryk"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Ansigt ikke bekræftet. Hardware ikke tilgængelig."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Prøv ansigtslås igen."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Der kan ikke gemmes nye ansigtsdata. Slet et gammelt først."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Ansigtshandlingen blev annulleret."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Ansigtslås blev annulleret af brugeren."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Du har prøvet for mange gange. Prøv igen senere."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Du har brugt for mange forsøg. Ansigtslås er deaktiveret."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Ansigtet kan ikke genkendes. Prøv igen."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Du har ikke konfigureret ansigtslås."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Ansigtslås understøttes ikke på denne enhed."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensoren er midlertidigt deaktiveret."</string> <string name="face_name_template" msgid="3877037340223318119">"Ansigt <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Brug ansigtslås"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Brug ansigts- eller skærmlås"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Brug dit ansigt for at fortsætte"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Brug din ansigts- eller skærmlås for at fortsætte"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Udvid oplåsningsområdet."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Lås op ved at stryge."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Lås op med mønster."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Ansigtslås."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Lås op med pinkode."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Lås op ved hjælp af pinkoden til SIM-kortet."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Lås op ved hjælp af PUK-koden til SIM-kortet."</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 9ff2c28c46c9..f8cc42d4f110 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingerabdruck-Symbol"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"Hardware für Entsperrung per Gesichtserkennung verwalten"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Ermöglicht der App, Gesichtsvorlagen hinzuzufügen oder zu entfernen."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"Hardware für Gesichtsentsperrung verwenden"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Ermöglicht der App, zur Authentifizierung Hardware für Gesichtsentsperrung zu verwenden"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Gesichtsentsperrung"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Gesicht neu scannen lassen"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Für bessere Erkennung Gesicht neu scannen lassen"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Entsperrung per Gesichtserkennung einrichten"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Entsperre dein Smartphone, indem du es ansiehst"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Weitere Möglichkeiten zum Entsperren einrichten"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tippe, um einen Fingerabdruck hinzuzufügen"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Gesicht nicht erkannt. Hardware nicht verfügbar."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Gesichtsentsperrung noch einmal versuchen."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Kein Speicherplatz frei. Bitte erst ein Gesicht löschen."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Gesichtserkennung abgebrochen."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Entsperrung per Gesichtserkennung vom Nutzer abgebrochen."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Zu viele Versuche, bitte später noch einmal versuchen"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Zu viele Versuche. Entsperrung per Gesichtserkennung wurde deaktiviert."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Gesichtsprüfung nicht möglich. Noch mal versuchen."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Entsperrung per Gesichtserkennung ist nicht eingerichtet."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Gesichtsentsperrung wird auf diesem Gerät nicht unterstützt."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Der Sensor ist vorübergehend deaktiviert."</string> <string name="face_name_template" msgid="3877037340223318119">"Gesicht <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Entsperrung per Gesichtserkenn."</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Entsperrung per Gesichtserkennung oder Displaysperre verwenden"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Gesichtserkennung verwenden, um fortzufahren"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Verwende die Gesichtserkennung oder deine Display-Entsperrmethode, um fortzufahren"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Entsperr-Bereich maximieren"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Entsperrung mit Fingerbewegung"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Entsperrung mit Muster"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Entsperrung per Gesichtserkennung"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Entsperrung mit PIN"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM durch PIN-Eingabe entsperren."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM durch PUK-Eingabe entsperren."</string> @@ -2095,8 +2102,7 @@ <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"OK"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Ausschalten"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Weitere Informationen"</string> - <!-- no translation found for nas_upgrade_notification_learn_more_content (3735480566983530650) --> - <skip /> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Die adaptiven Benachrichtigungen wurden in Android 12 durch die Funktion „Erweiterte Benachrichtigungen“ ersetzt. Diese Funktion zeigt Vorschläge für Aktionen und Antworten an und sortiert Benachrichtigungen.\n\nSie kann alle Benachrichtigungen lesen, darunter auch personenbezogene Daten wie Kontaktnamen und Nachrichten. Außerdem kann sie auf Benachrichtigungen antworten oder diese schließen und so beispielsweise Anrufe entgegennehmen oder „Bitte nicht stören“ steuern."</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Infomitteilung zum Ablaufmodus"</string> <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Dein Akku könnte vor der gewöhnlichen Ladezeit leer sein"</string> <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Energiesparmodus aktiviert, um die Akkulaufzeit zu verlängern"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index e2f1fdf7a1fb..9474505bc60a 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"διαχείριση εξοπλισμού για ξεκλείδωμα με το πρόσωπο"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Επιτρέπει στην εφαρμογή να επικαλείται μεθόδους προσθήκης/διαγραφής προτύπων για χρήση."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"χρήση εξοπλισμού για ξεκλείδωμα με το πρόσωπο"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Επιτρέπει στην εφαρμογή έλεγχο ταυτότητας με χρήση εξοπλισμού για ξεκλείδωμα με το πρόσωπο"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Ξεκλείδωμα με το πρόσωπο"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Εγγράψτε ξανά το πρόσωπό σας"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Για να βελτιώσετε την αναγνώριση, εγγράψτε ξανά το πρόσωπό σας"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Ρυθμίστε το ξεκλείδωμα με το πρόσωπο"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Ξεκλειδώστε το τηλέφωνό σας απλώς κοιτώντας το"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Ρυθμίστε περισσότερους τρόπους ξεκλειδώματος"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Πατήστε για να προσθέσετε δακτυλικό αποτύπωμα"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Αδύν. επαλήθ. προσώπου. Μη διαθέσιμος εξοπλισμός."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Δοκιμάστε ξανά για ξεκλείδωμα με το πρόσωπο."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Η αποθήκ. νέων δεδομ. προσώπ. είναι αδύν. Διαγρ. ένα παλιό."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Η ενέργεια προσώπου ακυρώθηκε."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Το ξεκλείδωμα με το πρόσωπο ακυρώθηκε από τον χρήστη."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Υπερβολικά πολλές προσπάθειες. Το ξεκλείδωμα με το πρόσωπο απενεργοποιήθηκε."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Αδύνατη επαλήθευση του προσώπου. Επανάληψη."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Δεν έχετε ρυθμίσει το ξεκλείδωμα με το πρόσωπο."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Το Ξεκλείδωμα με το πρόσωπο δεν υποστηρίζεται σε αυτήν τη συσκευή."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Ο αισθητήρας απενεργοποιήθηκε προσωρινά."</string> <string name="face_name_template" msgid="3877037340223318119">"Πρόσωπο <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Χρήση ξεκλειδώματος με το πρόσωπο"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Χρήση προσώπου ή κλειδώματος οθόνης"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Χρησιμοποιήστε το πρόσωπό σας για να συνεχίσετε"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Χρησιμοποιήστε το πρόσωπό σας ή το κλείδωμα οθόνης για συνέχεια"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Ανάπτυξη περιοχής ξεκλειδώματος."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Ξεκλείδωμα ολίσθησης."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Ξεκλείδωμα μοτίβου."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Ξεκλείδωμα με το πρόσωπο."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Ξεκλείδωμα κωδικού ασφαλείας"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Ξεκλείδωμα αριθμού PIN κάρτας SIM."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Ξεκλείδωμα αριθμού PUK κάρτας SIM."</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 41d476aede5e..580a402ff3d9 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingerprint icon"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"manage Face Unlock hardware"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Allows the app to invoke methods to add and delete facial templates for use."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"use Face Unlock hardware"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Allows the app to use Face Unlock hardware for authentication"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face Unlock"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Re-enrol your face"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"To improve recognition, please re-enrol your face"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Set up Face Unlock"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Unlock your phone by looking at it"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Set up more ways to unlock"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tap to add a fingerprint"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Can’t verify face. Hardware not available."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Try Face Unlock again."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Can’t store new face data. Delete an old one first."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Face operation cancelled."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Face Unlock cancelled by user."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Too many attempts. Try again later."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Too many attempts. Face Unlock disabled."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Can’t verify face. Try again."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"You haven’t set up Face Unlock."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Face Unlock is not supported on this device."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor temporarily disabled."</string> <string name="face_name_template" msgid="3877037340223318119">"Face <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Use Face Unlock"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Use face or screen lock"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Use your face to continue"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Expand unlock area."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Slide unlock."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Pattern unlock."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Face Unlock."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin unlock."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM PIN unlock."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM PUK unlock."</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 056589ba8823..bfbdeede422e 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingerprint icon"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"manage Face Unlock hardware"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Allows the app to invoke methods to add and delete facial templates for use."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"use Face Unlock hardware"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Allows the app to use Face Unlock hardware for authentication"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face Unlock"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Re-enrol your face"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"To improve recognition, please re-enrol your face"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Set up Face Unlock"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Unlock your phone by looking at it"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Set up more ways to unlock"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tap to add a fingerprint"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Can’t verify face. Hardware not available."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Try Face Unlock again."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Can’t store new face data. Delete an old one first."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Face operation cancelled."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Face Unlock cancelled by user."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Too many attempts. Try again later."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Too many attempts. Face Unlock disabled."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Can’t verify face. Try again."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"You haven’t set up Face Unlock."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Face Unlock is not supported on this device."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor temporarily disabled."</string> <string name="face_name_template" msgid="3877037340223318119">"Face <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Use Face Unlock"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Use face or screen lock"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Use your face to continue"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Expand unlock area."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Slide unlock."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Pattern unlock."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Face Unlock."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin unlock."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM PIN unlock."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM PUK unlock."</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 1117c1774d95..3cba841202ad 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingerprint icon"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"manage Face Unlock hardware"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Allows the app to invoke methods to add and delete facial templates for use."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"use Face Unlock hardware"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Allows the app to use Face Unlock hardware for authentication"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face Unlock"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Re-enrol your face"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"To improve recognition, please re-enrol your face"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Set up Face Unlock"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Unlock your phone by looking at it"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Set up more ways to unlock"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tap to add a fingerprint"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Can’t verify face. Hardware not available."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Try Face Unlock again."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Can’t store new face data. Delete an old one first."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Face operation cancelled."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Face Unlock cancelled by user."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Too many attempts. Try again later."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Too many attempts. Face Unlock disabled."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Can’t verify face. Try again."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"You haven’t set up Face Unlock."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Face Unlock is not supported on this device."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor temporarily disabled."</string> <string name="face_name_template" msgid="3877037340223318119">"Face <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Use Face Unlock"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Use face or screen lock"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Use your face to continue"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Expand unlock area."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Slide unlock."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Pattern unlock."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Face Unlock."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin unlock."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM PIN unlock."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM PUK unlock."</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 0b7b2e8ca4db..f5b1ec5b263b 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingerprint icon"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"manage Face Unlock hardware"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Allows the app to invoke methods to add and delete facial templates for use."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"use Face Unlock hardware"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Allows the app to use Face Unlock hardware for authentication"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face Unlock"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Re-enrol your face"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"To improve recognition, please re-enrol your face"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Set up Face Unlock"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Unlock your phone by looking at it"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Set up more ways to unlock"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tap to add a fingerprint"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Can’t verify face. Hardware not available."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Try Face Unlock again."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Can’t store new face data. Delete an old one first."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Face operation cancelled."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Face Unlock cancelled by user."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Too many attempts. Try again later."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Too many attempts. Face Unlock disabled."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Can’t verify face. Try again."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"You haven’t set up Face Unlock."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Face Unlock is not supported on this device."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor temporarily disabled."</string> <string name="face_name_template" msgid="3877037340223318119">"Face <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Use Face Unlock"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Use face or screen lock"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Use your face to continue"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Expand unlock area."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Slide unlock."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Pattern unlock."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Face Unlock."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin unlock."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM PIN unlock."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM PUK unlock."</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 41c4d4999470..eaa607103b44 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -609,14 +609,10 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingerprint icon"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"manage face unlock hardware"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Allows the app to invoke methods to add and delete facial templates for use."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"use face unlock hardware"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Allows the app to use face unlock hardware for authentication"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face unlock"</string> + <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Re-enroll your face"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"To improve recognition, please re-enroll your face"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Set up face unlock"</string> + <string name="face_setup_notification_title" msgid="8843461561970741790">"Set up Face Unlock"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Unlock your phone by looking at it"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Set up more ways to unlock"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tap to add a fingerprint"</string> @@ -643,18 +639,19 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Can’t verify face. Hardware not available."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Try face unlock again."</string> + <string name="face_error_timeout" msgid="2598544068593889762">"Try Face Unlock again"</string> <string name="face_error_no_space" msgid="5649264057026021723">"Can’t store new face data. Delete an old one first."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Face operation canceled."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Face unlock canceled by user."</string> + <string name="face_error_user_canceled" msgid="5766472033202928373">"Face Unlock canceled by user"</string> <string name="face_error_lockout" msgid="7864408714994529437">"Too many attempts. Try again later."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Too many attempts. Face unlock disabled."</string> + <string name="face_error_lockout_permanent" msgid="3277134834042995260">"Too many attempts. Face Unlock disabled."</string> + <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Too many attempts. Enter screen lock instead."</string> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Can’t verify face. Try again."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"You haven’t set up face unlock."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Face unlock is not supported on this device."</string> + <string name="face_error_not_enrolled" msgid="1134739108536328412">"You haven’t set up Face Unlock"</string> + <string name="face_error_hw_not_present" msgid="7940978724978763011">"Face Unlock isn’t supported on this device"</string> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor temporarily disabled."</string> <string name="face_name_template" msgid="3877037340223318119">"Face <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Use face unlock"</string> + <string name="face_app_setting_name" msgid="5854024256907828015">"Use Face Unlock"</string> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Use face or screen lock"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Use your face to continue"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string> @@ -957,7 +954,7 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Expand unlock area."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Slide unlock."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Pattern unlock."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Face unlock."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4533832120787386728">"Face Unlock."</string> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin unlock."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Sim Pin unlock."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Sim Puk unlock."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 670c802eaffc..000ee982ec81 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ícono de huella dactilar"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"administrar el hardware de desbloqueo facial"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Permite que la app emplee métodos para agregar y borrar plantillas de rostros para su uso."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"usar el hardware de desbloqueo facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Permite que la app use el hardware de desbloqueo facial con fines de autenticación"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueo facial"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Vuelve a registrar tu rostro"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para mejorar el reconocimiento, vuelve a registrar tu rostro"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Configura Desbloqueo facial"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloquea el teléfono con solo mirarlo"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura más formas de desbloquear el dispositivo"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Presiona para agregar una huella dactilar"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"No se verificó el rostro. Hardware no disponible."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Vuelve a probar el desbloqueo facial."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"No hay espacio para datos faciales nuevos. Borra uno viejo."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Se canceló el reconocimiento facial."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"El usuario canceló el desbloqueo facial."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Demasiados intentos. Inténtalo de nuevo más tarde."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Demasiados intentos. Se inhabilitó el desbloqueo facial."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"No se pudo verificar el rostro. Vuelve a intentarlo."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"No configuraste el desbloqueo facial."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"No se admite el desbloqueo facial en este dispositivo."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Se inhabilitó temporalmente el sensor."</string> <string name="face_name_template" msgid="3877037340223318119">"Rostro <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Usar desbloqueo facial"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Usar desbloqueo facial o de pantalla"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Usa el rostro para continuar"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Usa tu rostro o bloqueo de pantalla para continuar"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Expandir el área desbloqueada"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Desbloqueo por deslizamiento"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Desbloqueo por patrón"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Desbloqueo facial"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Desbloqueo por PIN"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"PIN de desbloqueo de SIM"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"PUK de desbloqueo de SIM"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 6c58f0b17412..4b9dda0c2895 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icono de huella digital"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"gestionar el hardware de Desbloqueo facial"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Permite que la app use métodos para añadir y suprimir plantillas de caras para su uso."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"utilizar hardware de Desbloqueo facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Permite que la aplicación utilice el hardware de Desbloqueo facial para autenticarte"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueo facial"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Volver a registrar la cara"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para mejorar el reconocimiento, vuelve a registrar tu cara"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Configura Desbloqueo facial"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloquea el teléfono con solo mirarlo"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura más formas de desbloqueo"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca para añadir una huella digital"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"No se puede verificar. Hardware no disponible."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Vuelve a probar Desbloqueo facial."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Para guardar nuevos datos faciales, borra otros antiguos."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Se ha cancelado el reconocimiento facial."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"El usuario ha cancelado Desbloqueo facial."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Demasiados intentos. Inténtalo de nuevo más tarde."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Muchos intentos. Se ha inhabilitado Desbloqueo facial."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"No se ha verificado tu cara. Vuelve a intentarlo."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"No has configurado Desbloqueo facial."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Desbloqueo facial no está disponible en este dispositivo."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"El sensor está inhabilitado en estos momentos."</string> <string name="face_name_template" msgid="3877037340223318119">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Usar Desbloqueo facial"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Usar Desbloqueo facial o Bloqueo de pantalla"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Usa tu cara para continuar"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Usa tu cara o tu bloqueo de pantalla para continuar"</string> @@ -731,13 +737,13 @@ <string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"Comprueba cuántas veces se han introducido contraseñas incorrectas para desbloquear la pantalla y, si te parece que han sido demasiadas, bloquea tu dispositivo Android TV o borra todos los datos de este usuario."</string> <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"Controla el número de contraseñas incorrectas introducidas para desbloquear la pantalla y bloquea el teléfono o borra todos los datos del usuario si se introducen demasiadas contraseñas incorrectas."</string> <string name="policylab_resetPassword" msgid="214556238645096520">"Cambiar el bloqueo de pantalla"</string> - <string name="policydesc_resetPassword" msgid="4626419138439341851">"Cambiar el bloqueo de pantalla"</string> + <string name="policydesc_resetPassword" msgid="4626419138439341851">"Cambia el bloqueo de pantalla"</string> <string name="policylab_forceLock" msgid="7360335502968476434">"Bloquear la pantalla"</string> - <string name="policydesc_forceLock" msgid="1008844760853899693">"Controlar cómo y cuándo se bloquea la pantalla"</string> + <string name="policydesc_forceLock" msgid="1008844760853899693">"Controla cómo y cuándo se bloquea la pantalla"</string> <string name="policylab_wipeData" msgid="1359485247727537311">"Borrar todos los datos"</string> <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Borrar los datos del tablet sin avisar restableciendo el estado de fábrica"</string> <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Restablece los datos de fábrica de tu dispositivo Android TV, eliminando sin previo aviso los datos que tuviera."</string> - <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Borrar los datos del teléfono sin avisar restableciendo el estado de fábrica"</string> + <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Borra los datos del teléfono sin avisar restableciendo el estado de fábrica"</string> <string name="policylab_wipeData_secondaryUser" msgid="413813645323433166">"Borrar datos del usuario"</string> <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"Borra los datos del usuario en este tablet sin avisar."</string> <string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2293713284515865200">"Eliminar los datos de este usuario del dispositivo Android TV sin previo aviso."</string> @@ -751,7 +757,7 @@ <string name="policylab_disableCamera" msgid="5749486347810162018">"Inhabilitar cámaras"</string> <string name="policydesc_disableCamera" msgid="3204405908799676104">"Evita el uso de las cámaras del dispositivo"</string> <string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"Desactivar algunas funciones del bloqueo de pantalla"</string> - <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"Evitar el uso de algunas funciones del bloqueo de pantalla"</string> + <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"Evita el uso de algunas funciones del bloqueo de pantalla"</string> <string-array name="phoneTypes"> <item msgid="8996339953292723951">"Casa"</item> <item msgid="7740243458912727194">"Móvil"</item> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Ampliar área de desbloqueo"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Desbloqueo deslizando el dedo"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Desbloqueo por patrón"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Desbloqueo facial"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Desbloqueo por PIN"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Desbloqueo con PIN de la SIM."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Desbloqueo con PUK de la SIM."</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 5e632d54911b..2df762fd0556 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Sõrmejälje ikoon"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"hallata näoga avamise riistvara"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Lubab rakendusel tühistada meetodid kasutatavate näomallide lisamiseks ja kustutamiseks."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"kasutada näoga avamise riistvara"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Võimaldab rakendusel autentimiseks kasutada näoga avamise riistvara"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Näoga avamine"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Registreerige oma nägu uuesti"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Tuvastamise parandamiseks registreerige oma nägu uuesti"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Seadistage näoga avamine"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Avage telefon seda vaadates"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Seadistage rohkem viise avamiseks"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Puudutage sõrmejälje lisamiseks"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Nägu ei saa kinnitada. Riistvara pole saadaval."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Proovige näoga avamist uuesti."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Uue näo andmeid ei saa salvestada. Kustutage enne vanad."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Näotuvastuse toiming tühistati."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Kasutaja tühistas näoga avamise."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Liiga palju katseid. Proovige hiljem uuesti."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Liiga palju katseid. Näoga avamine on keelatud."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Nägu ei saa kinnitada. Proovige uuesti."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Näoga avamine ei ole seadistatud."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Seade ei toeta näoga avamist."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Andur on ajutiselt keelatud."</string> <string name="face_name_template" msgid="3877037340223318119">"Nägu <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Näoga avamise kasutamine"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Näoga avamise või ekraaniluku kasutamine"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Jätkamiseks kasutage oma nägu"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Jätkamiseks kasutage oma nägu või ekraanilukku"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Avamisala laiendamine."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Lohistamisega avamine."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Mustriga avamine."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Näoga avamine."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"PIN-koodiga avamine."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM-kaardi PIN-koodiga avamine."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM-kaardi PUK-koodiga avamine."</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index fe5373bb863e..eb82aa89bbff 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Hatz-markaren ikonoa"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"kudeatu aurpegiaren bidez desblokeatzeko hardwarea"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Aurpegi-txantiloiak gehitu eta ezabatzeko metodoei dei egitea baimentzen dio aplikazioari."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"erabili aurpegiaren bidez desblokeatzeko hardwarea"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Autentifikaziorako aurpegiaren bidez desblokeatzeko hardwarea erabiltzeko baimena ematen die aplikazioei"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Aurpegiaren bidez desblokeatzeko eginbidea"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Erregistratu aurpegia berriro"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Ezagutzea hobetzeko, erregistratu aurpegia berriro"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Konfiguratu aurpegiaren bidez desblokeatzeko eginbidea"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefonoa desblokeatzeko, begira iezaiozu"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfiguratu telefonoa desblokeatzeko modu gehiago"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Sakatu hau hatz-marka bat gehitzeko"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Ezin da egiaztatu aurpegia. Hardwarea ez dago erabilgarri."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Saiatu berriro aurpegiaren bidez desblokeatzen."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Ezin dira gorde aurpegiaren datu berriak. Ezabatu zaharrak."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Utzi da aurpegiaren bidezko eragiketa."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Erabiltzaileak aurpegiaren bidez desblokeatzeko aukera utzi du"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Saiakera gehiegi egin dituzu. Saiatu berriro geroago."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Saiakera gehiegi egin dira. Aurpegiaren bidez desblokeatzeko eginbidea desgaitu egin da."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Ezin da egiaztatu aurpegia. Saiatu berriro."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Ez duzu konfiguratu aurpegiaren bidez desblokeatzeko eginbidea."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Gailu honek ez du onartzen aurpegiaren bidez desblokeatzea."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sentsorea aldi baterako desgaitu da."</string> <string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> aurpegia"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Erabili aurpegiaren bidez desblokeatzeko eginbidea"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Erabili aurpegia edo pantailaren blokeoa"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Aurrera egiteko, erabili aurpegia"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Aurrera egiteko, erabili aurpegia edo pantailaren blokeoa"</string> @@ -867,9 +873,9 @@ <string name="sipAddressTypeOther" msgid="6317012577345187275">"Beste bat"</string> <string name="quick_contacts_not_available" msgid="1262709196045052223">"Ez da kontaktua ikusteko aplikaziorik aurkitu."</string> <string name="keyguard_password_enter_pin_code" msgid="6401406801060956153">"Idatzi PIN kodea"</string> - <string name="keyguard_password_enter_puk_code" msgid="3112256684547584093">"Idatzi PUK kodea eta PIN kode berria"</string> + <string name="keyguard_password_enter_puk_code" msgid="3112256684547584093">"Idatzi PUKa eta PIN berria"</string> <string name="keyguard_password_enter_puk_prompt" msgid="2825313071899938305">"PUK kodea"</string> - <string name="keyguard_password_enter_pin_prompt" msgid="5505434724229581207">"PIN kode berria"</string> + <string name="keyguard_password_enter_pin_prompt" msgid="5505434724229581207">"PIN berria"</string> <string name="keyguard_password_entry_touch_hint" msgid="4032288032993261520"><font size="17">"Sakatu pasahitza idazteko"</font></string> <string name="keyguard_password_enter_password_code" msgid="2751130557661643482">"Idatzi desblokeatzeko pasahitza"</string> <string name="keyguard_password_enter_pin_password_code" msgid="7792964196473964340">"Idatzi desblokeatzeko PIN kodea"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Zabaldu desblokeatzeko eremua."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Hatza lerratuta desblokeatzea."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Ereduaren bidez desblokeatzea."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Aurpegiaren bidez desblokeatzeko eginbidea."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"PIN kodearen bidez desblokeatzea."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM txartela desblokeatzeko PIN kodea."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM txartela desblokeatzeko PUK kodea."</string> @@ -1655,7 +1662,7 @@ <string name="kg_puk_enter_pin_hint" msgid="8190982314659429770">"Idatzi erabili nahi duzun PIN kodea"</string> <string name="kg_enter_confirm_pin_hint" msgid="6372557107414074580">"Berretsi erabili nahi duzun PIN kodea"</string> <string name="kg_sim_unlock_progress_dialog_message" msgid="8871937892678885545">"SIM txartela desblokeatzen…"</string> - <string name="kg_password_wrong_pin_code" msgid="9013856346870572451">"PIN kode okerra."</string> + <string name="kg_password_wrong_pin_code" msgid="9013856346870572451">"PIN okerra."</string> <string name="kg_invalid_sim_pin_hint" msgid="4821601451222564077">"Idatzi 4 eta 8 zenbaki arteko PINa."</string> <string name="kg_invalid_sim_puk_hint" msgid="2539364558870734339">"PUK kodeak 8 zenbaki izan behar ditu."</string> <string name="kg_invalid_puk" msgid="4809502818518963344">"Idatzi berriro PUK kode zuzena. Hainbat saiakera oker eginez gero, betiko desgaituko da SIMa."</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 9e8d6a87fdec..e41c4fe8bd6a 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"نماد اثر انگشت"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"مدیریت سختافزار «قفلگشایی با چهره»"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"به برنامه امکان میدهد روشهایی را برای افزودن و حذف الگوهای چهره جهت استفاده فرابخواند."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"استفاده از سختافزار «قفلگشایی با چهره»"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"به برنامه امکان میدهد از سختافزار «قفلگشایی با چهره» برای اصالتسنجی استفاده کند"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"قفلگشایی با چهره"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ثبت مجدد چهره"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"برای بهبود تشخیص، لطفاً چهرهتان را دوباره ثبت کنید"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"راهاندازی «قفلگشایی با چهره»"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"برای باز کردن قفل تلفن خود به آن نگاه کنید"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"راهاندازی روشهای بیشتر برای باز کردن قفل"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"برای افزودن اثر انگشت، ضربه بزنید"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"چهره تأیید نشد. سختافزار در دسترس نیست."</string> - <string name="face_error_timeout" msgid="522924647742024699">"«قفلگشایی با چهره» را دوباره امتحان کنید."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"داده چهره جدید ذخیره نشد. اول داده چهره قدیمی را حذف کنید."</string> <string name="face_error_canceled" msgid="2164434737103802131">"عملیات شناسایی چهره لغو شد."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"کاربر «قفلگشایی با چهره» را لغو کرد."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"تعداد زیادی تلاش ناموفق. بعداً دوباره امتحان کنید."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"تعداد تلاشها بیشازحد مجاز است. «قفلگشایی با چهره» غیرفعال است."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"چهره تأیید نشد. دوباره امتحان کنید."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"«قفلگشایی با چهره» را راهاندازی نکردهاید."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"«قفلگشایی با چهره» در این دستگاه پشتیبانی نمیشود."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"حسگر بهطور موقت غیرفعال است."</string> <string name="face_name_template" msgid="3877037340223318119">"چهره <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"استفاده از «قفلگشایی با چهره»"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"استفاده از قفل صفحه یا چهره"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"برای ادامه، از چهرهتان استفاده کنید"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"برای ادامه، از تشخیص چهره یا قفل صفحه استفاده کنید"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"گسترده کردن منطقه بازگشایی شده."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"باز کردن قفل با کشیدن انگشت روی صفحه."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"باز کردن قفل با الگو."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"قفلگشایی با چهره."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"باز کردن قفل با پین."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"قفل پین سیمکارت باز شد."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"قفل Puk سیمکارت باز شد."</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 5f87f86985f3..1a96de60bb26 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -277,7 +277,7 @@ <string name="notification_hidden_text" msgid="2835519769868187223">"Uusi ilmoitus"</string> <string name="notification_channel_virtual_keyboard" msgid="6465975799223304567">"Virtuaalinen näppäimistö"</string> <string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"Fyysinen näppäimistö"</string> - <string name="notification_channel_security" msgid="8516754650348238057">"Tietosuoja"</string> + <string name="notification_channel_security" msgid="8516754650348238057">"Turvallisuus"</string> <string name="notification_channel_car_mode" msgid="2123919247040988436">"Autotila"</string> <string name="notification_channel_account" msgid="6436294521740148173">"Tilin tila"</string> <string name="notification_channel_developer" msgid="1691059964407549150">"Kehittäjien viestit"</string> @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Sormenjälkikuvake"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"hallinnoida kasvojentunnistusavauksen laitteistoa"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Sallii sovelluksen käyttää menetelmiä, joilla voidaan lisätä tai poistaa kasvomalleja."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"käyttää kasvojentunnistusavauksen laitteistoa"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Sallii sovelluksen käyttää kasvojentunnistusavauksen laitteistoa todennukseen"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Kasvojentunnistusavaus"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Lisää kasvot uudelleen"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Lisää kasvosi uudelleen tunnistamisen parantamiseksi"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Ota kasvojentunnistusavaus käyttöön"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Avaa puhelimesi lukitus katsomalla laitetta"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Ota käyttöön lisää tapoja avata lukitus"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Napauta lisätäksesi sormenjälki"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Kasvoja ei voi vahvistaa. Laitteisto ei käytettäv."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Yritä käyttää kasvojentunnistusavausta uudelleen."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Uutta kasvodataa ei voi tallentaa. Poista ensin vanhaa."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Kasvotoiminto peruutettu"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Käyttäjä peruutti kasvojentunnistusavauksen."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Liian monta yritystä. Yritä myöhemmin uudelleen."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Liian monta yritystä. Kasvojentunnistusavaus poistettu käytöstä."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Kasvoja ei voi vahvistaa. Yritä uudelleen."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Et ole määrittänyt kasvojentunnistusavausta."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Tämä laite ei tue kasvojentunnistusavausta."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Tunnistin poistettu väliaikaisesti käytöstä."</string> <string name="face_name_template" msgid="3877037340223318119">"Kasvot <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Käytä kasvojentunnistusavausta"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Käytä kasvojentunnistusavausta tai näytön lukitusta"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Jatka kasvojesi avulla"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Jatka kasvojentunnistuksen tai näytön lukituksen avulla"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Laajenna lukituksen poiston aluetta."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Lukituksen poisto liu\'uttamalla."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Lukituksen poisto salasanalla."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Kasvojentunnistusavaus"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Lukituksen poisto PIN-koodilla."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM-kortin PIN-koodin lukituksen avaus"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM-kortin PUK-koodin lukituksen avaus"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index f40f2679aa3f..bcdf829e6c8a 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icône d\'empreinte digitale"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"gérer le matériel de déverrouillage par reconnaissance faciale"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Permet à l\'appli d\'employer des méthodes d\'aj. et de suppr. de modèles de reconn. visage."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"utiliser le matériel de déverrouillage par reconnaissance faciale"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Permet à l\'appli d\'utiliser du matériel de déverr. par reconn. faciale pour l\'authentific."</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Déverrouillage par reconnaissance faciale"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Inscrivez votre visage à nouveau"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Configurer le déverrouillage par reconnaissance faciale"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Déverrouillez votre téléphone en le regardant"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configurer d\'autres méthodes de déverrouillage"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Touchez pour ajouter une empreinte digitale"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Imposs. de vérif. visage. Matériel non accessible."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Réessayez le déverr. par reconnaissance faciale."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Impossible de stocker de nouveaux visages. Supprimez-en un."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Opération de reconnaissance du visage annulée."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Déverr. par reconn. faciale annulé par l\'utilisateur."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Trop de tentatives. Veuillez réessayer plus tard."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Trop de tentatives. Le déverr. par reconnaissance faciale est désactivé."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Impossible de vérifier le visage. Réessayez."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Vous n\'avez pas config. le déverr. par reconn. faciale."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Cet appar. ne prend pas en charge le déverr. par reconn. faciale."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Le capteur a été désactivé temporairement."</string> <string name="face_name_template" msgid="3877037340223318119">"Visage <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Utiliser le déverrouillage par reconnaissance faciale"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Utiliser la reconnaissance faciale ou le verrouillage de l\'écran"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Utilisez votre visage pour continuer"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Utilisez votre visage ou le verrouillage de l\'écran pour continuer"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Développer la zone de déverrouillage"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Déverrouillage en faisant glisser votre doigt sur l\'écran"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Déverrouillage par schéma"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Déverrouillage par reconnaissance faciale"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Déverrouillage par NIP"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Déverrouillage du NIP de la carte SIM."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Déverrouillage du code PUK de la carte SIM."</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 89030af6621e..374e144c00e6 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icône d\'empreinte digitale"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"gérer le matériel de déverrouillage par authentification faciale"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Autorise l\'appli à invoquer des méthodes pour ajouter et supprimer des modèles de visages."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"utiliser le matériel de déverrouillage par authentification faciale"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Autorise l\'appli à utiliser le matériel de déverrouillage par authentification faciale"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Déverrouillage par authentification faciale"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Enregistrer à nouveau votre visage"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Configurer le déverrouillage par authentification faciale"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Déverrouillez votre téléphone en le regardant"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configurer d\'autres méthodes de déverrouillage"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Appuyez pour ajouter une empreinte digitale"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Imposs. valider visage. Matériel non disponible."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Réessayez d\'activer le déverrouillage."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Impossible stocker nouv. visages. Veuillez en supprimer un."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Opération de reconnaissance faciale annulée."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Déverrouillage par authentification faciale annulé par l\'utilisateur"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Trop de tentatives. Réessayez plus tard."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Trop de tentatives. Déverrouillage par authentification faciale désactivé."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Impossible de valider votre visage. Réessayez."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Déverrouillage par authentification faciale non configuré"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Déverrouillage par authentification faciale non compatible"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Capteur temporairement désactivé."</string> <string name="face_name_template" msgid="3877037340223318119">"Visage <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Utiliser déverrouillage facial"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Utiliser déverrouillage par authent. faciale ou verrouillage écran"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Utilisez la reconnaissance faciale pour continuer"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Utilisez la reconnaissance faciale ou le verrouillage de l\'écran pour continuer"</string> @@ -887,7 +893,7 @@ <string name="lockscreen_pattern_wrong" msgid="2940138714468358458">"Veuillez réessayer."</string> <string name="lockscreen_password_wrong" msgid="8605355913868947490">"Veuillez réessayer."</string> <string name="lockscreen_storage_locked" msgid="634993789186443380">"Déverr. pour autres fonctionnalités et données"</string> - <string name="faceunlock_multiple_failures" msgid="681991538434031708">"Nombre maximal de tentatives de déverrouillage par authentification faciale atteint"</string> + <string name="faceunlock_multiple_failures" msgid="681991538434031708">"Nombre maximal de tentatives de déverrouillage par reconnaissance faciale atteint"</string> <string name="lockscreen_missing_sim_message_short" msgid="1248431165144893792">"Pas de carte SIM"</string> <string name="lockscreen_missing_sim_message" product="tablet" msgid="8596805728510570760">"Aucune carte SIM n\'est insérée dans la tablette."</string> <string name="lockscreen_missing_sim_message" product="tv" msgid="2582768023352171073">"Aucune carte SIM n\'est installée dans votre appareil Android TV."</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Développer la zone de déverrouillage"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Déverrouillage en faisant glisser votre doigt sur l\'écran"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Déverrouillage par schéma"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Déverrouillage par authentification faciale"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Déverrouillage par code PIN"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Déverrouillage de la carte SIM à l\'aide d\'un code."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Déverrouillage de la carte SIM à l\'aide d\'une clé PUK."</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 5d2ef9a8f371..e2d65edf253e 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icona de impresión dixital"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"xestionar o hardware de desbloqueo facial"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Permite que a aplicación invoque métodos para engadir e eliminar modelos faciais de uso."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"utilizar o hardware de desbloqueo facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Permite que a aplicación utilice o hardware de desbloqueo facial para a autenticación"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueo facial"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Volve inscribir a túa cara"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para mellorar o recoñecemento, inscribe de novo a túa cara"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Configura o desbloqueo facial"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Mira o teléfono para desbloquealo"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura máis maneiras de desbloquear o dispositivo"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toca para engadir unha impresión dixital"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Sen verificar a cara. Hardware non dispoñible."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Tenta utilizar o desbloqueo facial de novo."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Para gardar novos datos faciais, elimina os antigos."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Cancelouse a operación relacionada coa cara"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"O usuario cancelou o desbloqueo facial."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Demasiados intentos. Téntao de novo máis tarde."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Demasiados intentos. Desactivouse o desbloqueo facial."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Non se puido verificar a cara. Téntao de novo."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Non configuraches o desbloqueo facial."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Este dispositivo non admite o desbloqueo facial."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Desactivouse o sensor temporalmente."</string> <string name="face_name_template" msgid="3877037340223318119">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Utilizar desbloqueo facial"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Utilizar desbloqueo facial ou credencial do dispositivo"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Usa a cara para continuar"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Para continuar, utiliza o desbloqueo facial ou a credencial do dispositivo"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Ampliar zona de desbloqueo."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Desbloqueo pasando o dedo."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Desbloqueo mediante padrón"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Desbloqueo facial"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Desbloqueo mediante PIN"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Desbloqueo da SIM co PIN."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Desbloqueo da SIM co PUK."</string> @@ -1862,9 +1869,9 @@ <string name="managed_profile_label_badge" msgid="6762559569999499495">"<xliff:g id="LABEL">%1$s</xliff:g> do traballo"</string> <string name="managed_profile_label_badge_2" msgid="5673187309555352550">"2.º <xliff:g id="LABEL">%1$s</xliff:g> do traballo"</string> <string name="managed_profile_label_badge_3" msgid="6882151970556391957">"3.º <xliff:g id="LABEL">%1$s</xliff:g> do traballo"</string> - <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"Solicitar PIN para deixar de fixar"</string> - <string name="lock_to_app_unlock_pattern" msgid="2694204070499712503">"Solicitar un padrón de desbloqueo antes de deixar de fixar a pantalla"</string> - <string name="lock_to_app_unlock_password" msgid="9126722403506560473">"Solicitar un contrasinal para deixar de fixar a pantalla"</string> + <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"Pedir PIN antes de soltar a fixación"</string> + <string name="lock_to_app_unlock_pattern" msgid="2694204070499712503">"Pedir padrón de desbloqueo antes de soltar a fixación"</string> + <string name="lock_to_app_unlock_password" msgid="9126722403506560473">"Pedir contrasinal antes de soltar a fixación"</string> <string name="package_installed_device_owner" msgid="7035926868974878525">"Instalado polo teu administrador"</string> <string name="package_updated_device_owner" msgid="7560272363805506941">"Actualizado polo teu administrador"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminado polo teu administrador"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index ff431a50e456..68ab0c5505c6 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ફિંગરપ્રિન્ટ આયકન"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"ફેસ અનલૉકના હાર્ડવેરને મેનેજ કરો"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"ઍપને ઉપયોગ માટે ચહેરાના નમૂના ઉમેરવા અને ડિલીટ કરવાની પદ્ધતિને રદ કરવાની મંજૂરી આપે છે."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"ફેસ અનલૉક હાર્ડવેરનો ઉપયોગ કરો"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"ઍપને પ્રમાણીકરણ માટે ફેસ અનલૉકના હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ફેસ અનલૉક"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"તમારા ચહેરાની ફરી નોંધણી કરાવો"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"ઓળખવાની પ્રક્રિયાને બહેતર બનાવવા માટે કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"ફેસ અનલૉક સુવિધાનું સેટઅપ કરો"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"તમારા ફોનની તરફ જોઈને તેને અનલૉક કરો"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"અનલૉક કરવાની બીજી રીતોનું સેટઅપ કરો"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ફિંગરપ્રિન્ટ ઉમેરવા માટે ટૅપ કરો"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"ચહેરો ચકાસી શકાતો નથી. હાર્ડવેર ઉપલબ્ધ નથી."</string> - <string name="face_error_timeout" msgid="522924647742024699">"ફેસ અનલૉકને ફરી અજમાવો."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"ચહેરાનો નવો ડેટા સ્ટોર કરી શકતાં નથી. પહેલા જૂનો ડિલીટ કરો."</string> <string name="face_error_canceled" msgid="2164434737103802131">"ચહેરા સંબંધિત કાર્યવાહી રદ કરવામાં આવી છે."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"વપરાશકર્તાએ ફેસ અનલૉક રદ કર્યું."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"ઘણા બધા પ્રયત્નો. થોડા સમય પછી ફરી પ્રયાસ કરો."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"ઘણા બધા પ્રયાસો. ફેસ અનલૉક બંધ કર્યું."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"ચહેરો ચકાસી શકાતો નથી. ફરી પ્રયાસ કરો."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"તમે ફેસ અનલૉકનું સેટઅપ કર્યું નથી."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"આ ડિવાઇસ પર ફેસ અનલૉક કરવાની સુવિધા નથી."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"સેન્સર હંગામી રૂપે બંધ કર્યું છે."</string> <string name="face_name_template" msgid="3877037340223318119">"ચહેરાનું <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"ફેસ અનલૉકનો ઉપયોગ કરો"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ફેસ લૉક અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"આગળ વધવા માટે તમારા ચહેરાનો ઉપયોગ કરો"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ચાલુ રાખવા માટે તમારા ફેસ લૉક અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"અનલૉક ક્ષેત્ર વિસ્તૃત કરો."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"સ્લાઇડ અનલૉક કરો."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"પૅટર્ન અનલૉક."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"ફેસ અનલૉક"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"પિન અનલૉક."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"પિનથી સિમને અનલૉક કરો."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Pukથી સિમને અનલૉક કરો."</string> @@ -1869,10 +1876,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"તમારા વ્યવસ્થાપક દ્વારા અપડેટ કરવામાં આવેલ છે"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"તમારા વ્યવસ્થાપક દ્વારા કાઢી નાખવામાં આવેલ છે"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ઓકે"</string> - <!-- no translation found for battery_saver_description_with_learn_more (4877297130366222145) --> - <skip /> - <!-- no translation found for battery_saver_description (8518809702138617167) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="4877297130366222145">"બૅટરી સેવર ઘેરી થીમની સુવિધા ચાલુ કરે છે અને બૅકગ્રાઉન્ડ પ્રવૃત્તિ, અમુક વિઝ્યુઅલ ઇફેક્ટ, અમુક સુવિધાઓ અને કેટલાક નેટવર્ક કનેક્શન મર્યાદિત કે બંધ કરે છે.\n\n"<annotation id="url">"વધુ જાણો"</annotation></string> + <string name="battery_saver_description" msgid="8518809702138617167">"બૅટરી સેવર ઘેરી થીમની સુવિધા ચાલુ કરે છે અને બૅકગ્રાઉન્ડ પ્રવૃત્તિ, અમુક વિઝ્યુઅલ ઇફેક્ટ, અમુક સુવિધાઓ અને કેટલાક નેટવર્ક કનેક્શન મર્યાદિત કે બંધ કરે છે."</string> <string name="data_saver_description" msgid="4995164271550590517">"ડેટા વપરાશને ઘટાડવામાં સહાય માટે, ડેટા સેવર કેટલીક ઍપને બૅકગ્રાઉન્ડમાં ડેટા મોકલવા અથવા પ્રાપ્ત કરવાથી અટકાવે છે. તમે હાલમાં ઉપયોગ કરી રહ્યાં છો તે ઍપ ડેટાને ઍક્સેસ કરી શકે છે, પરંતુ તે આ ક્યારેક જ કરી શકે છે. આનો અર્થ એ હોઈ શકે છે, ઉદાહરણ તરીકે, છબીઓ ત્યાં સુધી પ્રદર્શિત થશે નહીં જ્યાં સુધી તમે તેને ટૅપ નહીં કરો."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ડેટા સેવર ચાલુ કરીએ?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ચાલુ કરો"</string> @@ -1975,10 +1980,8 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> હમણાં ઉપલબ્ધ નથી. આને <xliff:g id="APP_NAME_1">%2$s</xliff:g> દ્વારા મેનેજ કરવામાં આવે છે."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"વધુ જાણો"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"ઍપ ફરી શરૂ કરો"</string> - <!-- no translation found for work_mode_off_title (961171256005852058) --> - <skip /> - <!-- no translation found for work_mode_off_message (7319580997683623309) --> - <skip /> + <string name="work_mode_off_title" msgid="961171256005852058">"શું ઑફિસ માટેની ઍપ ચાલુ કરીએ?"</string> + <string name="work_mode_off_message" msgid="7319580997683623309">"તમારી ઑફિસ માટેની ઍપ અને નોટિફિકેશનનો ઍક્સેસ મેળવો"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"ચાલુ કરો"</string> <string name="app_blocked_title" msgid="7353262160455028160">"ઍપ ઉપલબ્ધ નથી"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> હાલમાં ઉપલબ્ધ નથી."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 31455428db28..e7a22183cf24 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"फ़िंगरप्रिंट आइकॉन"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"\'मालिक का चेहरा पहचानकर अनलॉक\' वाला हार्डवेयर प्रबंधित करें"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"ऐप्लिकेशन को चेहरे के टेम्पलेट इस्तेमाल के तरीके जोड़ने और मिटाने की मंज़ूरी मिलती है."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"फ़ेस अनलॉक हार्डवेयर इस्तेमाल करें"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"फ़ेस अनलॉक हार्डवेयर के इस्तेमाल की मंज़ूरी देता है"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"फ़ेस अनलॉक"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"अपना चेहरा फिर से दर्ज करें"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"कृपया अपना चेहरा फिर से दर्ज करें ताकि आपको बेहतर तरीके से पहचाना जा सके"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"फ़ेस अनलॉक की सुविधा सेट अप करें"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"अपने फ़ोन की तरफ़ देखकर उसे अनलॉक करें"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"फ़ोन को अनलॉक करने के दूसरे तरीके सेट अप करें"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"फ़िंगरप्रिंट जोड़ने के लिए टैप करें"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"चेहरा नहीं पहचान पा रहे. हार्डवेयर उपलब्ध नहीं है."</string> - <string name="face_error_timeout" msgid="522924647742024699">"फ़ेस अनलॉक की सुविधा फिर से आज़माएं."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"चेहरे का नया डेटा सेव नहीं हो सकता. कोई पुराना डेटा मिटाएं."</string> <string name="face_error_canceled" msgid="2164434737103802131">"चेहरा पहचानने की कार्रवाई रद्द की गई."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"उपयोगकर्ता ने \'मालिक का चेहरा पहचानकर अनलॉक\' रद्द की."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"कई बार कोशिश की गई. बाद में कोशिश करें."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"कई बार कोशिश की जा चुकी है. \'मालिक का चेहरा पहचानकर अनलॉक\' बंद है."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"चेहरा नहीं पहचान पा रहे. फिर से कोशिश करें."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"आपने \'मालिक का चेहरा पहचानकर अनलॉक\' सेट नहीं की है."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"इस डिवाइस पर फ़ेस अनलॉक की सुविधा काम नहीं करती है."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"सेंसर कुछ समय के लिए बंद कर दिया गया है."</string> <string name="face_name_template" msgid="3877037340223318119">"चेहरा <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"\'फ़ेस अनलॉक\' इस्तेमाल करें"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"\'फ़ेस अनलॉक\' या स्क्रीन लॉक का क्रेडेंशियल इस्तेमाल करें"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"जारी रखने के लिए, अपने चेहरे की मदद से पुष्टि करें"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"जारी रखने के लिए, अपना चेहरा दिखाकर या स्क्रीन लॉक क्रेडेंशियल डालकर पुष्टि करें"</string> @@ -731,13 +737,13 @@ <string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"स्क्रीन को अनलॉक करते समय ध्यान रखें कि कितनी बार गलत पासवर्ड डाला गया है. अगर बहुत ज़्यादा बार गलत पासवर्ड डाला गया है, तो अपने Android TV डिवाइस को तुरंत लॉक करें या इस उपयोगकर्ता का सभी डेटा मिटाएं."</string> <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"स्क्रीनका लॉक खोलते समय गलत तरीके से लिखे गए पासवर्ड पर नज़र रखें, और अगर बार-बार गलत पासवर्ड लिखा जाता है तो फ़ोन को लॉक करें या इस उपयोगकर्ता का सभी डेटा मिटा दें."</string> <string name="policylab_resetPassword" msgid="214556238645096520">"स्क्रीन लॉक बदलना"</string> - <string name="policydesc_resetPassword" msgid="4626419138439341851">"स्क्रीन लॉक बदलना."</string> + <string name="policydesc_resetPassword" msgid="4626419138439341851">"इससे स्क्रीन लॉक बदला जाता है."</string> <string name="policylab_forceLock" msgid="7360335502968476434">"स्क्रीन लॉक करना"</string> - <string name="policydesc_forceLock" msgid="1008844760853899693">"इससे नियंत्रित होगा कि स्क्रीन कैसे और कब लॉक हो."</string> + <string name="policydesc_forceLock" msgid="1008844760853899693">"इससे यह कंट्रोल होता है कि स्क्रीन कैसे और कब लॉक हो."</string> <string name="policylab_wipeData" msgid="1359485247727537311">"सारा डेटा मिटाना"</string> <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"फ़ैक्टरी डेटा रीसेट करके चेतावनी दिए बिना फ़ोन का डेटा मिटाना."</string> <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"फ़ैक्ट्री डेटा रीसेट करके अपने Android TV डिवाइस का डेटा बिना चेतावनी दिए मिटाएं."</string> - <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"फ़ैक्टरी डेटा रीसेट करके चेतावनी दिए बिना फ़ोन का डेटा मिटाना."</string> + <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"इससे फ़ैक्टरी डेटा रीसेट करके, चेतावनी दिए बिना फ़ोन का डेटा मिट जाता है."</string> <string name="policylab_wipeData_secondaryUser" msgid="413813645323433166">"उपयोगकर्ता डेटा मिटाएं"</string> <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"इस टैबलेट पर मौजूद इस उपयोगकर्ता का डेटा बिना चेतावनी के मिटा दें."</string> <string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2293713284515865200">"बिना चेतावनी दिए, इस Android TV डिवाइस से उपयोगकर्ता का डेटा मिटाएं."</string> @@ -751,7 +757,7 @@ <string name="policylab_disableCamera" msgid="5749486347810162018">"कैमरों को अक्षम करें"</string> <string name="policydesc_disableCamera" msgid="3204405908799676104">"सभी डिवाइस कैमरों का उपयोग रोकें."</string> <string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"स्क्रीन लॉक की कुछ सुविधाएं बंद करना"</string> - <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"यह कुछ स्क्रीन लाॅक सुविधाओं का इस्तेमाल रोकती है."</string> + <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"इससे कुछ स्क्रीन लॉक सुविधाओं का इस्तेमाल रोका जाता है."</string> <string-array name="phoneTypes"> <item msgid="8996339953292723951">"घर"</item> <item msgid="7740243458912727194">"मोबाइल"</item> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"अनलॉक क्षेत्र का विस्तार करें."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"स्लाइड अनलॉक."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"आकार अनलॉक."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"मालिक का चेहरा पहचानकर अनलॉक करें."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"पिन अनलॉक."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"पिन के ज़रिए सिम अनलॉक करें."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"पीयूके के ज़रिए सिम अनलॉक करें."</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index ecb90008127a..f18080f25d68 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -612,14 +612,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona otiska prsta"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"Upravljajte hardverom za otključavanje licem"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Aplikaciji omogućuje pozivanje načina za dodavanje i brisanje predložaka lica za upotrebu."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"Koristiti hardver za otključavanje licem"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Aplikaciji omogućuje upotrebu hardvera za otključavanje licem radi autentifikacije"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Otključavanje licem"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Ponovo registrirajte svoje lice"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Za poboljšanje prepoznavanja ponovo registrirajte svoje lice"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Postavite otključavanje licem"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Otključajte telefon gledajući u njega"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Postavite više načina otključavanja"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Dodirnite da biste dodali otisak prsta"</string> @@ -646,18 +644,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Lice nije potvrđeno. Hardver nije dostupan."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Ponovo pokušajte otključavanje licem."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Podaci o novom licu nisu pohranjeni. Izbrišite neko staro."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Otkazana je radnja s licem."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Otključavanje licem otkazao je korisnik."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Previše pokušaja. Pokušajte ponovo kasnije."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Previše pokušaja. Onemogućeno otključavanje licem"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Lice nije potvrđeno. Pokušajte ponovo."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Niste postavili otključavanje licem"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Otključavanje licem nije podržano na ovom uređaju."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Senzor je privremeno onemogućen."</string> <string name="face_name_template" msgid="3877037340223318119">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Upotreba otključavanja licem"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Upotreba otključavanja licem ili zaključavanja zaslona"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Autentificirajte se licem da biste nastavili"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Za nastavak se identificirajte licem ili vjerodajnicom zaključavanja zaslona"</string> @@ -960,7 +966,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Proširivanje područja za otključavanje."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Otključavanje klizanjem."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Uzorak za otključavanje."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Otključavanje licem."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Otključavanje PIN-om."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Otključavanje SIM-a PIN-om."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Otključavanje SIM-a PUK-om."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 755210b6e80f..17942d0c1a70 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ujjlenyomat ikon"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"arcalapú feloldásra szolgáló hardver kezelése"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Engedélyezi, hogy az alkalmazás arcsablon-hozzáadási és -törlési metódusokat hívjon."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"arcalapú feloldásra szolgáló hardver használata"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Engedélyezi, hogy az alkalmazás hitelesítésre használja az arcalapú feloldás hardverét"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Arcalapú feloldás"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Rögzítsen újra képet az arcáról"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"A felismerés javítása érdekében rögzítsen újra az arcáról készített képet"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Az arcalapú feloldás beállítása"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Feloldhatja a zárolást úgy, hogy ránéz a telefonra"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"További feloldási módszerek beállítása"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Koppintson ide ujjlenyomat hozzáadásához"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Sikertelen arcellenőrzés. A hardver nem érhető el."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Próbálja újra az arcalapú feloldást."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Nem tárolhatók újabb arcadatok. Törölje valamelyik arcot."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Az arccal kapcsolatos művelet törölve."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Az arcalapú feloldást megszakította a felhasználó."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Túl sok próbálkozás. Próbálja újra később."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Túl sok próbálkozás. Az arcalapú feloldás letiltva."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Nem sikerült ellenőrizni az arcát. Próbálja újra."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Nem állította be az arcalapú feloldást."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Az eszköz nem támogatja az arcalapú feloldást"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Az érzékelő átmenetileg le van tiltva."</string> <string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> arc"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Arcalapú feloldás használata"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"A folytatás arcalapú feloldással vagy képernyőzárral lehetséges"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"A folytatáshoz használja az arcalapú feloldást"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"A folytatás arcalapú feloldással vagy a képernyőzár feloldásával lehetséges"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"A feloldási terület kiterjesztése."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Feloldás csúsztatással"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Feloldás mintával"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Arcalapú feloldás"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Feloldás PIN kóddal"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM-kártya PIN-kódjának feloldása."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM-kártya PUK-kódjának feloldása."</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index befc68d207f7..8c2f27df669d 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Մատնահետքի պատկերակ"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"կառավարել դեմքով ապակողպման համար սարքը"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Հավելվածին թույլ է տալիս ավելացնել և հեռացնել դեմքի նմուշներ:"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"օգտագործել դեմքով ապակողպման համար սարքը"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Թույլ է տալիս հավելվածին օգտագործել դեմքով ապակողպման համար նախատեսված սարքը"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Դեմքով ապակողպում"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Նորից գրանցեք ձեր դեմքը"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Ճանաչումը լավացնելու համար նորից գրանցեք ձեր դեմքը"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Կարգավորեք դեմքով ապակողպումը"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Ապակողպելու համար պարզապես նայեք հեռախոսին"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Կարգավորեք ապակողպելու այլ եղանակներ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Հպեք՝ մատնահետք ավելացնելու համար"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Չհաջողվեց հաստատել դեմքը։ Սարքն անհասանելի է:"</string> - <string name="face_error_timeout" msgid="522924647742024699">"Նորից փորձեք դեմքով ապակողպումը։"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Չհաջողվեց պահել նոր դեմքը։ Ջնջեք հին տարբերակը։"</string> <string name="face_error_canceled" msgid="2164434737103802131">"Դեմքի ճանաչումը չեղարկվել է։"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Դեմքով ապակողմումը չեղարկվել է օգտատիրոջ կողմից:"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Չափից շատ փորձեր եք կատարել: Փորձեք ավելի ուշ:"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Չափազանց շատ փորձեր են արվել։ Դեմքով ապակողպումն անջատված է:"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Չհաջողվեց հաստատել դեմքը։ Նորից փորձեք։"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Դուք չեք կարգավորել դեմքով ապակողպումը:"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Դեմքով ապակողպումն այս սարքում չի աջակցվում"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Տվիչը ժամանակավորապես անջատված է:"</string> <string name="face_name_template" msgid="3877037340223318119">"Դեմք <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Օգտագործել դեմքով ապակողպում"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Օգտագործել դեմքով ապակողպում կամ էկրանի կողպում"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Շարունակելու համար օգտագործեք դեմքի նույնականացումը"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Շարունակելու համար օգտագործեք ձեր դեմքը կամ էկրանի կողպումը"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Ընդլայնել ապակողպման տարածությունը:"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Էջի ապակողպում:"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Սխեմայով ապակողպում:"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Դեմքով ապակողպում:"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin-ն ապակողպված է:"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM քարտի ապակողպում PIN կոդի միջոցով:"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM քարտի ապակողպում PUK կոդի միջոցով:"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 61158351e555..16644a2ebead 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikon sidik jari"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"kelola hardware face unlock"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Mengizinkan apl memicu metode untuk menambah & menghapus template wajah untuk digunakan."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"gunakan hardware face unlock"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Mengizinkan aplikasi untuk menggunakan hardware face unlock untuk autentikasi"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Face unlock"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Daftarkan kembali wajah Anda"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Untuk menyempurnakan pengenalan wajah, daftarkan kembali wajah Anda"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Siapkan face unlock"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Buka kunci ponsel dengan melihat ke ponsel"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Siapkan lebih banyak cara untuk membuka kunci"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ketuk untuk menambahkan sidik jari"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Tidak dapat memverifikasi wajah. Hardware tidak tersedia."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Coba face unlock lagi."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Tidak dapat menyimpan data wajah. Hapus dahulu data lama."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Pemrosesan wajah dibatalkan."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Face unlock dibatalkan oleh pengguna."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Terlalu banyak percobaan. Coba lagi nanti."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Terlalu banyak gagal. Face unlock dinonaktifkan."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Tidak dapat memverifikasi wajah. Coba lagi."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Anda belum menyiapkan face unlock."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Face unlock tidak didukung di perangkat ini."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor dinonaktifkan untuk sementara."</string> <string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> wajah"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Gunakan face unlock"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Gunakan face lock atau kunci layar"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Gunakan wajah untuk melanjutkan"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gunakan face lock atau kunci layar untuk melanjutkan"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Luaskan area buka kunci."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Buka kunci dengan menggeser."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Buka kunci dengan pola."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Buka kunci dengan face unlock."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Buka kunci dengan PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"PIN SIM terbuka."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"PUK SIM terbuka."</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 199546ef0f8a..46544b0ac4a7 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingrafaratákn"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"stjórna vélbúnaði andlitsopnunar"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Leyfir forritinu að beita aðferðum til að bæta við og eyða andlitssniðmátum til notkunar."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"nota vélbúnað andlitsopnunar"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Leyfir forritinu að nota vélbúnað andlitsopnunar til auðkenningar"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Andlitsopnun"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Skráðu andlitið þitt aftur"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Skráðu andlitið þitt til að bæta kennsl"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Setja upp andlitsopnun"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Taktu símann úr lás með því að horfa á hann"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Settu upp fleiri leiðir til að taka úr lás"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ýttu til að bæta við fingrafari"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Andlit ekki staðfest. Vélbúnaður er ekki tiltækur."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Prófaðu andlitsopnun aftur."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Ekki er hægt að vista ný andlitsgögn. Eyddu gömlu fyrst."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Hætt við andlitsgreiningu."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Notandi hætti við andlitsopnun."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Of margar tilraunir. Reyndu aftur síðar."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Of margar tilraunir. Slökkt á andlitsopnun."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Ekki tókst að staðfesta andlit. Reyndu aftur."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Þú hefur ekki sett upp andlitsopnun."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Andlitsopnun er ekki studd í þessu tæki."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Slökkt tímabundið á skynjara."</string> <string name="face_name_template" msgid="3877037340223318119">"Andlit <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Nota andlitsopnun"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Nota andlit eða skjálás"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Notaðu andlitið þitt til að halda áfram"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Notaðu andlitið eða skjálás til að halda áfram"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Stækka opnunarsvæði."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Opnun með stroku."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Opnun með mynstri."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Andlitsopnun."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Opnun með PIN-númeri."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Taka PIN-númer SIM-korts úr lás."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Taka PUK-númer SIM-korts úr lás."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 9a00c9926de5..4aa67a616c15 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icona dell\'impronta"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"gestione dell\'hardware per lo sblocco con il volto"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Consente all\'app di richiamare i metodi per aggiungere e rimuovere i modelli di volti."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"utilizzo dell\'hardware per lo sblocco con il volto"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Consente all\'app di usare hardware per l\'autenticazione mediante lo sblocco con il volto"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Sblocco con il volto"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Registra di nuovo il volto"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Per migliorare il riconoscimento, registra di nuovo il tuo volto"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Configura lo sblocco con il volto"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Sblocca il telefono guardandolo"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configura altri modi per sbloccare"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tocca per aggiungere un\'impronta"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Imposs. verificare volto. Hardware non disponibile."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Riprova lo sblocco con il volto."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Imposs. salvare dati nuovi volti. Elimina un volto vecchio."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Operazione associata al volto annullata."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Sblocco con il volto annullato dall\'utente."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Troppi tentativi. Riprova più tardi."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Troppi tentativi. Lo sblocco con il volto è disattivato."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Impossibile verificare il volto. Riprova."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Non hai configurato lo sblocco con il volto."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Sblocco con il volto non supportato su questo dispositivo."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensore temporaneamente disattivato."</string> <string name="face_name_template" msgid="3877037340223318119">"Volto <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Usa lo sblocco con il volto"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Usa lo sblocco con il volto o il blocco schermo"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Usa il tuo volto per continuare"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Per continuare devi usare il tuo volto o il tuo blocco schermo"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Espandi area di sblocco."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Sblocco con scorrimento."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Sblocco con sequenza."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Sblocco con il volto."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Sblocco con PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Sblocco tramite PIN della SIM."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Sblocco tramite PUK della SIM."</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 0280b10e4453..ea38642e9b5a 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -615,14 +615,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"סמל טביעת אצבע"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"ניהול החומרה לפתיחה ע\"י זיהוי הפנים"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"מאפשרת לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות פנים שבהן ייעשה שימוש."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"שימוש בחומרה לפתיחה ע\"י זיהוי הפנים"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"מאפשרת לאפליקציה להשתמש בחומרה לפתיחה ע\"י זיהוי הפנים"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"פתיחה ע\"י זיהוי הפנים"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"יש לבצע סריקה חוזרת של הפנים שלך"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"לשיפור הזיהוי יש לסרוק מחדש את הפנים שלך"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"הגדרה של פתיחה ע\"י זיהוי הפנים"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"יש להביט בטלפון כדי לבטל את נעילתו"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"אפשר להגדיר דרכים נוספות לביטול נעילה"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"יש להקיש כדי להוסיף טביעת אצבע"</string> @@ -649,18 +647,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"לא ניתן לאמת את הפנים. החומרה לא זמינה."</string> - <string name="face_error_timeout" msgid="522924647742024699">"יש לנסות שוב את הפתיחה ע\"י זיהוי הפנים."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"לא ניתן לאחסן נתוני פנים חדשים. תחילה יש למחוק את הנתונים הישנים."</string> <string name="face_error_canceled" msgid="2164434737103802131">"הפעולה לאימות הפנים בוטלה."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"פתיחה ע\"י זיהוי הפנים בוטל על ידי המשתמש."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"יותר מדי ניסיונות. \'פתיחה ע\"י זיהוי הפנים\' מושבת."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"לא ניתן לאמת את הפנים. יש לנסות שוב."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"לא הגדרת פתיחה ע\"י זיהוי הפנים."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"המכשיר הזה לא תומך בפתיחה ע\"י זיהוי הפנים."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"החיישן מושבת באופן זמני."</string> <string name="face_name_template" msgid="3877037340223318119">"פנים <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"פתיחה ע\"י זיהוי הפנים"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"שימוש בזיהוי פנים או בנעילת מסך"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"יש להשתמש באימות פנים כדי להמשיך"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"יש להשתמש בזיהוי הפנים או בנעילת המסך כדי להמשיך"</string> @@ -963,7 +969,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"הרחבה של אזור ביטול הנעילה."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"ביטול נעילה באמצעות הסטה."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"ביטול נעילה על ידי שרטוט קו."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"פתיחה ע\"י זיהוי הפנים."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"ביטול נעילה באמצעות קוד אימות."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"ביטול הנעילה של קוד האימות ל-SIM."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"ביטול נעילה של PUK ל-SIM."</string> @@ -2161,8 +2168,7 @@ <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"אישור"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"השבתה"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"מידע נוסף"</string> - <!-- no translation found for nas_upgrade_notification_learn_more_content (3735480566983530650) --> - <skip /> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"ההתראות המשופרות החליפו את ההתראות המותאמות ל-Android ב-Android 12. התכונה הזו מציגה הצעות לפעולות ולתשובות ומארגנת את ההתראות שלך.\n\nההתראות המשופרות יכולות לקבל גישה לתוכן של התראות, כולל מידע אישי כמו שמות אנשי קשר והודעות. התכונה הזו יכולה גם לסגור התראות או להשיב להן, למשל מענה לשיחות טלפון ושליטה בתכונה \'נא לא להפריע\'."</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"התראת מידע לגבי מצב שגרתי"</string> <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"הסוללה עלולה להתרוקן לפני המועד הרגיל של הטעינה"</string> <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"תכונת החיסכון בסוללה הופעלה כדי להאריך את חיי הסוללה"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index ef3e8793aa5b..085a909fa8b9 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"指紋アイコン"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"顔認証ハードウェアの管理"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"使用する顔テンプレートの追加や削除を行うメソッドの呼び出しをアプリに許可します。"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"顔認証ハードウェアの使用"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"顔認証ハードウェアを認証に使用することをアプリに許可します"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"顔認証"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"顔の再登録"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"認識を改善するには、顔を再登録してください"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"顔認証の設定"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"スマートフォンに顔を向けるとロックが解除されます"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"その他のロック解除方法の設定"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"タップすると指紋が追加されます"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"顔を確認できません。ハードウェアを利用できません。"</string> - <string name="face_error_timeout" msgid="522924647742024699">"顔認証をもう一度お試しください。"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"新しい顔データを保存できません。古いデータを削除してください。"</string> <string name="face_error_canceled" msgid="2164434737103802131">"顔の操作をキャンセルしました。"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"顔認証はユーザーによりキャンセルされました。"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"試行回数の上限です。後でもう一度お試しください。"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"試行回数が上限を超えたため、顔認証を無効にしました。"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"顔を確認できません。もう一度お試しください。"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"顔認証を設定していません。"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"このデバイスでは、顔認証はご利用いただけません。"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"センサーが一時的に無効になっています。"</string> <string name="face_name_template" msgid="3877037340223318119">"顔 <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"顔認証の使用"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"顔認証または画面ロックの使用"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"続行するには顔認証を使用してください"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"続行するには、顔認証または画面ロックを使用してください"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"ロック解除エリアを拡大します。"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"スライドロックを解除します。"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"パターンロックを解除します。"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"顔認証を行います。"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"PINロックを解除します。"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM PIN のロックを解除します。"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM PUK のロックを解除します。"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 98a2a4c338dd..17cfe4ccabf9 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"თითის ანაბეჭდის ხატულა"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"სახით განბლოკვის აპარატურის მართვა"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"საშუალებას აძლევს აპს, დაამატოს და წაშალოს სახეების შაბლონები."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"სახით განბლოკვის აპარატურის გამოყენება"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"საშუალებას აძლევს აპს, ამოცნობისთვის გამოიყენოს სახით განბლოკვის აპარატურა"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"სახით განბლოკვა"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"დაარეგისტრირეთ თქვენი სახე ხელახლა"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"ამოცნობის გასაუმჯობესებლად, გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"სახით განბლოკვის დაყენება"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"განბლოკეთ თქვენი ტელეფონი შეხედვით"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"დააყენეთ განბლოკვის სხვა ხერხები"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"შეეხეთ თითის ანაბეჭდის დასამატებლად"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"სახე ვერ დასტურდება. აპარატი მიუწვდომელია."</string> - <string name="face_error_timeout" msgid="522924647742024699">"ცადეთ ხელახლა სახით განბლოკვა."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"სახის ახალი მონაცემები ვერ ინახება. ჯერ ძველი წაშალეთ."</string> <string name="face_error_canceled" msgid="2164434737103802131">"სახის ამოცნობა გაუქმდა."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"სახით განბლოკვა გაუქმდა მომხმარებლის მიერ."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"დაფიქსირდა ბევრი მცდელობა. ცადეთ მოგვიანებით."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"მეტისმეტად ბევრი მცდელობა იყო. სახით განბლოკვა გათიშულია."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"სახის დადასტურება ვერ ხერხდება. ცადეთ ხელახლა."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"თქვენ არ დაგიყენებიათ სახით განბლოკვა."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"სახით განბლოკვა ამ მოწყობილობაზე მხარდაჭერილი არ არის."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"სენსორი დროებით გათიშულია."</string> <string name="face_name_template" msgid="3877037340223318119">"სახე <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"გამოიყენეთ სახით განბლოკვა"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"გამოიყენეთ სახით ან ეკრანის დაბლოკვა"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"გასაგრძელებლად გამოიყენეთ თქვენი სახე"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"გასაგრძელებლად გამოიყენეთ თქვენი სახე ან ეკრანის განბლოკვის ნიმუში"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"განბლოკვის სივრცის გაშლა."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"გასრიალებით განბლოკვა"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"განბლოკვა ნიმუშით."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"სახით განბლოკვა"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"განბლოკვა Pin-ით."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM-ის PIN-კოდით განბლოკვა."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM-ის PUK-კოდით განბლოკვა."</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 5290dddf3707..de0373c85593 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Саусақ ізі белгішесі"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"Бет тану жабдығын басқару"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Қолданбаға пайдаланатын бет үлгілерін енгізу және жою әдістерін шақыруға мүмкіндік береді."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"Бет тану жабдығын пайдалану"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Аутентификациялау үшін қолданбаға бет тану жабдығын пайдалануға рұқсат береді."</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Бет тану"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Бетті қайта тіркеу"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Құрылғы жүзіңізді жақсырақ тануы үшін, бетіңізді қайта тіркеңіз."</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Бет тану функциясын реттеу"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Телефоныңызға қарап, оның құлпын ашыңыз."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Құлыпты ашудың басқа тәсілдерін реттеу"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Саусақ ізін қосу үшін түртіңіз."</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Бетті тану мүмкін емес. Жабдық қолжетімді емес."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Бет тану функциясын қайта қолданып көріңіз."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Жаңа бетті сақтау мүмкін емес. Алдымен ескісін жойыңыз."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Бетті танудан бас тартылды."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Пайдаланушы бет тану функциясынан бас тартты."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Тым көп әрекет жасалды. Кейінірек қайталаңыз."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Тым көп әрекет жасалды. Бет тану функциясы өшірілді."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Бетті тану мүмкін емес. Әрекетті қайталаңыз."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Бет тану реттелмеді."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Бұл құрылғыда бет тану функциясы істемейді."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Датчик уақытша өшірулі."</string> <string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> беті"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Бет тану функциясын пайдалану"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Face Lock функциясын немесе экран құлпын пайдалану"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Жалғастыру үшін бетіңізді көрсетіңіз."</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Жалғастыру үшін бетті анықтау функциясын немесе экран құлпын пайдаланыңыз."</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Ашу аймағын кеңейту."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Сырғыту арқылы ашу."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Кескін арқылы ашу."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Бет тану."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin арқылы ашу."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM құлпын PIN кодымен ашу"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM құлпын PUK кодымен ашу"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 09632dd93c08..1cb767927a1e 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"រូបស្នាមម្រាមដៃ"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"គ្រប់គ្រងហាតវែរដោះសោតាមទម្រង់មុខ"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"អនុញ្ញាតឱ្យកម្មវិធីប្រើវិធីសាស្ត្រដើម្បីបញ្ចូល និងលុបទម្រង់គំរូផ្ទៃមុខសម្រាប់ប្រើប្រាស់។"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"ប្រើហាតវែរដោះសោតាមទម្រង់មុខ"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"អនុញ្ញាតឱ្យកម្មវិធីប្រើហាតវែរដោះសោតាមទម្រង់មុខសម្រាប់ការផ្ទៀងផ្ទាត់"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ដោះសោតាមទម្រង់មុខ"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ស្កេនបញ្ចូលមុខរបស់អ្នកម្ដងទៀត"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"ដើម្បីធ្វើឱ្យការសម្គាល់មុខប្រសើរជាងមុន សូមស្កេនបញ្ចូលមុខរបស់អ្នកម្ដងទៀត"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"រៀបចំការដោះសោតាមទម្រង់មុខ"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"ដោះសោទូរសព្ទរបស់អ្នកដោយសម្លឹងមើលវា"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"រៀបចំវិធីច្រើនទៀតដើម្បីដោះសោ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ចុចដើម្បីបញ្ចូលស្នាមម្រាមដៃ"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"មិនអាចផ្ទៀងផ្ទាត់មុខបានទេ។ មិនមានហាតវែរទេ។"</string> - <string name="face_error_timeout" msgid="522924647742024699">"សាកល្បងដោះសោតាមទម្រង់មុខម្ដងទៀត។"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"មិនអាចផ្ទុកទិន្នន័យទម្រង់មុខថ្មីបានទេ។ សូមលុបទិន្នន័យទម្រង់មុខចាស់ជាមុនសិន។"</string> <string name="face_error_canceled" msgid="2164434737103802131">"បានបោះបង់ប្រតិបត្តិការចាប់ផ្ទៃមុខ។"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"អ្នកប្រើប្រាស់បានបោះបង់ការដោះសោតាមទម្រង់មុខ។"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"ការដោះសោតាមទម្រង់មុខត្រូវបានបិទ ដោយសារព្យាយាមច្រើនដងពេក។"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"មិនអាចផ្ទៀងផ្ទាត់មុខបានទេ។ សូមព្យាយាមម្ដងទៀត។"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"អ្នកមិនទាន់រៀបចំការដោះសោតាមទម្រង់មុខនៅឡើយទេ។"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"មិនអាចប្រើការដោះសោតាមទម្រង់មុខនៅលើឧបករណ៍នេះបានទេ។"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"បានបិទឧបករណ៍ចាប់សញ្ញាជាបណ្តោះអាសន្ន។"</string> <string name="face_name_template" msgid="3877037340223318119">"ផ្ទៃមុខទី <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"ប្រើការដោះសោតាមទម្រង់មុខ"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ប្រើមុខ ឬការចាក់សោអេក្រង់"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"ប្រើមុខរបស់អ្នក ដើម្បីបន្ត"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ប្រើការចាក់សោអេក្រង់ ឬមុខរបស់អ្នក ដើម្បីបន្ត"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"ពង្រីកតំបន់ដោះសោ។"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"រុញដោះសោ។"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"លំនាំដោះសោ។"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"ដោះសោតាមទម្រង់មុខ។"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"កូដ PIN ដោះសោ។"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"ដោះកូដ Pin របស់សីុម។"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"ដោះកូដ Puk របស់សីុម។"</string> @@ -1862,7 +1869,7 @@ <string name="managed_profile_label_badge" msgid="6762559569999499495">"កន្លែងធ្វើការ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5673187309555352550">"<xliff:g id="LABEL">%1$s</xliff:g> ការងារទី 2"</string> <string name="managed_profile_label_badge_3" msgid="6882151970556391957">"<xliff:g id="LABEL">%1$s</xliff:g> ការងារទី 3"</string> - <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"សួររកកូដ PIN មុនពេលផ្ដាច់"</string> + <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"សួររកកូដ PIN មុនពេលដកខ្ទាស់"</string> <string name="lock_to_app_unlock_pattern" msgid="2694204070499712503">"សួររកលំនាំដោះសោមុនពេលដោះខ្ទាស់"</string> <string name="lock_to_app_unlock_password" msgid="9126722403506560473">"សួររកពាក្យសម្ងាត់មុនពេលផ្ដាច់"</string> <string name="package_installed_device_owner" msgid="7035926868974878525">"ដំឡើងដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index da9546681baa..ad71e8eae41d 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಹಾರ್ಡ್ವೇರ್ ಅನ್ನು ನಿರ್ವಹಿಸಿ"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"ಬಳಕೆಗೆ ಮುಖದ ಟೆಂಪ್ಲೇಟ್ಗಳನ್ನು ಸೇರಿಸಲು ಮತ್ತು ಅಳಿಸಲು ವಿಧಾನಗಳನ್ನು ಮನವಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಹಾರ್ಡ್ವೇರ್ ಬಳಸಿ"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"ಪ್ರಮಾಣೀಕರಣಕ್ಕಾಗಿ ಫೇಸ್ ಅನ್ಲಾಕ್ ಹಾರ್ಡ್ವೇರ್ ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ಫೇಸ್ ಅನ್ಲಾಕ್"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"ಗುರುತಿಸುವಿಕೆಯನ್ನು ಹೆಚ್ಚಿಸಲು ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಸೆಟಪ್ ಮಾಡಿ"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"ಫೋನ್ ಅನ್ನು ನೋಡುವ ಮೂಲಕ ಅನ್ಲಾಕ್ ಮಾಡಿ"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಹೆಚ್ಚಿನ ಮಾರ್ಗಗಳನ್ನು ಹೊಂದಿಸಿ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಸೇರಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"ಮುಖ ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಹಾರ್ಡ್ವೇರ್ ಲಭ್ಯವಿಲ್ಲ."</string> - <string name="face_error_timeout" msgid="522924647742024699">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"ಹೊಸ ಮುಖ ಡೇಟಾ ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಮೊದಲು ಹಳೆಯದನ್ನು ಅಳಿಸಿ"</string> <string name="face_error_canceled" msgid="2164434737103802131">"ಮುಖದ ಕಾರ್ಯಚರಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ಬಳಕೆದಾರರು ರದ್ದುಗೊಳಿಸಿದ್ದಾರೆ."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"ಮುಖವನ್ನು ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"ನೀವು ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿಲ್ಲ."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"ಈ ಸಾಧನದಲ್ಲಿ ಫೇಸ್ ಅನ್ಲಾಕ್ ವೈಶಿಷ್ಟ್ಯವು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"ಸೆನ್ಸಾರ್ ಅನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="face_name_template" msgid="3877037340223318119">"ಮುಖದ <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ಫೇಸ್ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಮುಖವನ್ನು ಬಳಸಿ"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಮುಖ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"ಅನ್ಲಾಕ್ ಪ್ರದೇಶವನ್ನು ವಿಸ್ತರಿಸು."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"ಸ್ಲೈಡ್ ಅನ್ಲಾಕ್."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"ಪ್ಯಾಟರ್ನ್ ಅನ್ಲಾಕ್."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"ಫೇಸ್ ಅನ್ಲಾಕ್."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"ಪಿನ್ ಅನ್ಲಾಕ್."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"ಸಿಮ್ ಪಿನ್ ಅನ್ಲಾಕ್ ಮಾಡಿ."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"ಸಿಮ್ PUK ಅನ್ಲಾಕ್ ಮಾಡಿ."</string> @@ -2095,8 +2102,7 @@ <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ಸರಿ"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ಆಫ್ ಮಾಡಿ"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string> - <!-- no translation found for nas_upgrade_notification_learn_more_content (3735480566983530650) --> - <skip /> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"ವರ್ಧಿತ ಅಧಿಸೂಚನೆಗಳು Android 12 ರಲ್ಲಿ Android ಅಡಾಪ್ಟಿವ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ಬದಲಾಯಿಸಿವೆ. ಈ ವೈಶಿಷ್ಟ್ಯವು ಸೂಚಿಸಿದ ಕ್ರಿಯೆಗಳು ಮತ್ತು ಪ್ರತ್ಯುತ್ತರಗಳನ್ನು ತೋರಿಸುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಯೋಜಿಸುತ್ತದೆ.\n\nವರ್ಧಿತ ಅಧಿಸೂಚನೆಗಳು ಸಂಪರ್ಕ ಹೆಸರುಗಳು ಮತ್ತು ಸಂದೇಶಗಳಂತಹ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಂತೆ ಎಲ್ಲಾ ಅಧಿಸೂಚನೆ ವಿಷಯವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು. ಈ ವೈಶಿಷ್ಟ್ಯವು ಫೋನ್ ಕರೆಗಳಿಗೆ ಉತ್ತರಿಸುವುದು ಮತ್ತು \'ಅಡಚಣೆ ಮಾಡಬೇಡಿ\' ಅನ್ನು ನಿಯಂತ್ರಿಸುವಂತಹ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಜಾಗೊಳಿಸಬಹುದು ಅಥವಾ ಪ್ರತಿಕ್ರಿಯಿಸಬಹುದು."</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ದೈನಂದಿನ ಸ್ಥಿತಿಯ ಮಾಹಿತಿಯ ಅಧಿಸೂಚನೆ"</string> <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ಚಾರ್ಜ್ಗೆ ಮೊದಲೆ ಬ್ಯಾಟರಿ ಮುಗಿದು ಬಿಡಬಹುದು"</string> <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ಬ್ಯಾಟರಿ ಅವಧಿ ಹೆಚ್ಚಿಸಲು ಬ್ಯಾಟರಿ ಸೇವರ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index d9147f049644..fde7eaf8663a 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"지문 아이콘"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"얼굴 인식 잠금 해제 하드웨어 관리"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"사용할 얼굴 템플릿의 추가 및 삭제 메서드를 앱에서 호출하도록 허용합니다."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"얼굴 인식 잠금 해제 하드웨어 사용"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"앱에서 얼굴 인식 잠금 해제 하드웨어를 인증에 사용하도록 허용합니다."</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"얼굴 인식 잠금 해제"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"얼굴 재등록 필요"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"인식률을 개선하려면 얼굴을 다시 등록하세요."</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"얼굴 인식 잠금 해제 설정"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"휴대전화의 화면을 응시하여 잠금 해제할 수 있습니다."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"다른 잠금 해제 방법 설정"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"지문을 추가하려면 탭하세요."</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"얼굴을 확인할 수 없습니다. 하드웨어를 사용할 수 없습니다."</string> - <string name="face_error_timeout" msgid="522924647742024699">"얼굴 인식 잠금 해제를 다시 시도해 주세요."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"새 얼굴 데이터를 저장할 수 없습니다. 먼저 기존 얼굴 데이터를 삭제하세요."</string> <string name="face_error_canceled" msgid="2164434737103802131">"얼굴 인식 작업이 취소되었습니다."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"사용자가 얼굴 인식 잠금 해제를 취소했습니다."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"시도 횟수가 너무 많습니다. 나중에 다시 시도하세요."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"시도 횟수가 너무 많습니다. 얼굴 인식 잠금 해제가 사용 중지되었습니다."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"얼굴을 확인할 수 없습니다. 다시 시도하세요."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"얼굴 인식 잠금 해제를 설정하지 않았습니다."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"이 기기에서는 얼굴 인식 잠금 해제가 지원되지 않습니다."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"센서가 일시적으로 사용 중지되었습니다."</string> <string name="face_name_template" msgid="3877037340223318119">"얼굴 <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"얼굴 인식 잠금 해제 사용"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"얼굴 또는 화면 잠금 사용"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"계속하려면 얼굴로 인증하세요"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"계속하려면 얼굴 또는 화면 잠금을 사용하세요"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"잠금 해제 영역 확장"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"슬라이드하여 잠금해제합니다."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"패턴을 사용하여 잠금해제합니다."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"얼굴을 인식하여 잠금 해제합니다."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"핀을 사용하여 잠금해제합니다."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM PIN 잠금 해제"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM PUK 잠금 해제"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 250166cddb9a..4aaed11b7a17 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Манжа изинин сүрөтчөсү"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"жүзүнөн таанып ачуу функциясынын аппараттык камсыздоосун башкаруу"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Колдонмого пайдалануу үчүн жүздүн үлгүлөрүн кошуу жана жок кылуу мүмкүндүгүн берет."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"аппараттык камсыздоо үчүн жүзүнөн таанып ачуу функциясын колдонуу"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Колдонмо аныктыкты текшерүүдө Жүзүнөн таанып ачуу функциясынын аппараттык камсыздоосун колдонот"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Жүзүнөн таанып ачуу"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Жүзүңүздү кайра таанытыңыз."</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Мыкты таануу үчүн, жүзүңүздү кайра таанытыңыз"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Жүзүнөн таанып ачуу функциясын жөндөңүз"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Телефонуңузду карап туруп эле кулпусун ачып алыңыз"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Кулпусун ачуунун көбүрөөк жолдорун жөндөңүз"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Манжа изин кошуу үчүн басыңыз"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Жүз ырасталбай жатат. Аппараттык камсыздоо жеткиликсиз."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Жүзүнөн таанып ачуу функциясын кайра текшерип көрүңүз."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Жаңы жүздү сактоо мүмкүн эмес. Адегенде эскисин өчүрүңүз."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Жүздүн аныктыгын текшерүү жокко чыгарылды."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Жүзүнөн таанып ачуу функциясын колдонуучу өчүрүп салды."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Өтө көп жолу аракет жасадыңыз. Бир аздан кийин кайталап көрүңүз."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Өтө көп жолу аракет кылдыңыз. Жүзүнөн таанып ачуу функциясы өчүрүлдү."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Жүз ырасталбай жатат. Кайталап көрүңүз."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Жүзүнөн таанып ачуу функциясын жөндөй элексиз."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Жүзүнөн таанып ачуу функциясы бул түзмөктө иштебейт."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Сенсор убактылуу өчүрүлгөн."</string> <string name="face_name_template" msgid="3877037340223318119">"Жүз <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Жүзүнөн таанып ачууну колдонуу"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Жүзүнөн таанып ачууну же экрандын кулпусун колдонуу"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Улантуу үчүн жүзүңүздү көрсөтүңүз"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Улантуу үчүн жүзүңүздү же экрандын кулпусун колдонуңуз"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Бөгөттөн чыгаруу аймагын кеңейтүү."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Жылмыштырып ачуу."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Үлгү менен ачуу."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Жүзүнөн таанып ачуу"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Пин код менен ачуу."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM-картанын кулпусун PIN-код менен ачуу."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM-картанын кулпусун PUK-код менен ачуу."</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 3a26fe71ff20..d424d870a32b 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ໄອຄອນລາຍນິ້ວມື"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"ຈັດການຮາດແວປົດລັອກດ້ວຍໜ້າ"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"ອະນຸຍາດໃຫ້ແອັບເປີດວິທີການຕ່າງໆເພື່ອເພີ່ມ ແລະ ລຶບແມ່ແບບໃບໜ້າສຳລັບການນຳໃຊ້."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"ໃຊ້ຮາດແວການປົດລັອກດ້ວຍໜ້າ"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"ອະນຸຍາດໃຫ້ແອັບໃຊ້ຮາດແວການປົດລັອກດ້ວຍໜ້າເພື່ອພິສູດຢືນຢັນ"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ປົດລັອກດ້ວຍໜ້າ"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"ເພື່ອປັບປຸງການຈຳແນກ, ກະລຸນາລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່."</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"ຕັ້ງຄ່າການປົດລັອກດ້ວຍໜ້າ"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"ປົດລັອກໂທລະສັບຂອງທ່ານໂດຍການເບິ່ງມັນ"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ຕັ້ງຄ່າວິທີເພີ່ມເຕີມເພື່ອປົດລັອກ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ແຕະເພື່ອເພີ່ມລາຍນິ້ວມື"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"ບໍ່ສາມາດຢັ້ງຢືນໃບໜ້າໄດ້. ບໍ່ມີຮາດແວໃຫ້ໃຊ້."</string> - <string name="face_error_timeout" msgid="522924647742024699">"ລອງປົດລັອກດ້ວຍໜ້າອີກເທື່ອໜຶ່ງ."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"ບໍ່ສາມາດບັນທຶກຂໍ້ມູນໃບໜ້າໃໝ່ໄດ້. ກະລຸນາລຶບຂໍ້ມູນເກົ່າອອກກ່ອນ."</string> <string name="face_error_canceled" msgid="2164434737103802131">"ຍົກເລີກການດຳເນີນການກັບໃບໜ້າແລ້ວ."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"ຜູ້ໃຊ້ຍົກເລີກການປົດລັອກດ້ວຍໜ້າແລ້ວ."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"ພະຍາຍາມຫຼາຍເທື່ອເກີນໄປ. ປິດນຳໃຊ້ການປົດລັອກດ້ວຍໜ້າແລ້ວ."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"ບໍ່ສາມາດຢັ້ງຢືນໃບໜ້າໄດ້. ກະລຸນາລອງໃໝ່."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"ທ່ານຍັງບໍ່ໄດ້ຕັ້ງການປົດລັອກດ້ວຍໜ້າເທື່ອ."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"ບໍ່ຮອງຮັບການປົດລັອກດ້ວຍໜ້າຢູ່ອຸປະກອນນີ້."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"ປິດການເຮັດວຽກຂອງເຊັນເຊີໄວ້ຊົ່ວຄາວແລ້ວ."</string> <string name="face_name_template" msgid="3877037340223318119">"ໃບໜ້າ <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"ໃຊ້ການປົດລັອກດ້ວຍໜ້າ"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ໃຊ້ໃບໜ້າ ຫຼື ການລັອກໜ້າຈໍ"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"ໃຊ້ໜ້າທ່ານເພື່ອສືບຕໍ່"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ໃຊ້ໃບໜ້າ ຫຼື ການລັອກໜ້າຈໍຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"ຂະຫຍາຍຂອບເຂດປົດລັອກ."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"ການປົດລັອກດ້ວຍການເລື່ອນ."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"ປົດລັອກດ້ວຍຮູບແບບ."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"ປົດລັອກດ້ວຍໜ້າ."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"ປົດລັອກດ້ວຍ PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"ປົດລັອກ Sim Pin."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"ປົດລັອກ Sim Puk."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 705c8c7a6e2c..05f3e18b3dcb 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -615,14 +615,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Piršto antspaudo piktograma"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"tvarkyti Atrakinimo pagal veidą aparatinę įrangą"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Programai leidžiama aktyv. metodus, norint pridėti ir ištrinti naudojamus veidų šablonus."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"naudoti Atrakinimo pagal veidą aparatinę įrangą"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Programai leidžiama naudoti Atrakinimo pagal veidą aparatinę įrangą tapatybei nustatyti"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Atrakinimas pagal veidą"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Pakartotinis veido registravimas"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Kad patobulintumėte atpažinimą, iš naujo užregistruokite veidą"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Atrakinimo pagal veidą nustatymas"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Atrakinkite telefoną pažiūrėję į jį"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Daugiau atrakinimo metodų nustatymas"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Palieskite, kad pridėtumėte kontrolinį kodą"</string> @@ -649,18 +647,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Nepavyko patv. veido. Aparatinė įranga negalima."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Band. naudoti Atrakinimą pagal veidą dar kartą."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Nepavyko išs. naujų veido duomenų. Pirm. ištrinkite senus."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Veido atpažinimo operacija atšaukta."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Atrakinimą pagal veidą atšaukė naudotojas."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Per daug bandymų. Vėliau bandykite dar kartą."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Per daug bandymų. Atrakinimas pagal veidą išjungtas."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Nepavyko patvirtinti veido. Bandykite dar kartą."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Nenustatėte Atrakinimo pagal veidą."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Atrakinimas pagal veidą šiame įrenginyje nepalaikomas."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Jutiklis laikinai išjungtas."</string> <string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g> veidas"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Naudoti atrakinimą pagal veidą"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Naudoti atrakinimą pagal veidą arba ekrano užraktą"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Jei norite tęsti, naudokite atpažinimą pagal veidą"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Jei norite tęsti, naudokite veido atpažinimo funkciją arba ekrano užraktą"</string> @@ -963,7 +969,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Išplėsti atrakinimo sritį."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Atrakinimas slystant."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Atrakinimas pagal piešinį."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Atrakinimas pagal veidą."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Atrakinimas įvedus PIN kodą."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM kortelės PIN kodo atrakinimas."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM kortelės PUK kodo atrakinimas."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 308654729d71..79016689f02f 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -612,14 +612,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Pirksta nospieduma ikona"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"pārvaldīt aparatūru, kas paredzēta autorizācijai pēc sejas"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Atļauj lietotnei izsaukt metodes izmantojamo sejas veidņu pievienošanai un dzēšanai."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"lietot aparatūru, kas paredzēta autorizācijai pēc sejas"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Atļauj lietotnei izmantot autentificēšanai aparatūru, ar ko veic autorizāciju pēc sejas"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Autorizācija pēc sejas"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Atkārtoti reģistrējiet seju"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Lai uzlabotu atpazīšanu, lūdzu, atkārtoti reģistrējiet savu seju"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Autorizācijas pēc sejas iestatīšana"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Atbloķējiet tālruni, skatoties uz to"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Citi atbloķēšanas veidi"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Pieskarieties, lai pievienotu pirksta nospiedumu"</string> @@ -646,18 +644,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Nevar verificēt seju. Aparatūra nav pieejama."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Vēlreiz mēģiniet veikt autorizāciju pēc sejas."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Nevar saglabāt jaunās sejas datus. Dzēsiet kādu no vecajām."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Darbība ar sejas datiem atcelta."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Lietotājs atcēla autorizāciju pēc sejas."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Pārāk daudz mēģinājumu. Autorizācija pēc sejas ir atspējota."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Nevar verificēt seju. Mēģiniet vēlreiz."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Autorizācija pēc sejas nav iestatīta."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Autorizācija pēc sejas šajā ierīcē netiek atbalstīta"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensors ir īslaicīgi atspējots."</string> <string name="face_name_template" msgid="3877037340223318119">"Seja <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Autorizācija pēc sejas"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Autorizācijas pēc sejas vai ekrāna bloķēšanas metodes izmantošana"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Lai turpinātu, veiciet autorizāciju pēc sejas"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Izmantojiet autorizāciju pēc sejas vai ekrāna bloķēšanas opciju, lai turpinātu"</string> @@ -960,7 +966,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Izvērst atbloķēšanas apgabalu."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Autorizācija, velkot ar pirkstu."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Autorizācija ar kombināciju."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Autorizācija pēc sejas."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Autorizācija ar PIN kodu."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM kartes atbloķēšanas PIN"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM kartes atbloķēšanas PUK"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 27bc870ef66e..0bd80b77d1ae 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Икона за отпечатоци"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"управува со хардвер за „Отклучување со лик“"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Дозволува апликац. да повика начини за додавање и бришење шаблони на лице за користење."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"користи хардвер за „Отклучување со лик“"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Дозволува апликацијата да користи хардвер за „Отклучување со лик“ за проверка"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Отклучување со лик"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Повторно регистрирајте го ликот"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"За да се подобри препознавањето, повторно регистрирајте го ликот"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Поставете „Отклучување со лик“"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Отклучете го телефонот со гледање во него"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Поставете уште начини за отклучување"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Допрете за да додадете отпечаток"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Ликот не може да се потврди. Хардвер - недостапен."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Пробајте „Отклучување со лик“ повторно."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Не се зачуваа податоците за нов лик. Избришете го стариот."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Операцијата со лице се откажа."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"„Отклучувањето со лик“ е откажано од корисникот."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Премногу обиди. Обидете се повторно подоцна."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Премногу обиди. „Отклучувањето со лик“ е оневозможено."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Ликот не може да се потврди. Обидете се повторно."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Не сте поставиле „Отклучување со лик“."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"„Отклучувањето со лик“ не е поддржано на уредов."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Сензорот е привремено оневозможен."</string> <string name="face_name_template" msgid="3877037340223318119">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Користи отклучување со лик"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Користи лик или заклучување екран"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Користете го вашиот лик за да продолжите"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Користете отклучување со лик или заклучување екран за да продолжите"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Прошири отклучена област."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Отклучување со лизгање."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Отклучување со шема."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Отклучување со лик."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Отклучување со пин."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Отклучување со PIN на SIM."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Отклучување со PUK на SIM."</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 7103de0a739e..57ff57d9e0ca 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ഫിംഗർപ്രിന്റ് ഐക്കൺ"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഹാർഡ്വെയർ മാനേജ് ചെയ്യുക"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"ഉപയോഗിക്കാനായി, മുഖത്തിന്റെ ടെംപ്ലേറ്റുകൾ ചേർക്കാനും ഇല്ലാതാക്കാനുമുള്ള രീതികൾ അഭ്യർത്ഥിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"ഫെയ്സ് അൺലോക്ക് ഹാർഡ്വെയർ ഉപയോഗിക്കുക"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"പരിശോധിച്ചുറപ്പിക്കാൻ ഫെയ്സ് അൺലോക്ക് ഹാർഡ്വെയർ ഉപയോഗിക്കാൻ അനുവദിക്കുന്നു"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ഫെയ്സ് അൺലോക്ക്"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യൂ"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"തിരിച്ചറിയൽ മെച്ചപ്പെടുത്താൻ, നിങ്ങളുടെ മുഖം ദയവായി വീണ്ടും എൻറോൾ ചെയ്യൂ"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"ഫെയ്സ് അൺലോക്ക് സജ്ജീകരിക്കുക"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"ഫോണിലേക്ക് നോക്കി അത് അൺലോക്ക് ചെയ്യുക"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"അൺലോക്ക് ചെയ്യുന്നതിനുള്ള കൂടുതൽ വഴികൾ സജ്ജീകരിക്കുക"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ഫിംഗർപ്രിന്റ് ചേർക്കാൻ ടാപ്പ് ചെയ്യുക"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"മുഖം പരിശോധിക്കാൻ കഴിയില്ല. ഹാർഡ്വെയർ ലഭ്യമല്ല."</string> - <string name="face_error_timeout" msgid="522924647742024699">"ഫെയ്സ് അൺലോക്ക് വീണ്ടും പരീക്ഷിക്കൂ"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"പുതിയ മുഖ ഡാറ്റ സംഭരിക്കാനാകില്ല. ആദ്യം പഴയത് ഇല്ലാതാക്കുക."</string> <string name="face_error_canceled" msgid="2164434737103802131">"മുഖത്തിന്റെ പ്രവർത്തനം റദ്ദാക്കി."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"ഉപയോക്താവ് ഫെയ്സ് അൺലോക്ക് റദ്ദാക്കി"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"വളരെയധികം ശ്രമങ്ങൾ. ഫെയ്സ് അൺലോക്ക് പ്രവർത്തനരഹിതമാക്കി"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"മുഖം പരിശോധിക്കാൻ കഴിയില്ല. വീണ്ടും ശ്രമിക്കൂ."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"ഫെയ്സ് അൺലോക്ക് സജ്ജീകരിച്ചില്ല."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"ഫെയ്സ് അൺലോക്ക് ഈ ഉപകരണം പിന്തുണയ്ക്കുന്നില്ല."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"സെൻസർ താൽക്കാലികമായി പ്രവർത്തനരഹിതമാക്കി."</string> <string name="face_name_template" msgid="3877037340223318119">"മുഖം <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"ഫെയ്സ് അൺലോക്ക് ഉപയോഗിക്കുക"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ഫെയ്സ് അല്ലെങ്കിൽ സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"തുടരാൻ നിങ്ങളുടെ മുഖം ഉപയോഗിക്കുക"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"തുടരാൻ നിങ്ങളുടെ മുഖം അല്ലെങ്കിൽ സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"അൺലോക്ക് ഏരിയ വിപുലീകരിക്കുക."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"സ്ലൈഡ് അൺലോക്ക്."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"പാറ്റേൺ അൺലോക്ക്."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"ഫെയ്സ് അൺലോക്ക്."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"പിൻ അൺലോക്ക്."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"സിം പിൻ അൺലോക്ക്."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"സിം Puk അൺലോക്ക്."</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 6ca0433d74ec..a10d44d5bb1d 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -308,7 +308,7 @@ <string name="permgrouplab_location" msgid="1858277002233964394">"Байршил"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"энэ төхөөрөмжийн байршилд хандалт хийх"</string> <string name="permgrouplab_calendar" msgid="6426860926123033230">"Календарь"</string> - <string name="permgroupdesc_calendar" msgid="6762751063361489379">"Хуанли руу хандах"</string> + <string name="permgroupdesc_calendar" msgid="6762751063361489379">"Календарь руу хандах"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"Мессеж"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS мессежийг илгээх, харах"</string> <string name="permgrouplab_storage" msgid="1938416135375282333">"Файл болон мeдиа"</string> @@ -427,14 +427,14 @@ <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Апп нь таны утасны ирсэн гарсан дуудлага зэргийг агуулсан дуудлагын логыг өөрчлөх боломжтой. Хортой апп нь энийг ашиглан таны дуудлагын логыг өөрчлөх болон арилгах боломжтой."</string> <string name="permlab_bodySensors" msgid="3411035315357380862">"биеийн мэдрэгчид хандах (зүрхний хэмнэл шалгагч г.м)"</string> <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Апп-т таны зүрхний цохилт гэх мэт биеийн байдлыг хянадаг мэдрэгчдийн датанд хандалт хийх боломж олгоно."</string> - <string name="permlab_readCalendar" msgid="6408654259475396200">"Хуанлийн арга хэмжээ, дэлгэрэнгүйг унших"</string> - <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Энэ апп таны таблетад хадгалсан хуанлийн бүх арга хэмжээг унших, хуанлийн өгөгдлийг хуваалцах, хадгалах боломжтой."</string> + <string name="permlab_readCalendar" msgid="6408654259475396200">"Календарийн арга хэмжээ, дэлгэрэнгүйг унших"</string> + <string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Энэ апп таны таблетад хадгалсан календарийн бүх арга хэмжээг унших, календарийн өгөгдлийг хуваалцах, хадгалах боломжтой."</string> <string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Энэ апп таны Android TV төхөөрөмжид хадгалсан календарийн бүх арга хэмжээг унших болон таны календарийн өгөгдлийг хуваалцах эсвэл хадгалах боломжтой."</string> - <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"Энэ апп таны утсанд хадгалсан хуанлийн бүх арга хэмжээг унших, хуанлийн өгөгдлийг хуваалцах, хадгалах боломжтой."</string> + <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"Энэ апп таны утсанд хадгалсан календарийн бүх арга хэмжээг унших, календарийн өгөгдлийг хуваалцах, хадгалах боломжтой."</string> <string name="permlab_writeCalendar" msgid="6422137308329578076">"календарын хуваарийг нэмэх эсвэл өөрчлөх болон эзэмшигчид мэдэгдэлгүйгээр зочидруу имэйл илгээх"</string> - <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"Энэ апп таны таблет дээр хуанлийн арга хэмжээг нэмэх, устгах, эсвэл өөрчлөх боломжтой. Энэ апп нь хуанли эзэмшигчээс мессеж илгээсэн мэт харагдах, эсвэл эзэмшигчид мэдэгдэлгүйгээр арга хэмжээг өөрчлөх боломжтой."</string> + <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"Энэ апп таны таблет дээр календарийн арга хэмжээг нэмэх, устгах, эсвэл өөрчлөх боломжтой. Энэ апп нь календарь эзэмшигчээс мессеж илгээсэн мэт харагдах, эсвэл эзэмшигчид мэдэгдэлгүйгээр арга хэмжээг өөрчлөх боломжтой."</string> <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"Энэ апп таны Android TV төхөөрөмжид календарийн арга хэмжээ нэмэх, үүнийг устгах, эсвэл өөрчлөх боломжтой. Энэ апп календарийн өмчлөгчөөс ирсэн мэт харагдаж болох мессеж илгээх эсвэл арга хэмжээг өмчлөгчид нь мэдэгдэлгүйгээр өөрчлөх боломжтой."</string> - <string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"Энэ апп таны утсанд хуанлийн арга хэмжээг нэмэх, устгах, эсвэл өөрчлөх боломжтой. Энэ апп нь хуанли эзэмшигчээс мессеж илгээсэн мэт харагдах, эсвэл эзэмшигчид мэдэгдэлгүйгээр арга хэмжээг өөрчлөх боломжтой."</string> + <string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"Энэ апп таны утсанд календарийн арга хэмжээг нэмэх, устгах, эсвэл өөрчлөх боломжтой. Энэ апп нь календарь эзэмшигчээс мессеж илгээсэн мэт харагдах, эсвэл эзэмшигчид мэдэгдэлгүйгээр арга хэмжээг өөрчлөх боломжтой."</string> <string name="permlab_accessLocationExtraCommands" msgid="5162339812057983988">"байршил нийлүүлэгчийн нэмэлт тушаалд хандах"</string> <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"Апп нь байршил нийлүүлэгчийн нэмэлт тушаалд хандах боломжтой. Энэ нь апп-д GPS эсвэл бусад байршлын үйлчилгээний ажиллагаанд нөлөөлөх боломжийг олгоно."</string> <string name="permlab_accessFineLocation" msgid="6426318438195622966">"нарийвчилсан байршилд зөвхөн нүүр хэсэгт хандах"</string> @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Хурууны хээний дүрс"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"царайгаар түгжээ тайлах техник хангамжийг удирдах"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Аппад царайны загварыг ашиглахын тулд нэмэх эсвэл устгах аргыг идэвхжүүлэхийг зөвшөөрдөг."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"царайгаар түгжээ тайлах техник хангамж ашиглах"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Аппад царайгаар түгжээ тайлах техник хангамжийг баталгаажуулалтад ашиглахыг зөвшөөрдөг"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Царайгаар түгжээ тайлах"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Царайгаа дахин бүртгүүлнэ үү"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Танилтыг сайжруулахын тулд царайгаа дахин бүртгүүлнэ үү"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Царайгаар түгжээ тайлах онцлогийг тохируулна уу"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Утас руугаа харж түгжээг нь тайлна уу"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Түгжээ тайлах илүү олон арга тохируулна уу"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Хурууны хээ нэмэхийн тулд товшино уу"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Царайг бататгаж чадсангүй. Техник хангамж боломжгүй байна."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Царайгаар түгжээ тайлахыг дахин оролдоно уу."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Царайн шинэ өгөгдлийг хадгалж чадсангүй. Эхлээд хуучин өгөгдлийг устгана уу."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Царайны үйл ажиллагааг цуцаллаа."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Хэрэглэгч царайгаар түгжээ тайлахыг цуцалсан."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Хэт олон удаа оролдлоо. Дараа дахин оролдоно уу."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Хэтэрхий олон удаа оролдлоо. Царайгаар түгжээ тайлахыг идэвхгүй болголоо."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Царайг бататгаж чадсангүй. Дахин оролдоно уу."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Та царайгаар түгжээ тайлахыг тохируулаагүй байна."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Царайгаар түгжээ тайлахыг энэ төхөөрөмж дээр дэмждэггүй."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Мэдрэгчийг түр хугацаанд идэвхгүй болгосон."</string> <string name="face_name_template" msgid="3877037340223318119">"Царай <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Царайгаар түгжээ тайлахыг ашиглах"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Царайгаар түгжээ тайлах эсвэл дэлгэцийн түгжээ ашиглах"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Үргэлжлүүлэхийн тулд царайгаа ашиглана уу"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Үргэлжлүүлэхийн тулд царай эсвэл дэлгэцийн түгжээгээ ашиглана уу"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Түгжээгүй хэсгийг өргөсгөх."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Тайлах гулсуулалт."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Тайлах хээ."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Царайгаар түгжээ тайлах"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Тайлах пин."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Sim-н пин кодыг тайлна уу."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Sim-н Puk кодыг тайлна уу."</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 53259c5ee533..0756ce2869f9 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"फिंगरप्रिंट आयकन"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"फेस अनलॉक हार्डवेअर व्यवस्थापित करा"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"ॲपला वापरासाठी चेहरा टेम्पलेट जोडण्याच्या आणि हटवण्याच्या पद्धती जारी करू देते."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"फेस अनलॉक हार्डवेअर वापरा"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"अॅपला ऑथेंटिकेशनसाठी फेस अनलॉक हार्डवेअर वापरण्याची अनुमती देते"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"फेस अनलॉक"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"तुमच्या चेहऱ्याची पुन्हा नोंदणी करा"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"ओळखण्यामध्ये सुधारणा करण्यासाठी, कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"फेस अनलॉक सेट करा"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"तुमच्या फोनकडे पाहून तो अनलॉक करा"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"अनलॉक करण्याच्या आणखी पद्धती सेट करा"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"फिंगरप्रिंट जोडण्यासाठी टॅप करा"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"चेहरा पडताळू शकत नाही. हार्डवेअर उपलब्ध नाही."</string> - <string name="face_error_timeout" msgid="522924647742024699">"फेस अनलॉकचा पुन्हा प्रयत्न करा."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"नवीन फेस डेटा स्टोअर करू शकत नाही. आधी जुना हटवा."</string> <string name="face_error_canceled" msgid="2164434737103802131">"चेहरा ऑपरेशन रद्द केले गेले."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"वापरकर्त्याने फेस अनलॉक रद्द केले आहे."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"खूप जास्त प्रयत्न केले. नंतर पुन्हा प्रयत्न करा."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"बरेच प्रयत्न. फेस अनलॉक बंद केले आहे."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"चेहरा पडताळणी करू शकत नाही. पुन्हा प्रयत्न करा."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"तुम्ही फेस अनलॉक सेट केले नाही."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"या डिव्हाइसवर फेस अनलॉकला सपोर्ट नाही."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"सेन्सर तात्पुरता बंद केला आहे."</string> <string name="face_name_template" msgid="3877037340223318119">"चेहरा <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"फेस अनलॉक वापरा"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"फेस किंवा स्क्रीन लॉक वापरा"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"पुढे सुरू ठेवण्यासाठी तुमचा चेहरा वापरा"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"पुढे सुरू ठेवण्यासाठी तुमचा चेहरा किंवा स्क्रीन लॉक वापरा"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"अनलॉक क्षेत्र विस्तृत करा."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"स्लाइड अनलॉक."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"पॅटर्न अनलॉक."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"फेस अनलॉक."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"पिन अनलॉक."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"सिम पिन अनलॉक करा"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"सिम PUK अनलॉक करा"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 6be9b476ced8..e6c41712db92 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikon cap jari"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"urus perkakasan buka kunci wajah"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Membenarkan apl menggunakan kaedah untuk menambahkan dan memadamkan templat wajah untuk digunakan."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"gunakan perkakasan buka kunci wajah"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Membenarkan apl menggunakan perkakasan buka kunci wajah untuk pengesahan"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Buka kunci wajah"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Daftarkan semula wajah anda"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Untuk meningkatkan pengecaman, sila daftarkan semula wajah anda"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Sediakan buka kunci wajah"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Buka kunci telefon anda dengan melihat telefon anda"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Sediakan lebih banyak cara untuk membuka kunci"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Ketik untuk menambahkan cap jari"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Tdk dpt sahkan wajah. Perkakasan tidak tersedia."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Cuba buka kunci wajah sekali lagi."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Tdk dpt menyimpan data wajah baharu. Padamkan yg lama dahulu."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Pengendalian wajah dibatalkan."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Buka kunci wajah dibatalkan oleh pengguna."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Terlalu banyak percubaan. Cuba sebentar lagi."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Terlalu banyak percubaan. Buka kunci wajah dilumpuhkan."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Tidak dapat mengesahkan wajah. Cuba lagi."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Anda belum menyediakan buka kunci wajah."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Buka kunci wajah tidak disokong pada peranti ini."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Penderia dilumpuhkan sementara."</string> <string name="face_name_template" msgid="3877037340223318119">"Wajah <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Gunakan buka kunci wajah"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Gunakan kunci wajah atau skrin"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Gunakan wajah untuk teruskan"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gunakan wajah atau kunci skrin anda untuk meneruskan"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Kembangkan bahagian buka kunci."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Buka kunci luncur."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Buka kunci corak."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Buka Kunci Wajah"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Buka kunci pin."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Buka kunci Pin Sim."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Buka kunci Puk Sim."</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index ff2cc22265c1..12f2f39bf232 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"လက်ဗွေ သင်္ကေတ"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"မျက်နှာပြလော့ခ်ဖွင့်သည့် စက်ပစ္စည်းကို စီမံခြင်း"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"အသုံးပြုရန်အတွက် မျက်နှာပုံစံထည့်ရန် (သို့) ဖျက်ရန်နည်းလမ်းကို အက်ပ်အား သုံးခွင့်ပြုသည်။"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"မျက်နှာပြ လော့ခ်ဖွင့်သည့် စက်ပစ္စည်းကို သုံးပါ"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"အထောက်အထားစိစစ်ရန်အတွက် ဤအက်ပ်အား မျက်နှာပြ လော့ခ်ဖွင့်ခြင်း စက်ပစ္စည်းကိုသုံးခွင့်ပြုသည်"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"မျက်နှာပြ လော့ခ်ဖွင့်ခြင်း"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"သင့်မျက်နှာကို စာရင်းပြန်သွင်းပါ"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"ပိုမှတ်မိစေရန် သင့်မျက်နှာကို စာရင်းပြန်သွင်းပါ"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"မျက်နှာပြ လော့ခ်ဖွင့်ခြင်း စနစ်ထည့်သွင်းပါ"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"သင့်ဖုန်းကိုကြည့်၍ သော့ဖွင့်ပါ"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"သော့ဖွင့်ရန် နောက်ထပ်နည်းလမ်းများကို စနစ်ထည့်သွင်းပါ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"လက်ဗွေထည့်ရန် တို့ပါ"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"မျက်နှာကို အတည်ပြု၍ မရပါ။ ဟာ့ဒ်ဝဲ မရနိုင်ပါ။"</string> - <string name="face_error_timeout" msgid="522924647742024699">"မျက်နှာပြ လော့ခ်ဖွင့်ခြင်းကို ထပ်စမ်းကြည့်ပါ။"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"မျက်နှာဒေတာအသစ် သိမ်း၍မရပါ။ အဟောင်းကို အရင်ဖျက်ပါ။"</string> <string name="face_error_canceled" msgid="2164434737103802131">"မျက်နှာ ဆောင်ရွက်ခြင်းကို ပယ်ဖျက်လိုက်ပါပြီ။"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"မှတ်နှာပြ လော့ခ်ဖွင့်ခြင်းကို မလုပ်တော့ပါ။"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"အကြိမ်များစွာ စမ်းပြီးပါပြီ။ နောက်မှထပ်စမ်းပါ။"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"စမ်းသပ်ကြိမ် များနေပြီ။ မျက်နှာပြ လော့ခ်ဖွင့်ခြင်း ပိတ်လိုက်ပါပြီ။"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"မျက်နှာကို အတည်ပြု၍ မရပါ။ ထပ်စမ်းကြည့်ပါ။"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"မျက်နှာပြ လော့ခ်ဖွင့်ခြင်း ထည့်သွင်းမထားပါ"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"ဤစက်ပစ္စည်းတွင် မျက်နှာပြ လော့ခ်ဖွင့်ခြင်းကို သုံး၍မရပါ။"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"အာရုံခံကိရိယာကို ယာယီပိတ်ထားသည်။"</string> <string name="face_name_template" msgid="3877037340223318119">"မျက်နှာ <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"မျက်နှာပြ လော့ခ်ဖွင့်ရန်"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"မျက်နှာမှတ်သော့ဖွင့်ခြင်း (သို့) ဖန်သားပြင်လော့ခ်ချခြင်းကို သုံးခြင်း"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"ရှေ့ဆက်ရန် သင့်မျက်နှာကို သုံးပါ"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ရှေ့ဆက်ရန် သင်၏ မျက်နှာ (သို့) ဖန်သားပြင်လော့ခ်ကို သုံးပါ"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"သော့မချထားသာ နယ်ပယ်ကို ချဲ့ပါ"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"ဘေးတိုက်ပွတ်ဆွဲ၍ သော့ဖွင့်ခြင်း"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"ပုံစံဖြင့် သော့ဖွင့်ခြင်း"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"မျက်နှာပြ လော့ခ်ဖွင့်ခြင်း"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"ပင်နံပါတ်ဖြင့် သော့ဖွင့်ခြင်း"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"ဆင်းမ်ကဒ် ပင်နံပါတ်လော့ခ်ဖွင့်ပါ။"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"ဆင်းမ်ကဒ် Puk လော့ခ်ဖွင့်ပါ။"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 7c1aef9a3a82..0c724bf9ba3a 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikon for fingeravtrykk"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"administrere maskinvare for Ansiktslås"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Lar appen bruke metoder for å legge til og slette ansiktmaler for bruk."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"bruk maskinvare for Ansiktslås"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Lar appen bruke maskinvare for Ansiktslås til autentisering"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Ansiktslås"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Registrer ansiktet ditt på nytt"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"For å forbedre gjenkjennelse, registrer ansiktet ditt på nytt"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Konfigurer ansiktslås"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Lås opp telefonen ved å se på den"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfigurer flere måter å låse opp på"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Trykk for å legge til et fingeravtrykk"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Kan ikke bekrefte ansikt. Utilgjengelig maskinvare."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Prøv Ansiktslås igjen."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Kan ikke lagre nye ansiktsdata. Slett gamle data først."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Ansikt-operasjonen ble avbrutt."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Ansiktslås ble avbrutt av brukeren."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"For mange forsøk. Prøv igjen senere."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"For mange forsøk. Ansiktslås er slått av."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Kan ikke bekrefte ansiktet. Prøv igjen."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Du har ikke konfigurert Ansiktslås."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Ansiktslås støttes ikke på denne enheten"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensoren er midlertidig slått av."</string> <string name="face_name_template" msgid="3877037340223318119">"Ansikt <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Bruk ansiktslås"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Bruk ansikts- eller skjermlås"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Bruk ansiktet for å fortsette"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Bruk ansikts- eller skjermlåsen for å fortsette"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Vis opplåsingsfeltet."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Opplåsning ved å dra med fingeren."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Mønsteropplåsning."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Ansiktslås"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"PIN-opplåsning."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"PIN-opplåsing for SIM-kort."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"PUK-opplåsing for SIM-kort."</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index f7acb7db4aac..08154c9ecf0c 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"फिंगरप्रिन्ट आइकन"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"फेस अनलकको हार्डवेयर व्यवस्थित गर्नुहोस्"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"एपलाई प्रयोगका लागि अनुहार टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"फेस अनलकको हार्डवेयर प्रयोग गर्नुहोस्"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"एपलाई प्रमाणीकरणका लागि फेस अनलकको हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"फेस अनलक"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"आफ्नो अनुहार पुनः दर्ता गर्नुहोस्"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"अनुहार पहिचानको गुणस्तर सुधार गर्न कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"फेस अनलक सेटअप गर्नुहोस्"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"फोनमा हेरेकै भरमा फोन अनलक गर्नुहोस्"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"अनलक गर्ने अन्य तरिकाहरू सेटअप गर्नुहोस्"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"फिंगरप्रिन्ट हाल्न ट्याप गर्नुहोस्"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"अनुहार पुष्टि गर्न सकिएन। हार्डवेयर उपलब्ध छैन।"</string> - <string name="face_error_timeout" msgid="522924647742024699">"फेरि फेस अनलक प्रयोग गरी हेर्नुहोस्।"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"अनुहारसम्बन्धी नयाँ डेटा भण्डारण गर्न सकिएन। पहिले कुनै पुरानो डेटा मेटाउनुहोस्।"</string> <string name="face_error_canceled" msgid="2164434737103802131">"अनुहार पहिचान रद्द गरियो।"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"प्रयोगकर्ताले फेस अनलक रद्द गर्नुभयो।"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"धेरैपटक प्रयासहरू भए। पछि फेरि प्रयास गर्नुहोस्।"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"अत्यधिक प्रयासहरू भए। फेस अनलक असक्षम पारियो।"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"अनुहार पुष्टि गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"तपाईंले फेस अनलक सुविधा सेट अप गर्नुभएको छैन।"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"यस डिभाइसमा फेस अनलक सुविधा प्रयोग गर्न मिल्दैन।"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"केही समयका लागि सेन्सर असक्षम पारियो।"</string> <string name="face_name_template" msgid="3877037340223318119">"अनुहार <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"फेस अनलक प्रयोग गर्नुहोस्"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"फेस अनलक वा स्क्रिन लक प्रयोग गर्नुहोस्"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"जारी राख्न आफ्नो अनुहारको सहायताले पुष्टि गर्नुहोस्"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"जारी राख्न आफ्नो फेस वा स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string> @@ -733,7 +739,7 @@ <string name="policylab_resetPassword" msgid="214556238645096520">"स्क्रिन लक परिवर्तन गर्ने"</string> <string name="policydesc_resetPassword" msgid="4626419138439341851">"स्क्रिन लक परिवर्तन गर्नुहोस्।"</string> <string name="policylab_forceLock" msgid="7360335502968476434">"स्क्रिन लक गर्ने"</string> - <string name="policydesc_forceLock" msgid="1008844760853899693">"कसरी र कहिले स्क्रिन लक गर्ने नियन्त्रण गर्नुहोस्।"</string> + <string name="policydesc_forceLock" msgid="1008844760853899693">"कसरी र कहिले स्क्रिन लक गर्ने भन्ने कुरा सेट गर्न"</string> <string name="policylab_wipeData" msgid="1359485247727537311">"सबै डेटा मेट्ने"</string> <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"एउटा फ्याक्ट्रि डेटा रिसेट गरेर चेतावनी नआउँदै ट्याबल्टको डेटा मेट्नुहोस्।"</string> <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"फ्याक्ट्री डेटा रिसेट गरेर चेतावनी नदिइकन आफ्नो Android टिभी डिभाइसको डेटा मेटाउनुहोस्।"</string> @@ -751,7 +757,7 @@ <string name="policylab_disableCamera" msgid="5749486347810162018">"क्यामेरालाई असक्षम गराउनुहोस्"</string> <string name="policydesc_disableCamera" msgid="3204405908799676104">"सबै उपकरण क्यामराहरूको प्रयोग रोक्नुहोस्"</string> <string name="policylab_disableKeyguardFeatures" msgid="5071855750149949741">"स्क्रिन लकका केही सुविधा असक्षम पार्ने"</string> - <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"केही स्क्रिन लक सुविधाहरूको प्रयोगमा रोक लगाउनुहोस्।"</string> + <string name="policydesc_disableKeyguardFeatures" msgid="6641673177041195957">"स्क्रिन लकका केही सुविधाहरूको प्रयोगमा रोक लगाउन।"</string> <string-array name="phoneTypes"> <item msgid="8996339953292723951">"गृह"</item> <item msgid="7740243458912727194">"मोबाइल"</item> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"अनलक क्षेत्र बढाउनुहोस्।"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"स्लाइड अनलक।"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"ढाँचा अनलक।"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"फेस अनलक"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin अनलक"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Sim को Pin मार्फत अनलक गर्ने प्रक्रिया।"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Sim को Puk मार्फत अनलक गर्ने प्रक्रिया।"</string> @@ -1862,7 +1869,7 @@ <string name="managed_profile_label_badge" msgid="6762559569999499495">"कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5673187309555352550">"कार्यालयको दोस्रो <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="6882151970556391957">"कार्यालयको तेस्रो <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"पिन निकाल्नुअघि PIN सोध्नुहोस्"</string> + <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"अनपिन गर्नुअघि PIN मागियोस्"</string> <string name="lock_to_app_unlock_pattern" msgid="2694204070499712503">"अनपिन गर्नअघि अनलक प्याटर्न माग्नुहोस्"</string> <string name="lock_to_app_unlock_password" msgid="9126722403506560473">"पिन निकाल्नुअघि पासवर्ड सोध्नुहोस्"</string> <string name="package_installed_device_owner" msgid="7035926868974878525">"तपाईंका प्रशासकले स्थापना गर्नुभएको"</string> @@ -2095,8 +2102,7 @@ <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ठिक छ"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"अफ गर्नुहोस्"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"थप जान्नुहोस्"</string> - <!-- no translation found for nas_upgrade_notification_learn_more_content (3735480566983530650) --> - <skip /> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android १२ मा Android को अनुकूल पार्न मिल्ने सूचनाहरू नामक सुविधालाई परिष्कृत सूचनाहरू नामक सुविधाले प्रतिस्थापन गरेको छ। यो सुविधाले कारबाही तथा जवाफसम्बन्धी सुझाव देखाउँछ र तपाईंका सूचनाहरू व्यवस्थित गर्छ।\n\nपरिष्कृत सूचनाहरू नामक सुविधाले सूचनामा उल्लिखित सम्पर्क व्यक्तिको नाम र म्यासेज जस्ता व्यक्तिगत जानकारीलगायतका सामग्री हेर्न तथा प्रयोग गर्न सक्छ। यो सुविधाले फोन उठाउने तथा \'बाधा नपुऱ्याउनुहोस्\' मोड नियन्त्रण गर्ने कार्यसहित सूचनाहरू हटाउने वा सूचनाहरूको जवाफ दिने कार्य पनि गर्न सक्छ।"</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"दिनचर्या मोडको जानकारीमूलक सूचना"</string> <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"प्रायः चार्ज गर्ने समय हुनुभन्दा पहिले नै ब्याट्री सकिन सक्छ"</string> <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ब्याट्रीको आयु बढाउन ब्याट्री सेभर सक्रिय गरियो"</string> diff --git a/core/res/res/values-night/colors.xml b/core/res/res/values-night/colors.xml index baffa5a82cdb..816ddd41ccd3 100644 --- a/core/res/res/values-night/colors.xml +++ b/core/res/res/values-night/colors.xml @@ -17,14 +17,6 @@ NOTE: You might also want to edit: packages/SystemUI/res/values-night/colors.xml --> <resources> - <!-- The primary text color if the text is on top of a dark background. - This is also affects colorized notifications with dark backgrounds. --> - <color name="notification_primary_text_color_dark">#ddffffff</color> - - <!-- The secondary text color if the text is on top of a dark background. --> - <color name="notification_secondary_text_color_dark">#b2ffffff</color> - - <color name="notification_default_color_dark">#ddffffff</color> <color name="notification_primary_text_color_current">@color/notification_primary_text_color_dark</color> <color name="notification_secondary_text_color_current">@color/notification_secondary_text_color_dark</color> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 4ae530a423e8..3c1dc507299d 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Vingerafdruk-icoon"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"hardware voor ontgrendelen via gezichtsherkenning beheren"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Hiermee kan de app methoden aanroepen om gezichtstemplates toe te voegen en te verwijderen voor gebruik."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"hardware voor ontgrendelen via gezichtsherkenning gebruiken"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Hiermee kan de app hardware voor ontgrendelen via gezichtsherkenning gebruiken voor verificatie"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Ontgrendelen via gezichtsherkenning"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Je gezicht opnieuw registreren"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Registreer je gezicht opnieuw om de herkenning te verbeteren"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Stel ontgrendelen via gezichtsherkenning in"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Ontgrendel je telefoon door ernaar te kijken"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Stel meer manieren in om te ontgrendelen"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tik om een vingerafdruk toe te voegen"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Kan gezicht niet verifiëren. Hardware niet beschikbaar."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Probeer ontgrendelen via gezichtsherkenning opnieuw."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Kan nieuwe gezichten niet opslaan. Verwijder eerst een oude."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Bewerking voor gezichtsherkenning geannuleerd."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Ontgrendelen via gezichtsherkenning geannuleerd door gebruiker."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Te veel pogingen. Probeer het later opnieuw."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Te veel pogingen. Ontgrendelen via gezichtsherkenning staat uit."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Kan gezicht niet verifiëren. Probeer het nog eens."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Je hebt ontgrendelen via gezichtsherkenning niet ingesteld."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Ontgrendelen via gezichtsherkenning wordt niet ondersteund op dit apparaat."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor staat tijdelijk uit."</string> <string name="face_name_template" msgid="3877037340223318119">"Gezicht <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Ontgrendelen via gezichtsherkenning gebruiken"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Gezicht of schermgrendeling gebruiken"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Gebruik je gezicht om door te gaan"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gebruik je gezicht of schermvergrendeling om door te gaan"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Ontgrendelingsgebied uitvouwen."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Ontgrendeling via schuiven."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Ontgrendeling via patroon."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Ontgrendelen via gezichtsherkenning"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Ontgrendeling via pincode."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Pincode-ontgrendeling voor simkaart."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Pukcode-ontgrendeling voor simkaart."</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 51d8f52a29a4..4191294cb005 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ଟିପଚିହ୍ନ ଆଇକନ୍"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"ଫେସ୍ ଅନଲକ୍ ହାର୍ଡୱେର୍ ପରିଚାଳନା କରନ୍ତୁ"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"ବ୍ୟବହାର ପାଇଁ ଆପ୍କୁ ଫେସିଆଲ୍ ଟେମ୍ପଲେଟ୍ ଯୋଡିବା ଓ ଡିଲିଟ୍ ର ପଦ୍ଧତି ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"ଫେସ୍ ଅନଲକ୍ ହାର୍ଡୱେର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"ପ୍ରମାଣୀକରଣ ପାଇଁ ଫେସ୍ ଅନଲକ୍ ହାର୍ଡୱେର୍ର ବ୍ୟବହାର କରିବା ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ଫେସ୍ ଅନଲକ୍"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍ରୋଲ୍ କରନ୍ତୁ"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"ଚିହ୍ନଟକରଣକୁ ଉନ୍ନତ କରିବା ପାଇଁ, ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍ରୋଲ୍ କରନ୍ତୁ।"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"ଫେସ୍ ଅନଲକ୍ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"ଫୋନକୁ ଦେଖି ଏହାକୁ ଅନଲକ୍ କରନ୍ତୁ"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ଅନଲକ୍ କରିବା ପାଇଁ ଆହୁରି ଅଧିକ ଉପାୟ ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ଏକ ଟିପଚିହ୍ନ ଯୋଗ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"ମୁହଁ ଚିହ୍ନଟ କରିପାରିଲା ନାହିଁ। ହାର୍ଡୱେୟାର୍ ଉପଲବ୍ଧ ନାହିଁ।"</string> - <string name="face_error_timeout" msgid="522924647742024699">"ଫେସ୍ ଅନଲକ୍ ପୁଣି ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ।"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"ନୂଆ ମୁହଁ ଡାଟା ଷ୍ଟୋର୍ ହେବ ନାହିଁ। ପ୍ରଥମେ ପୁରୁଣାକୁ ଡିଲିଟ୍ କରନ୍ତୁ।"</string> <string name="face_error_canceled" msgid="2164434737103802131">"ଫେସ୍ର ଅପରେଶନ୍ କ୍ୟାନ୍ସଲ୍ ହୋଇଗଲା"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ଫେସ୍ ଅନଲକ୍ ବାତିଲ୍ କରାଯାଇଛି।"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"ବାରମ୍ବାର ଚେଷ୍ଟା। ପରେ ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"ଅତ୍ୟଧିକ ପ୍ରଚେଷ୍ଟା। ଫେସ୍ ଅନଲକ୍ ଅକ୍ଷମ ହୋଇଛି।"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"ମୁହଁ ଚିହ୍ନଟ କରିପାରିଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"ଆପଣ ଫେସ୍ ଅନଲକ୍ ସେଟ୍ ଅପ୍ କରିନାହାଁନ୍ତି।"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"ଏହି ଡିଭାଇସରେ ଫେସ୍ ଅନଲକ୍ ସମର୍ଥିତ ନୁହେଁ।"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"ସେନ୍ସରକୁ ଅସ୍ଥାୟୀ ଭାବେ ଅକ୍ଷମ କରାଯାଇଛି।"</string> <string name="face_name_template" msgid="3877037340223318119">"<xliff:g id="FACEID">%d</xliff:g>ଙ୍କ ଫେସ୍"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"ଫେସ୍ ଅନଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ଫେସ୍ ବା ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଚେହେରା ବ୍ୟବହାର କରନ୍ତୁ"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଚେହେରା କିମ୍ବା ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"ଅନଲକ୍ କ୍ଷେତ୍ରକୁ ବଢ଼ାନ୍ତୁ।"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"ସ୍ଲାଇଡ୍ ଅନଲକ୍।"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"ପାଟର୍ନ ଅନଲକ୍।"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"ଫେସ୍ ଅନଲକ୍।"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"PIN ଅନଲକ୍।"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"PIN ଦ୍ଵାରା SIMକୁ ଅନଲକ୍ କରନ୍ତୁ।"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"PUK ଦ୍ଵାରା SIMକୁ ଅନଲକ୍ କରନ୍ତୁ।"</string> @@ -2095,8 +2102,7 @@ <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ଠିକ୍ ଅଛି"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ବନ୍ଦ କରନ୍ତୁ"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ଅଧିକ ଜାଣନ୍ତୁ"</string> - <!-- no translation found for nas_upgrade_notification_learn_more_content (3735480566983530650) --> - <skip /> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12ରେ Android ଆଡେପ୍ଟିଭ୍ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଉନ୍ନତ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକରେ ପରିବର୍ତ୍ତନ କରାଯାଇଛି। ଏହି ଫିଚର୍ ପ୍ରସ୍ତାବିତ କାର୍ଯ୍ୟ ଏବଂ ପ୍ରତ୍ୟୁତ୍ତରଗୁଡ଼ିକୁ ଦେଖାଏ ଏବଂ ଆପଣଙ୍କ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବ୍ୟବସ୍ଥିତ କରେ।\n\nଉନ୍ନତ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଯୋଗାଯୋଗ ନାମ ଏବଂ ମେସେଜଗୁଡ଼ିକ ପରି ବ୍ୟକ୍ତିଗତ ସୂଚନା ସମେତ ବିଜ୍ଞପ୍ତିର ବିଷୟବସ୍ତୁକୁ ଆକ୍ସେସ୍ କରିପାରିବ। ଏହି ଫିଚର୍ ଫୋନ୍ କଲଗୁଡ଼ିକର ଉତ୍ତର ଦେବା ଏବଂ \'ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\'କୁ ନିୟନ୍ତ୍ରଣ କରିବା ପରି, ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ମଧ୍ୟ ଖାରଜ କରିପାରିବ କିମ୍ବା ସେଗୁଡ଼ିକର ଉତ୍ତର ଦେଇପାରିବ।"</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ନିୟମିତ ମୋଡ୍ ସୂଚନା ବିଜ୍ଞପ୍ତି"</string> <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ସାଧାରଣ ଭାବରେ ଚାର୍ଜ୍ କରିବା ପୂର୍ବରୁ ବ୍ୟାଟେରୀ ସରିଯାଇପାରେ"</string> <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ବ୍ୟାଟେରୀର ସମୟକୁ ବଢ଼ାଇବା ପାଇଁ ବ୍ୟଟେରୀ ସେଭର୍କୁ କାର୍ଯ୍ୟକାରୀ କରାଯାଇଛି"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 037ee602ccd0..3c198f08583c 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਤੀਕ"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"ਫ਼ੇਸ ਅਣਲਾਕ ਹਾਰਡਵੇਅਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"ਐਪ ਨੂੰ ਵਰਤਣ ਲਈ ਚਿਹਰਾ ਟੈਮਪਲੇਟ ਸ਼ਾਮਲ ਕਰਨ ਜਾਂ ਮਿਟਾਉਣ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦਿੰਦੀ ਹੈ।"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"ਫ਼ੇਸ ਅਣਲਾਕ ਹਾਰਡਵੇਅਰ ਵਰਤੋ"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"ਐਪ ਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਫ਼ੇਸ ਅਣਲਾਕ ਹਾਰਡਵੇਅਰ ਵਰਤਣ ਦਿੰਦੀ ਹੈ"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ਫ਼ੇਸ ਅਣਲਾਕ"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ਆਪਣਾ ਚਿਹਰਾ ਮੁੜ-ਦਰਜ ਕਰੋ"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"ਪਛਾਣ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਚਿਹਰੇ ਨੂੰ ਮੁੜ-ਦਰਜ ਕਰੋ"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"ਫ਼ੇਸ ਅਣਲਾਕ ਸੈੱਟਅੱਪ ਕਰੋ"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"ਆਪਣੇ ਫ਼ੋਨ ਵੱਲ ਦੇਖ ਕੇ ਇਸਨੂੰ ਅਣਲਾਕ ਕਰੋ"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ਅਣਲਾਕ ਕਰਨ ਦੇ ਹੋਰ ਤਰੀਕਿਆਂ ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਹੋ ਸਕੀ। ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ।"</string> - <string name="face_error_timeout" msgid="522924647742024699">"ਫ਼ੇਸ ਅਣਲਾਕ ਦੁਬਾਰਾ ਵਰਤ ਕੇ ਦੇਖੋ।"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"ਨਵਾਂ ਚਿਹਰਾ ਡਾਟਾ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਪਹਿਲਾਂ ਪੁਰਾਣਾ ਹਟਾਓ।"</string> <string name="face_error_canceled" msgid="2164434737103802131">"ਚਿਹਰਾ ਪਛਾਣਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਰੱਦ ਕੀਤੀ ਗਈ।"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"ਵਰਤੋਂਕਾਰ ਨੇ ਫ਼ੇਸ ਅਣਲਾਕ ਰੱਦ ਕੀਤਾ।"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ। ਫ਼ੇਸ ਅਣਲਾਕ ਬੰਦ ਕੀਤਾ ਗਿਆ।"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"ਤੁਸੀਂ ਫ਼ੇਸ ਅਣਲਾਕ ਸੈੱਟਅੱਪ ਨਹੀਂ ਕੀਤਾ ਹੈ।"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"ਇਸ ਡੀਵਾਈਸ ਵਿੱਚ ਫ਼ੇਸ ਅਣਲਾਕ ਦੀ ਸੁਵਿਧਾ ਨਹੀਂ ਹੈ।"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"ਸੈਂਸਰ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਬੰਦ ਕੀਤਾ ਗਿਆ।"</string> <string name="face_name_template" msgid="3877037340223318119">"ਚਿਹਰਾ <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"ਫ਼ੇਸ ਅਣਲਾਕ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ਫ਼ੇਸ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣੇ ਚਿਹਰੇ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਚਿਹਰਾ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"ਅਣਲਾਕ ਖੇਤਰ ਦਾ ਵਿਸਤਾਰ ਕਰੋ।"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"ਅਣਲਾਕ ਸਲਾਈਡ ਕਰੋ।"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"ਪੈਟਰਨ ਅਣਲਾਕ।"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"ਫ਼ੇਸ ਅਣਲਾਕ।"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"ਪਿੰਨ ਅਣਲਾਕ।"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"ਸਿਮ ਪਿੰਨ ਅਣਲਾਕ।"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"ਸਿਮ Puk ਅਣਲਾਕ।"</string> @@ -2095,8 +2102,7 @@ <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"ਠੀਕ ਹੈ"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"ਬੰਦ ਕਰੋ"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"ਹੋਰ ਜਾਣੋ"</string> - <!-- no translation found for nas_upgrade_notification_learn_more_content (3735480566983530650) --> - <skip /> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Android 12 ਵਿੱਚ ਵਿਸਤ੍ਰਿਤ ਸੂਚਨਾਵਾਂ ਨੂੰ Android ਅਡੈਪਟਿਵ ਸੂਚਨਾਵਾਂ ਨਾਲ ਬਦਲ ਦਿੱਤਾ ਗਿਆ। ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਸੁਝਾਈਆਂ ਗਈਆਂ ਕਾਰਵਾਈਆਂ ਅਤੇ ਜਵਾਬ ਦਿਖਾਉਂਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੀਆਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰਦੀ ਹੈ।\n\nਵਿਸਤ੍ਰਿਤ ਸੂਚਨਾਵਾਂ ਸੂਚਨਾ ਸਮੱਗਰੀ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੀਆਂ ਹਨ, ਜਿਸ ਵਿੱਚ ਸੰਪਰਕ ਨਾਮ ਅਤੇ ਸੁਨੇਹਿਆਂ ਵਰਗੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਸ਼ਾਮਲ ਹੈ। ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਸੂਚਨਾਵਾਂ ਨੂੰ ਖਾਰਜ ਵੀ ਕਰ ਸਕਦੀ ਹੈ ਜਾਂ ਸੂਚਨਾਵਾਂ ਦਾ ਜਵਾਬ ਵੀ ਦੇ ਸਕਦੀ ਹੈ, ਜਿਵੇਂ ਕਿ ਫ਼ੋਨ ਕਾਲਾਂ ਦਾ ਜਵਾਬ ਦੇਣਾ ਅਤੇ \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਨੂੰ ਕੰਟਰੋਲ ਕਰਨਾ।"</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"ਨਿਯਮਬੱਧ ਮੋਡ ਦੀ ਜਾਣਕਾਰੀ ਵਾਲੀ ਸੂਚਨਾ"</string> <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"ਬੈਟਰੀ ਚਾਰਜ ਕਰਨ ਦੇ ਮਿੱਥੇ ਸਮੇਂ ਤੋਂ ਪਹਿਲਾਂ ਸ਼ਾਇਦ ਬੈਟਰੀ ਖਤਮ ਹੋ ਜਾਵੇ"</string> <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ਬੈਟਰੀ ਲਾਈਫ਼ ਵਧਾਉਣ ਲਈ ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index e5f66faef0d8..22abb3369557 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -615,14 +615,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona odcisku palca"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"zarządzanie sprzętem do rozpoznawania twarzy"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Zezwala na aktywowanie przez aplikację metody dodawania i usuwania szablonów twarzy."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"używanie sprzętu do rozpoznawania twarzy"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Zezwala na używanie przez aplikację sprzętu do rozpoznawania twarzy w uwierzytelniania"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Rozpoznawanie twarzy"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Zarejestruj swoją twarz ponownie"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Aby poprawić rozpoznawanie, ponownie zarejestruj swoją twarz"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Skonfiguruj rozpoznawanie twarzy"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Popatrz na ekran telefonu, aby go odblokować"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Skonfiguruj więcej sposobów odblokowywania"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Kliknij, aby dodać odcisk palca"</string> @@ -649,18 +647,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Nie można zweryfikować twarzy. Sprzęt niedostępny."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Spróbuj rozpoznawania twarzy ponownie."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Nie można przechowywać nowych danych twarzy. Usuń stare."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Analiza twarzy została anulowana."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Użytkownik anulował rozpoznawanie twarzy."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Zbyt wiele prób. Spróbuj ponownie później."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Zbyt wiele prób. Rozpoznawanie twarzy zostało wyłączone."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Nie można zweryfikować twarzy. Spróbuj ponownie."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Rozpoznawanie twarzy nie jest skonfigurowane."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"To urządzenie nie obsługuje rozpoznawania twarzy."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Czujnik jest tymczasowo wyłączony."</string> <string name="face_name_template" msgid="3877037340223318119">"Twarz <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Używaj rozpoznawania twarzy"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Używaj rozpoznawania twarzy lub blokady ekranu"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Użyj skanu twarzy, aby kontynuować"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Aby kontynuować, użyj rozpoznawania twarzy lub blokady ekranu"</string> @@ -963,7 +969,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Rozwiń obszar odblokowania."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Odblokowanie przesunięciem."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Odblokowanie wzorem."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Rozpoznawanie twarzy"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Odblokowanie kodem PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Odblokowanie kodu PIN karty SIM."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Odblokowanie kodu PUK karty SIM."</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 9384aff610d6..564cec70ce4d 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ícone de impressão digital"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"gerenciar hardware de desbloqueio facial"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"usar hardware de desbloqueio facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Permite que o app use o hardware de desbloqueio facial para autenticação"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueio facial"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Registre seu rosto novamente"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para melhorar o reconhecimento, registre seu rosto novamente"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Configure o desbloqueio facial"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloqueie o smartphone olhando para ele"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configure mais formas de desbloquear a tela"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toque para adicionar uma impressão digital"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Impossível verificar rosto. Hardware indisponível."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Tente usar o desbloqueio facial novamente."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Não é possível salvar dados faciais. Exclua dados antigos."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Operação facial cancelada."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Desbloqueio facial cancelado pelo usuário."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Excesso de tentativas. Tente novamente mais tarde."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Muitas tentativas. Desbloqueio facial desativado."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Não é possível verificar o rosto. Tente novamente."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"O desbloqueio facial não foi configurado."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"O desbloqueio facial não é compatível com este dispositivo."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor desativado temporariamente."</string> <string name="face_name_template" msgid="3877037340223318119">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Usar desbloqueio facial"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Usar reconhecimento facial ou bloqueio de tela"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Use seu rosto para continuar"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use seu rosto ou o bloqueio de tela para continuar"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Expandir a área de desbloqueio."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Desbloqueio com deslize."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Desbloqueio com padrão."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Desbloqueio facial."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Desbloqueio com PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Desbloqueio com PIN do chip."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Desbloqueio com PUK do chip."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 2107abdc41ad..d38a49b9b90a 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ícone de impressão digital"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"gerir hardware de Desbloqueio facial"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Permite à app invocar métodos para adicionar e eliminar modelos faciais para uso."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"utilizar hardware de Desbloqueio facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Permite que a app utilize hardware de Desbloqueio facial para autenticação"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueio facial"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Volte a inscrever o seu rosto"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para melhorar o reconhecimento, volte a inscrever o seu rosto."</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Configure o desbloqueio facial"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloqueie o telemóvel ao olhar para ele"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configure mais formas de desbloquear"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toque para adicionar uma impressão digital"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Não pode validar o rosto. Hardware não disponível."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Experimente de novo o Desbloqueio facial"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Não pode guardar novos dados de rostos. Elimine um antigo."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Operação de rosto cancelada."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Desbloqueio facial cancelado pelo utilizador"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Demasiadas tentativas. Tente novamente mais tarde."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Demasiadas tentativas. O Desbloqueio facial está desativado."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Não é possível validar o rosto. Tente novamente."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Não configurou o Desbloqueio facial."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Desbloqueio facial não suportado neste dispositivo."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor temporariamente desativado."</string> <string name="face_name_template" msgid="3877037340223318119">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Utilizar o desbloqueio facial"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Utilizar o bloqueio através do rosto ou de ecrã"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Utilize o rosto para continuar"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Utilize o rosto ou o bloqueio de ecrã para continuar"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Expandir área de desbloqueio."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Desbloqueio através de deslize."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Desbloqueio através de sequência."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Desbloqueio facial"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Desbloqueio através de PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Desbloqueio do SIM através de PIN."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Desbloqueio do PUK do SIM."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 9384aff610d6..564cec70ce4d 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ícone de impressão digital"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"gerenciar hardware de desbloqueio facial"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"usar hardware de desbloqueio facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Permite que o app use o hardware de desbloqueio facial para autenticação"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Desbloqueio facial"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Registre seu rosto novamente"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para melhorar o reconhecimento, registre seu rosto novamente"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Configure o desbloqueio facial"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Desbloqueie o smartphone olhando para ele"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configure mais formas de desbloquear a tela"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Toque para adicionar uma impressão digital"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Impossível verificar rosto. Hardware indisponível."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Tente usar o desbloqueio facial novamente."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Não é possível salvar dados faciais. Exclua dados antigos."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Operação facial cancelada."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Desbloqueio facial cancelado pelo usuário."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Excesso de tentativas. Tente novamente mais tarde."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Muitas tentativas. Desbloqueio facial desativado."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Não é possível verificar o rosto. Tente novamente."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"O desbloqueio facial não foi configurado."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"O desbloqueio facial não é compatível com este dispositivo."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor desativado temporariamente."</string> <string name="face_name_template" msgid="3877037340223318119">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Usar desbloqueio facial"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Usar reconhecimento facial ou bloqueio de tela"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Use seu rosto para continuar"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use seu rosto ou o bloqueio de tela para continuar"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Expandir a área de desbloqueio."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Desbloqueio com deslize."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Desbloqueio com padrão."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Desbloqueio facial."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Desbloqueio com PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Desbloqueio com PIN do chip."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Desbloqueio com PUK do chip."</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 373d11f4a215..e57f12a37333 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -612,14 +612,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Pictograma amprentă"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"să gestioneze hardware de deblocare facială"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Permite aplicației să invoce metode pentru a adăuga și a șterge șabloane faciale pentru utilizare."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"să folosească hardware de deblocare facială"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Permite aplicației să folosească hardware de deblocare facială pentru autentificare"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Deblocare facială"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Reînregistrați-vă chipul"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Pentru a îmbunătăți recunoașterea, reînregistrați-vă chipul"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Configurați deblocarea facială"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Deblocați-vă telefonul uitându-vă la acesta"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Configurați mai multe moduri de deblocare"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Atingeți ca să adăugați o amprentă"</string> @@ -646,18 +644,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Nu se poate confirma fața. Hardware-ul nu este disponibil."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Încercați din nou deblocarea facială."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Nu se pot stoca date faciale noi. Ștergeți întâi unele vechi."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Operațiunea privind chipul a fost anulată."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Deblocarea facială este anulată de utilizator."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Prea multe încercări. Reîncercați mai târziu."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Prea multe încercări. Deblocarea facială este dezactivată."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Nu se poate confirma fața. Încercați din nou."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Nu ați configurat deblocarea facială."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Deblocarea facială nu este acceptată pe dispozitiv."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Senzorul este dezactivat temporar."</string> <string name="face_name_template" msgid="3877037340223318119">"Chip <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Folosiți deblocarea facială"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Folosiți deblocarea facială sau ecranul de blocare"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Folosiți-vă chipul ca să continuați"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Folosiți-vă chipul sau blocarea ecranului pentru a continua"</string> @@ -960,7 +966,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Extindeți zona de deblocare."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Deblocare prin glisare."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Deblocare cu model."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Deblocare facială."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Deblocare cu PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Deblocare PIN pentru cardul SIM."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Deblocare PUK pentru cardul SIM."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 0efe7ecea659..35bc2a7445e6 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -615,14 +615,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Значок отпечатка пальца"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"Управление аппаратным обеспечением для функции \"Фейсконтроль\""</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Приложение сможет добавлять и удалять шаблоны лиц."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"Использование аппаратного обеспечения для функции \"Фейсконтроль\""</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Приложение сможет использовать для аутентификации аппаратное обеспечение фейсконтроля."</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Фейсконтроль"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Зарегистрируйте лицо ещё раз"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Чтобы улучшить распознавание лица, зарегистрируйте его ещё раз"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Настройте фейсконтроль"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Вы сможете разблокировать телефон, просто посмотрев на него."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Настройте другие способы разблокировки"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Нажмите, чтобы добавить отпечаток пальца."</string> @@ -649,18 +647,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Не удалось распознать лицо. Сканер недоступен."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Попробуйте воспользоваться фейсконтролем ещё раз."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Недостаточно места. Удалите старые данные для распознавания."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Распознавание отменено"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Фейсконтроль: операция отменена пользователем."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Слишком много попыток. Повторите позже."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Слишком много попыток. Функция \"Фейсконтроль\" отключена."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Не удалось распознать лицо. Повторите попытку."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Вы не настроили фейсконтроль."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Это устройство не поддерживает функцию \"Фейсконтроль\"."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Датчик временно отключен."</string> <string name="face_name_template" msgid="3877037340223318119">"Лицо <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Использовать фейсконтроль"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Использовать фейсконтроль или блокировку экрана"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Чтобы продолжить, используйте функцию фейсконтроля."</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Чтобы продолжить, посмотрите на экран или используйте данные для разблокировки."</string> @@ -963,7 +969,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Развернуть области разблокировки"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Прокрутка"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Графический ключ"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Фейсконтроль"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"PIN-код"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Разблокировка PIN-кода SIM-карты."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Разблокировка PUK-кода SIM-карты."</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 67f45a634a0c..8acc109271fc 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ඇඟිලි සලකුණු නිරූපකය"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"මුහුණෙන් අගුළු හැරීම දෘඪාංග කළමනා කරන්න"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"මුහුණු අච්චු එකතු කිරීමට සහ ඉවත් කිරීමට අදාළ ක්රම භාවිතය සඳහා මෙම යෙදුමට ඉඩ දෙයි."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"මුහුණෙන් අගුළු හැරීමේ දෘඪාංග භෘවිත කරන්න"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"සත්යාපනය සඳහා මුහුණෙන් අගුළු හැරීමේ දෘඪාංග භාවිත කිරීමට යෙදුමට ඉඩ දෙයි"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"මුහුණෙන් අගුළු හැරීම"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"හඳුනා ගැනීම වැඩිදියුණු කිරීමට, ඔබේ මුහුණ යළි-ලියාපදිංචි කරන්න"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"මුහුණෙන් අගුළු හැරීම පිහිටුවන්න"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"ඔබගේ දුරකථනය දෙස බැලීමෙන් එහි අගුලු හරින්න"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"අගුලු හැරීමට තවත් ක්රම සකසන්න"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"ඇඟිලි සලකුණක් එක් කිරීමට තට්ටු කරන්න"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"මුහුණ සත්යාපනය කළ නොහැක. දෘඩාංගය නොමැත."</string> - <string name="face_error_timeout" msgid="522924647742024699">"නැවතත් මුහුණෙන් අගුළු හැරීම උත්සාහ කරන්න."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"නව මුහුණු දත්ත ගබඩා කළ නොහැක. පළමුව පැරණි එකක් මකන්න."</string> <string name="face_error_canceled" msgid="2164434737103802131">"මුහුණු මෙහෙයුම අවලංගු කරන ලදී."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"පරිශීලකයා මුහුණෙන් අගුළු හැරීම අවලංගු කර ඇත."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"උත්සාහයන් ඉතා වැඩි ගණනකි. පසුව නැවත උත්සාහ කරන්න."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"ප්රයත්න ගණන වැඩියි. මුහුණෙන් අගුළු හැරීම අබලයි."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"මුහුණ සත්යාපන කළ නොහැක. නැවත උත්සාහ කරන්න."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"ඔබ මුහුණෙන් අගුළු හැරීම සකසා නැත"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"මෙම උපාංගයෙහි මුහුණෙන් අගුළු හැරීම සහය නොදැක්වේ"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"සංවේදකය තාවකාලිකව අබල කර ඇත."</string> <string name="face_name_template" msgid="3877037340223318119">"මුහුණු <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"මුහුණෙන් අගුළු හැරීම භාවිත කරන්න"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"මුහුණෙන් අගුළු හැරීම හෝ තිර අගුල භාවිත කරන්න"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"ඉදිරියට යාමට ඔබගේ මුහුණ භාවිත කරන්න"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ඉදිරියට යාමට ඔබගේ මුහුණු හෝ තිර අගුල භාවිත කරන්න"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"අගුළු නොදැමූ ප්රදේශය පුළුල් කරන්න."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"සර්පණ අගුළු ඇරීම."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"රටා අගුළු ඇරීම."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"මුහුණෙන් අගුළු හැරීම."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"PIN අගුළු ඇරීම."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Sim Pin අගුලු දැමීම."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Sim Puk අගුලු දැමීම."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index c23292ed292d..416b673b8ae8 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -615,14 +615,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona odtlačku prsta"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"spravovať hardvér odomknutia tvárou"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Umožňuje aplikácii vyvolať metódy, ktoré pridávajú a odstraňujú šablóny tvárí."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"používať hardvér odomknutia tvárou"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Umožňuje aplikácii používať na overenie totožnosti hardvér odomknutia tvárou"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Odomknutie tvárou"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Znova zaregistrujte svoju tvár"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Znova zaregistrujte svoju tvár, aby sa zlepšilo rozpoznávanie"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Nastavte odomknutie tvárou"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Odomykajte telefón tak, že sa naň pozriete"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavte viac spôsobov odomknutia"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Klepnutím pridajte odtlačok prsta"</string> @@ -649,18 +647,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Tvár sa nedá overiť. Hardvér nie je k dispozícii."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Skúste znova použiť odomknutie tvárou."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Nové údaje o tvári sa nedajú uložiť. Najprv odstráňte jeden zo starých záznamov."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Operácia týkajúca sa tváre bola zrušená"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Odomknutie tvárou zrušil používateľ."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Príliš veľa pokusov. Skúste to neskôr."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Príliš veľa pokusov. Odomknutie tvárou bolo zakázané."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Nedá sa overiť tvár. Skúste to znova."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Nenastavili ste odomknutie tvárou."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Toto zariadenie nepodporuje odomknutie tvárou."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Senzor je dočasne vypnutý."</string> <string name="face_name_template" msgid="3877037340223318119">"Tvár <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Použiť odomknutie tvárou"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Použiť tvár alebo zámku obrazovky"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Pokračujte pomocou tváre"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Pokračujte použitím tváre alebo zámky obrazovky"</string> @@ -963,7 +969,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Rozšíriť oblasť na odomknutie."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Odomknutie prejdením prstom."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Odomknutie vzorom."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Odomknutie tvárou."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Odomknutie kódom PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Odomknutie pomocou kódu PIN SIM karty."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Odomknutie pomocou kódu PUK SIM karty."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index a9f08f20e2cf..eea05176dba6 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -615,14 +615,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona prstnih odtisov"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"upravljanje strojne opreme za odklepanje z obrazom"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Aplikaciji omogoča sprožanje načinov za dodajanje in brisanje predlog z obrazi za uporabo."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"uporaba strojne opreme za odklepanje z obrazom"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Aplikaciji omogoča uporabo strojne opreme za odklepanje z obrazom za preverj. pristnosti"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Odklepanje z obrazom"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Znova registrirajte obraz"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Za izboljšanje prepoznavanja znova registrirajte svoj obraz"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Nastavite odklepanje z obrazom"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Odklenite telefon tako, da ga pogledate."</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Nastavite več načinov odklepanja"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Dotaknite se, da dodate prstni odtis."</string> @@ -649,18 +647,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Obraza ni mogoče preveriti. Str. opr. ni na voljo."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Znova izvedite odklepanje z obrazom."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Novega obraza ni mogoče shraniti. Najprej izbrišite starega."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Dejanje z obrazom je bilo preklicano."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Odklepanje z obrazom je preklical uporabnik."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Preveč poskusov. Poskusite znova pozneje."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Preveč poskusov. Odklepanje z obrazom je onemogočeno."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Obraza ni mogoče preveriti. Poskusite znova."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Odklepanja z obrazom niste nastavili."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Ta naprava ne podpira odklepanja z obrazom."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Tipalo je začasno onemogočeno."</string> <string name="face_name_template" msgid="3877037340223318119">"Obraz <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Uporaba odklepanja z obrazom"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Uporaba odklepanja z obrazom ali s poverilnico"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Uporabite obraz, če želite nadaljevati."</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Za nadaljevanje uporabite obraz ali odklepanje s poverilnico."</string> @@ -737,7 +743,7 @@ <string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"Nadzira število vnesenih nepravilnih gesel pri odklepanju zaslona in zaklene napravo Android TV ali izbriše vse podatke tega uporabnika, če je vnesenih preveč nepravilnih gesel."</string> <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="9177645136475155924">"Nadzira število vnesenih nepravilnih gesel pri odklepanju zaslona in zaklene telefon ali izbriše vse podatke lastnika, če je vnesenih preveč nepravilnih gesel."</string> <string name="policylab_resetPassword" msgid="214556238645096520">"Spreminjanje zaklepanja zaslona"</string> - <string name="policydesc_resetPassword" msgid="4626419138439341851">"Spreminjanje zaklepanja zaslona."</string> + <string name="policydesc_resetPassword" msgid="4626419138439341851">"Spremeni zaklepanje zaslona."</string> <string name="policylab_forceLock" msgid="7360335502968476434">"Zaklepanje zaslona"</string> <string name="policydesc_forceLock" msgid="1008844760853899693">"Nadzor nad tem, kako in kdaj se zaklene zaslon."</string> <string name="policylab_wipeData" msgid="1359485247727537311">"Brisanje vseh podatkov"</string> @@ -963,7 +969,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Razširitev območja odklepanja."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Odklepanje s podrsanjem."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Odklepanje z vzorcem."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Odklepanje z obrazom."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Odklepanje s kodo PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Odklepanje kartice SIM s kodo PIN"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Odklepanje kartice SIM s kodo PUK"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 7150c5b3ac8b..055de564190a 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona e gjurmës së gishtit"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"menaxho harduerin për shkyçjen me fytyrë"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Lejon aplikacionin të aktivizojë mënyra për shtim e fshirje të shablloneve të përdorura."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"përdor harduerin e shkyçjes me fytyrë"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Lejon aplikacionin të përdorë harduerin e shkyçjes me fytyrë për procesin e vërtetimit"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Shkyçja me fytyrë"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Regjistro përsëri fytyrën tënde"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Për të përmirësuar njohjen, regjistro përsëri fytyrën tënde"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Konfiguro shkyçjen me fytyrë"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Shkyçe telefonin duke parë tek ai"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfiguri më shumë mënyra për të shkyçur"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Trokit për të shtuar një gjurmë gishti"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Fytyra s\'mund të verifikohet. Hardueri nuk ofrohet."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Provo përsëri shkyçjen me fytyrë."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"S\'mund të ruhen të dhëna të reja fytyre. Fshi një të vjetër në fillim."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Veprimi me fytyrën u anulua."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Shkyçja me fytyrë u anulua nga përdoruesi."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Shumë përpjekje. Provo sërish më vonë."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Shumë përpjekje. Shkyçja me fytyrë u çaktivizua."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Fytyra nuk mund të verifikohet. Provo përsëri."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Nuk e ke konfiguruar shkyçjen me fytyrë."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Shkyçja me fytyrë nuk mbështetet në këtë pajisje"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensori është çaktivizuar përkohësisht."</string> <string name="face_name_template" msgid="3877037340223318119">"Fytyra <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Përdor shkyçjen me fytyrë"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Përdor kyçjen me fytyrë ose kyçjen e ekranit"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Përdor fytyrën tënde për të vazhduar"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Përdor fytyrën tënde ose kyçjen e ekranit për të vazhduar"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Zgjero zonën e shkyçjes."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Rrëshqit shkyçjen."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Shkyçje me motiv."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Shkyçja me fytyrë."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Shkyçje me PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Shkyçja e kartës SIM me kodin PIN"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Shkyçja e kartës SIM me kodin PUK"</string> @@ -2095,8 +2102,7 @@ <string name="nas_upgrade_notification_enable_action" msgid="3046406808378726874">"Në rregull"</string> <string name="nas_upgrade_notification_disable_action" msgid="3794833210043497982">"Çaktivizo"</string> <string name="nas_upgrade_notification_learn_more_action" msgid="7011130656195423947">"Mëso më shumë"</string> - <!-- no translation found for nas_upgrade_notification_learn_more_content (3735480566983530650) --> - <skip /> + <string name="nas_upgrade_notification_learn_more_content" msgid="3735480566983530650">"Njoftimet e përmirësuara kanë zëvendësuar \"Njoftimet me përshtatje të Android\" në Android 12. Kjo veçori shfaq veprimet dhe përgjigjet e sugjeruara dhe organizon njoftimet e tua.\n\nNjoftimet e përmirësuara mund të kenë qasje te përmbajtja e njoftimeve, duke përfshirë informacionet personale si emrat e kontakteve dhe mesazhet. Kjo veçori mund t\'i heqë ose të përgjigjet po ashtu për njoftimet, si p.sh. t\'u përgjigjet telefonatave, dhe të kontrollojë modalitetin \"Mos shqetëso\"."</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Njoftimi i informacionit të \"Modalitetit rutinë\""</string> <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Bateria mund të mbarojë përpara ngarkimit të zakonshëm"</string> <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"\"Kursyesi i baterisë\" u aktivizua për të rritur kohëzgjatjen e baterisë"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 7490be55f79e..3aa976421240 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -612,14 +612,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Икона отиска прста"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"управљање хардв. за откључавање лицем"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Дозвољава да апликација активира методе за додавање и брисање шаблона лица ради коришћења."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"коришћење хардвера за откључавање лицем"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Дозвољава да апликација користи хардвер за откључавање лицем ради потврде идентитета"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Откључавање лицем"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Поново региструјте лице"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Да бисте побољшали препознавање, поново региструјте лице"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Подесите откључавање лицем"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Откључајте телефон тако што ћете га погледати"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Подесите још начина за откључавање"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Додирните да бисте додали отисак прста"</string> @@ -646,18 +644,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Провера лица није успела. Хардвер није доступан."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Пробајте поново откључавање лицем."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Нови подаци о лицу нису сачувани. Прво избришете претходне."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Обрада лица је отказана."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Корисник је отказао откључавање лицем"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Превише покушаја. Пробајте поново касније."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Превише покушаја. Откључавање лицем је онемогућено."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Провера лица није успела. Пробајте поново."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Нисте подесили откључавање лицем"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Откључавање лицем није подржано на овом уређају"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Сензор је привремено онемогућен."</string> <string name="face_name_template" msgid="3877037340223318119">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Користите откључавање лицем"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Користите закључавање лицем или закључавање екрана"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Потврдите идентитет лицем да бисте наставили"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Користите лице или закључавање екрана да бисте наставили"</string> @@ -960,7 +966,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Прошири област откључавања."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Откључавање превлачењем."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Откључавање шаблоном."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Откључавање лицем."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Откључавање PIN-ом."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Откључава SIM картицу PIN-ом."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Откључава SIM картицу PUK-ом."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 7ec2b4de1ad4..bacbe654e41f 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikon för fingeravtryck"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"hantera maskinvara för ansiktslås"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Tillåter att appen anropar metoder för att lägga till och radera ansiktsmallar."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"använd maskinvara för ansiktslås"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Tillåter att appen använder maskinvara för ansiktslås vid autentisering"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Ansiktslås"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Registrera ansiktet på nytt"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Gör om registreringen av ansiktet så att ansiktsigenkänningen ska fungera bättre"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Konfigurera ansiktslås"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Lås upp telefonen genom att titta på den"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfigurera fler sätt att låsa upp"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tryck för att lägga till ett fingeravtryck"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Ansiktsverifiering går ej. Otillgänglig maskinvara."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Försök att använda ansiktslåset igen."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Kan inte lagra ny ansiktsdata. Radera först gammal data."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Ansiktsåtgärden har avbrutits."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Ansiktslås avbröts av användaren."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Du har gjort för många försök. Försök igen senare."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"För många försök. Ansiktslås har inaktiverats."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Det gick inte att verifiera ansiktet. Försök igen."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Du har inte konfigurerat ansiktslås."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Ansiktslås stöds inte på den här enheten."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensorn har tillfälligt inaktiverats."</string> <string name="face_name_template" msgid="3877037340223318119">"Ansikte <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Använd ansiktslåset"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Använd ansiktslåset eller skärmlåset"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Fortsätt med hjälp av ditt ansikte"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Fortsätt med hjälp av ditt ansikte eller skärmlåset"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Expandera upplåsningsytan."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Lås upp genom att dra."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Lås upp med grafiskt lösenord."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Ansiktslås."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Lås upp med PIN-kod."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Lås upp med SIM-kortets pinkod."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Lås upp med SIM-kortets PUK-kod."</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 1fb7ebcd9703..00a96d0e3ea5 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Aikoni ya alama ya kidole"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"dhibiti maunzi ya kufungua kwa uso"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Huruhusu programu iombe njia za kuongeza na kufuta violezo vya uso vitakavyotumiwa."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"tumia maunzi ya kufungua kwa uso"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Huruhusu programu itumie maunzi ya kufungua kwa uso ili kuthibitisha"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Kufungua kwa uso"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Sajili uso wako tena"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Ili kuimarisha utambuzi, tafadhali sajili uso wako tena"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Weka mipangilio ya kufungua kwa uso"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Fungua simu yako kwa kuiangalia"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Weka mipangilio ya mbinu zaidi za kufungua"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Gusa ili uweke alama ya kidole"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Imeshindwa kuthibitisha uso. Maunzi hayapatikani."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Jaribu kufungua kwa uso tena."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Imeshindwa kuhifadhi data ya uso mpya. Futa wa kale kwanza."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Utendaji wa kitambulisho umeghairiwa."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Kufungua kwa uso kumeghairiwa na mtumiaji."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Umejaribu mara nyingi mno. Jaribu tena baadaye."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Umejaribu mara nyingi mno. Kipengele cha kufungua kwa uso kimezimwa."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Imeshindwa kuthibitisha uso. Jaribu tena."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Hujaweka mipangilio ya kufungua kwa uso."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Kufungua kwa uso hakutumiki kwenye kifaa hiki."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Kitambuzi kimezimwa kwa muda."</string> <string name="face_name_template" msgid="3877037340223318119">"Uso wa <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Tumia kipengele cha kufungua kwa uso"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Tumia uso au mbinu ya kufunga skrini"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Tumia uso wako ili uendelee"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Tumia uso au mbinu yako ya kufunga skrini ili uendelee"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Panua eneo la kufungua."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Kufungua slaidi."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Kufungua kwa ruwaza."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Kufungua kwa uso."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Kufungua kwa PIN."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Kufungua Pin ya Sim."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Kufungua Puk ya Sim."</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 167041437ef1..03a1b8de5b6f 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"கைரேகை ஐகான்"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"\'முகம் காட்டித் திறத்தல்\' அம்சத்துக்கான வன்பொருளை நிர்வகித்தல்"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"உபயோகிப்பதற்காக முக டெம்ப்ளேட்டுகளை சேர்க்கும்/நீக்கும் முறைகளை இயக்க, ஆப்ஸை அனுமதிக்கும்."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"’முகம் காட்டித் திறத்தல்’ அம்சத்திற்கான வன்பொருளைப் பயன்படுத்துதல்"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"அடையாளம் காண \'முகம் காட்டித் திறத்தலுக்கான\' வன்பொருளைப் பயன்படுத்த ஆப்ஸை அனுமதிக்கும்"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"முகம் காட்டித் திறத்தல்"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"முகத்தை மீண்டும் பதிவுசெய்யவும்"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"அடையாளத்தை மேம்படுத்த முகத்தை மீண்டும் பதிவுசெய்யவும்"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"முகம் காட்டித் திறத்தல் அம்சத்தை அமையுங்கள்"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"மொபைலைப் பார்ப்பதன் மூலம் அதைத் திறக்கலாம்"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"திறக்க, மேலும் பல வழிகளை அமையுங்கள்"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"கைரேகையைச் சேர்க்கத் தட்டுங்கள்"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"முகத்தைச் சரிபார்க்க இயலவில்லை. வன்பொருள் இல்லை."</string> - <string name="face_error_timeout" msgid="522924647742024699">"\'முகம் காட்டித் திறத்தலை\' மீண்டும் முயலவும்."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"புதிய முகங்களைச் சேர்க்க இயலவில்லை. பழையது ஒன்றை நீக்கவும்."</string> <string name="face_error_canceled" msgid="2164434737103802131">"முக அங்கீகாரச் செயல்பாடு ரத்துசெய்யப்பட்டது."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"பயனர் \'முகம் காட்டித் திறத்தல்\' அம்சத்தை ரத்துசெய்தார்."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"பலமுறை முயன்றுவிட்டீர்கள். பிறகு முயலவும்."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"பலமுறை முயன்றுவிட்டீர்கள். \'முகம் காட்டித் திறத்தல்’ அம்சம் முடக்கப்பட்டது."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"முகத்தைச் சரிபார்க்க இயலவில்லை. மீண்டும் முயலவும்."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"‘முகம் காட்டித் திறத்தல்’ அம்சத்தை நீங்கள் அமைக்கவில்லை."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"இந்த சாதனத்தில் ’முகம் காட்டித் திறத்தல்’ ஆதரிக்கப்படவில்லை."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"சென்சார் தற்காலிகமாக முடக்கப்பட்டுள்ளது."</string> <string name="face_name_template" msgid="3877037340223318119">"முகம் <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"முகம் காட்டித் திறத்தலை உபயோகி"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"முகம் காட்டித் திறத்தல் / திரைப் பூட்டைப் பயன்படுத்து"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"தொடர்வதற்கு உங்கள் முகத்தைப் பயன்படுத்துங்கள்"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"தொடர, உங்கள் முகத்தையோ திரைப் பூட்டையோ பயன்படுத்துங்கள்"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"திறப்பதற்கான பகுதியை விவரிக்கவும்."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"ஸ்லைடு மூலம் திறத்தல்."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"பேட்டர்ன் மூலம் திறத்தல்."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"முகம் காட்டித் திறத்தல்."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin மூலம் திறத்தல்."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"சிம்மைத் திறக்கும் பின்."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"சிம்மைத் திறக்கும் Puk."</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 33de0ec236eb..9bb10ea95003 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"వేలిముద్ర చిహ్నం"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"ఫేస్ అన్లాక్ చేయగల హార్డ్వేర్ను మేనేజ్ చేయడం"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"వినియోగం కోసం ముఖ టెంప్లేట్లను జోడించే మరియు తొలగించే పద్ధతులను అమలు చేయడానికి యాప్ను అనుమతిస్తుంది."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"ఫేస్ అన్లాక్ హార్డ్వేర్ను ఉపయోగించడం"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"ప్రామాణీకరణ కోసం ఫేస్తో అన్లాక్ చేయగల హార్డ్వేర్ ఉపయోగానికి యాప్ను అనుమతిస్తుంది"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ఫేస్ అన్లాక్"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"మీ ముఖాన్ని తిరిగి నమోదు చేయండి"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"గుర్తింపును మెరుగుపరచడానికి, దయచేసి మీ ముఖంను తిరిగి నమోదు చేసుకోండి"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"ఫేస్ అన్లాక్ను సెటప్ చేయండి"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"మీ ఫోన్ను చూడటం ద్వారా దాన్ని అన్లాక్ చేయండి"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"అన్లాక్ చేయడానికి మరిన్ని మార్గాలను సెటప్ చేయండి"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"వేలిముద్రను జోడించడానికి ట్యాప్ చేయండి"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"ముఖం ధృవీకరించలేరు. హార్డ్వేర్ అందుబాటులో లేదు."</string> - <string name="face_error_timeout" msgid="522924647742024699">"ఫేస్ అన్లాక్ను మళ్లీ ప్రయత్నించండి."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"కొత్త ముఖం డేటాను నిల్వ చేయడం కాదు. మొదట పాతది తొలిగించండి."</string> <string name="face_error_canceled" msgid="2164434737103802131">"ముఖ కార్యకలాపం రద్దయింది."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"ఫేస్ అన్లాక్ను యూజర్ రద్దు చేశారు."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"చాలా సార్లు ప్రయత్నించారు. ఫేస్ అన్లాక్ డిజేబుల్ చేయబడింది."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"ముఖం ధృవీకరించలేకపోయింది. మళ్లీ ప్రయత్నించండి."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"మీరు ఫేస్ అన్లాక్ను సెటప్ చేయలేదు."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"ఈ పరికరంలో ఫేస్ అన్లాక్ను ఉపయోగించడానికి సపోర్ట్ లేదు."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"సెన్సార్ తాత్కాలికంగా డిజేబుల్ చేయబడింది."</string> <string name="face_name_template" msgid="3877037340223318119">"ముఖ <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"ఫేస్ అన్లాక్ను ఉపయోగించండి"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ఫేస్ లేదా స్క్రీన్ లాక్ను ఉపయోగించండి"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"కొనసాగించడానికి మీ ముఖాన్ని ఉపయోగించండి"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"కొనసాగించడానికి మీ ముఖం లేదా స్క్రీన్ లాక్ను ఉపయోగించండి"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"అన్లాక్ ప్రాంతాన్ని విస్తరింపజేయండి."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"స్లయిడ్ అన్లాక్."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"ఆకృతి అన్లాక్."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"ఫేస్ అన్లాక్."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"పిన్ అన్లాక్."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Sim పిన్ అన్లాక్."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Sim Puk అన్లాక్."</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index f98580b8c948..0f55dbaf2346 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -321,7 +321,7 @@ <string name="permgroupdesc_camera" msgid="7585150538459320326">"ถ่ายภาพและบันทึกวิดีโอ"</string> <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"อุปกรณ์ที่อยู่ใกล้เคียง"</string> <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"ค้นหาและเชื่อมต่อกับอุปกรณ์ที่อยู่ใกล้เคียง"</string> - <string name="permgrouplab_calllog" msgid="7926834372073550288">"ประวัติการโทร"</string> + <string name="permgrouplab_calllog" msgid="7926834372073550288">"บันทึกการโทร"</string> <string name="permgroupdesc_calllog" msgid="2026996642917801803">"อ่านและเขียนบันทึกการโทรของโทรศัพท์"</string> <string name="permgrouplab_phone" msgid="570318944091926620">"โทรศัพท์"</string> <string name="permgroupdesc_phone" msgid="270048070781478204">"โทรและจัดการการโทร"</string> @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ไอคอนลายนิ้วมือ"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"จัดการฮาร์ดแวร์การปลดล็อกด้วยใบหน้า"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"อนุญาตให้แอปเรียกใช้วิธีเพิ่มและลบเทมเพลตใบหน้าสำหรับการใช้งาน"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"ใช้ฮาร์ดแวร์การปลดล็อกด้วยใบหน้า"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"อนุญาตให้แอปใช้ฮาร์ดแวร์การปลดล็อกด้วยใบหน้าเพื่อตรวจสอบสิทธิ์"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"ปลดล็อกด้วยใบหน้า"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"ลงทะเบียนใบหน้าอีกครั้ง"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"โปรดลงทะเบียนใบหน้าอีกครั้งเพื่อปรับปรุงการจดจำ"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"ตั้งค่าการปลดล็อกด้วยใบหน้า"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"ปลดล็อกโทรศัพท์โดยมองไปที่โทรศัพท์"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"ตั้งค่าการปลดล็อกด้วยวิธีอื่น"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"แตะเพื่อเพิ่มลายนิ้วมือ"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"ยืนยันใบหน้าไม่ได้ ฮาร์ดแวร์ไม่พร้อมใช้งาน"</string> - <string name="face_error_timeout" msgid="522924647742024699">"ลองใช้การปลดล็อกด้วยใบหน้าอีกครั้ง"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"จัดเก็บข้อมูลใบหน้าใหม่ไม่ได้ ลบข้อมูลเก่าออกไปก่อน"</string> <string name="face_error_canceled" msgid="2164434737103802131">"ยกเลิกการดำเนินการกับใบหน้าแล้ว"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"ผู้ใช้ยกเลิกการใช้การปลดล็อกด้วยใบหน้า"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"ลองหลายครั้งเกินไป ปิดใช้การปลดล็อกด้วยใบหน้าแล้ว"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"ยืนยันใบหน้าไม่ได้ ลองอีกครั้ง"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"คุณยังไม่ได้ตั้งค่าการปลดล็อกด้วยใบหน้า"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"อุปกรณ์นี้ไม่รองรับการปลดล็อกด้วยใบหน้า"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"ปิดใช้เซ็นเซอร์ชั่วคราวแล้ว"</string> <string name="face_name_template" msgid="3877037340223318119">"ใบหน้า <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"ใช้การปลดล็อกด้วยใบหน้า"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"ใช้การล็อกด้วยใบหน้าหรือการล็อกหน้าจอ"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"ใช้ใบหน้าของคุณเพื่อดำเนินการต่อ"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ใช้ใบหน้าหรือการล็อกหน้าจอเพื่อดำเนินการต่อ"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"ขยายพื้นที่ปลดล็อก"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"การปลดล็อกด้วยการเลื่อน"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"การปลดล็อกด้วยรูปแบบ"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"การปลดล็อกด้วยใบหน้า"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"การปลดล็อกด้วย PIN"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"การปลดล็อก PIN ของซิม"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"การปลดล็อก PUK ของซิม"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index ecdeb1de3ebd..67a5c5d2cc46 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icon ng fingerprint"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"pamahalaan ang hardware ng pag-unlock gamit ang mukha"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Pumapayag na mag-invoke ang app ng paraang magdagdag at mag-delete ng template ng mukha."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"gamitin ang hardware ng Pag-unlock Gamit ang Mukha"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Pinapayagan ang app na gamitin ang hardware ng Pag-unlock Gamit ang Mukha para sa pag-authenticate"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Pag-unlock Gamit ang Mukha"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"I-enroll ulit ang iyong mukha"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Para mapahusay ang pagkilala, paki-enroll ulit ang iyong mukha"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"I-set up ang pag-unlock gamit ang mukha"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"I-unlock ang iyong telepono sa pamamagitan ng pagtingin dito"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Mag-set up ng higit pang paraan para mag-unlock"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"I-tap para magdagdag ng fingerprint"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Di ma-verify ang mukha. Di available ang hardware."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Subukan ulit ang pag-unlock gamit ang mukha."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Hindi ma-store ang data ng mukha. Mag-delete muna ng iba."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Nakansela ang operation kaugnay ng mukha."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Kinansela ng user ang pag-unlock gamit ang mukha."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Masyadong maraming pagsubok. Subukang muli mamaya."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Masyadong maraming pagsubok. Na-disable ang pag-unlock gamit ang mukha."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Hindi ma-verify ang mukha. Subukang muli."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Hindi mo pa nase-set up ang pag-unlock gamit ang mukha."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Hindi sinusuportahan ang pag-unlock gamit ang mukha sa device na ito."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Pansamantalang na-disable ang sensor."</string> <string name="face_name_template" msgid="3877037340223318119">"Mukha <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Gumamit ng pag-unlock gamit ang mukha"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Gumamit ng mukha o lock ng screen"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Gamitin ang iyong mukha para magpatuloy"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gamitin ang iyong mukha o lock ng screen para magpatuloy"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Palakihin ang bahagi ng pag-unlock."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Pag-unlock ng slide."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Pag-unlock ng pattern."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Pag-unlock gamit ang mukha."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pag-unlock ng pin."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Pag-unlock ng Pin ng Sim."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Pag-unlock ng Puk ng Sim."</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 1e568957ea40..c491db7ad997 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Parmak izi simgesi"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"yüz tanıma kilidi donanımı yönet"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Uygulamanın, kullanılacak yüz şablonlarını ekleme ve silme yöntemlerini başlatmasına izin verir."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"yüz tanıma kilidi donanımını kullan"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Uygulamanın yüz tanıma kilidi donanımı kullanmasına izin verir"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Yüz tanıma kilidi"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Yüzünüzü yeniden kaydedin"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Daha iyi tanınmasını sağlamak için lütfen yüzünüzü yeniden kaydedin"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Yüz tanıma kilidini kurun"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefonunuza bakarak kilidini açın"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Kilidi açmak için daha fazla yöntem ayarlayın"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Parmak izi eklemek için dokunun"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Yüz doğrulanamıyor. Donanım kullanılamıyor."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Yüz tanıma kilidini yeniden deneyin."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Yeni yüz verisi depolanamıyor. Önce eski bir tanesini silin."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Yüz işlemi iptal edildi."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Yüz tanıma kilidi kullanıcı tarafından iptal edildi."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Çok fazla deneme yapıldı. Daha sonra tekrar deneyin."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Çok fazla deneme yapıldı. Yüz tanıma kilidi devredışı."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Yüz doğrulanamıyor. Tekrar deneyin."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Yüz tanıma kilidi ayarlamadınız."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Bu cihazda yüz tanıma kilidi desteklenmiyor"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensör geçici olarak devre dışı bırakıldı."</string> <string name="face_name_template" msgid="3877037340223318119">"Yüz <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Yüz tanıma kilidi kullan"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Yüz tanıma veya ekran kilidi kullan"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Devam etmek için yüzünüzü kullanın"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Devam etmek için yüz veya ekran kilidinizi kullanın"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Kilit açma alanını genişletin."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Kaydırarak kilit açma."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Desenle kilit açma."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Yüzle tanıma kilidi."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin koduyla kilit açma."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM PIN kilidini açın."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM PUK kilidini açın."</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index b30734aaa85b..f129480aea3a 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -615,14 +615,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Значок відбитка пальця"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"керувати апаратним забезпечення фейсконтролю"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Додаток може активувати способи додавання й видалення шаблонів облич."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"використовувати апаратне забезпечення для Фейсконтролю"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Додаток зможе використовувати для автентифікації апаратне забезпечення фейсконтролю"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Фейсконтроль"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Повторно проскануйте обличчя"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Повторно проскануйте обличчя для ефективнішого розпізнавання"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Налаштуйте фейсконтроль"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Ви зможете розблоковувати телефон, подивившись на нього"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Налаштуйте більше способів розблокування"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Натисніть, щоб додати відбиток пальця"</string> @@ -649,18 +647,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Не вдається перевірити обличчя. Апаратне забезпечення недоступне."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Спробуйте скористатися фейсконтролем ще раз."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Не вдається зберегти нові дані про обличчя. Видаліть старі."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Дію з обличчям скасовано."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Фейсконтроль: користувач скасував операцію."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Забагато спроб. Повторіть пізніше."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Забагато спроб. Фейсконтроль вимкнено."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Не вдається перевірити обличчя. Повторіть спробу."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Ви не налаштували фейсконтроль"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"На цьому пристрої не підтримується фейсконтроль."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Датчик тимчасово вимкнено."</string> <string name="face_name_template" msgid="3877037340223318119">"Обличчя <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Доступ через фейсконтроль"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Використовувати фейсконтроль або дані для розблокування екрана"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Щоб продовжити, скористайтеся фейсконтролем"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Щоб продовжити, скористайтеся фейсконтролем або даними для розблокування екрана"</string> @@ -963,7 +969,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Розгорнути область розблокування."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Розблокування повзунком."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Розблокування ключем."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Фейсконтроль"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Розблокування PIN-кодом."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Розблокування SIM-карти PIN-кодом."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Розблокування SIM-карти PUK-кодом."</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 344307166455..8305fb1848f5 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"فنگر پرنٹ آئیکن"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"فیس اَنلاک والے ہارڈ ویئر کا نظم کریں"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"ایپ کو چہرے کی تمثیلات شامل اور حذف کرنے کے طریقوں کو کالعدم قرار دینے کی اجازت دیتا ہے۔"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"فیس اَنلاک والا ہارڈ ویئر استعمال کریں"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"ایپ کو تصدیق کے لیے فیس اَنلاک کا ہارڈ ویئر استعمال کرنے کی اجازت دیتی ہے"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"فیس اَنلاک"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"اپنے چہرے کو دوبارہ مندرج کریں"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"شناخت کو بہتر بنانے کے لیے براہ کرم اپنے چہرے کو دوبارہ مندرج کریں"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"فیس اَنلاک سیٹ اپ کریں"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"اپنے فون کی طرف دیکھ کر اسے غیر مقفل کریں"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"غیر مقفل کرنے کے مزید طریقے سیٹ اپ کریں"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"فنگر پرنٹ شامل کرنے کیلئے تھپتھپائیں"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"چہرے کی توثیق نہیں کی جا سکی۔ ہارڈ ویئر دستیاب نہیں ہے۔"</string> - <string name="face_error_timeout" msgid="522924647742024699">"فیس اَنلاک کو دوبارہ آزمائیں۔"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"چہرے کا نیا ڈیٹا اسٹور نہیں کر سکتے۔ پہلے پرانا حذف کریں۔"</string> <string name="face_error_canceled" msgid="2164434737103802131">"چہرے پر ہونے والی کارروائی منسوخ ہو گئی۔"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"صارف نے فیس اَنلاک کو منسوخ کر دیا۔"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"کافی زیادہ کوششیں کی گئیں۔ دوبارہ کوشش کریں۔"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"کافی زیادہ کوششیں۔ فیس اَنلاک غیر فعال کر دیا گیا۔"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"چہرے کی توثیق نہیں کی جا سکی۔ پھر آزمائيں۔"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"آپ نے فیس اَنلاک کو سیٹ نہیں کیا ہے۔"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"اس آلہ پر فیس اَنلاک تعاون یافتہ نہیں ہے۔"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"سینسر عارضی طور غیر فعال ہے۔"</string> <string name="face_name_template" msgid="3877037340223318119">"چہرہ <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"فیس اَنلاک استعمال کریں"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"فیس یا اسکرین لاک استعمال کریں"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"جاری رکھنے کے لیے اپنے چہرے کا استعمال کریں"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"جاری رکھنے کے لیے اپنے چہرے یا اسکرین لاک کا استعمال کریں"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"غیر مقفل کرنے والے علاقے کو پھیلائیں۔"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"سلائیڈ کے ذریعے غیر مقفل کریں۔"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"پیٹرن کے ذریعے غیر مقفل کریں۔"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"فیس اَنلاک۔"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"پن کے ذریعے غیر مقفل کریں۔"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Sim پن غیر مقفل۔"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Sim Puk غیر مقفل۔"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 2f6240ec0ff9..20991b460e18 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Barmoq izi belgisi"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"yuz bilan ochish qurilmasini boshqarish"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Ilova foydalanish uchun yuz namunalarini qo‘shish va o‘chirish usullarini tatbiq qilishi mumkin."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"yuz bilan ochish qurilmasidan foydalanish"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Haqiqiylikni tekshirish uchun yuz bilan ochishdan foydalanish imkonini beradi"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Yuz bilan ochish"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Yuzingizni yana qayd qiling"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Yuzingiz yanada yaxshiroq aniqlanishi uchun uni yana bir marta qayd qiling"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Yuz bilan ochishni sozlash"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefoningizni yuz tekshiruvi yordamida qulfdan chiqaring"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Qulfdan chiqarishning boshqa usullarini sozlang"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Barmoq izi kiritish uchun bosing"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Yuzingiz tasdiqlanmadi. Qurilma ishlamayapti."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Yana yuz bilan ochishga urining."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Yuzga oid axborot saqlanmadi. Avval eskilari tozalansin."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Yuzni aniqlash bekor qilindi."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Yuz bilan ochishni foydalanuvchi bekor qildi."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Juda ko‘p urinildi. Keyinroq qaytadan urining."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Juda koʻp urinildi. Yuz bilan ochish faolsizlantirildi."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Yuzingiz tasdiqlanmadi. Qaytadan urining."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Hali yuz bilan ochishni sozlamagansiz"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Yuz bilan ochish bu qurilmada ishlamaydi"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensor vaqtincha faol emas."</string> <string name="face_name_template" msgid="3877037340223318119">"Yuz <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Yuz bilan ochish"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Yuz bilan ochish yoki ekran qulfi"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Yuz tekshiruvi bilan davom eting"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Davom etish uchun yuz tekshiruvi yoki ekran qulfidan foydalaning"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Qulfni ochish maydonini kengaytirish."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Qulfni silab ochish"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Grafik kalit bilan ochish."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Yuz bilan ochish."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin qulfini ochish."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM kartani PIN kod bilan ochish."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM kartani PUK kod bilan ochish."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index d96a012ef19f..6a697097608b 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Biểu tượng vân tay"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"quản lý phần cứng của tính năng mở khóa bằng khuôn mặt"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Cho phép ứng dụng gọi ra các phương pháp để thêm và xóa mẫu khuôn mặt sử dụng."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"sử dụng phần cứng của tính năng mở khóa bằng khuôn mặt"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Cho phép ứng dụng dùng phần cứng mở khóa bằng khuôn mặt để tiến hành xác thực"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Mở khóa bằng khuôn mặt"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Đăng ký lại khuôn mặt của bạn"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Để cải thiện khả năng nhận dạng, hãy đăng ký lại khuôn mặt của bạn"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Thiết lập tính năng mở khóa bằng khuôn mặt"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Mở khóa điện thoại bằng cách nhìn vào điện thoại"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Thiết lập thêm những cách mở khóa khác"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Nhấn để thêm vân tay"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Không thể xác minh khuôn mặt. Phần cứng không có sẵn."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Thử lại thao tác mở khóa bằng khuôn mặt."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Không lưu được dữ liệu khuôn mặt mới. Hãy xóa dữ liệu cũ trước."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Đã hủy thao tác dùng khuôn mặt."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Người dùng đã hủy thao tác mở khóa bằng khuôn mặt."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Bạn đã thử quá nhiều lần. Hãy thử lại sau."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Quá nhiều lần thử. Đã tắt tính năng mở khóa bằng khuôn mặt."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Không thể xác minh khuôn mặt. Hãy thử lại."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Bạn chưa thiết lập tính năng mở khóa bằng khuôn mặt."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Thiết bị này không hỗ trợ tính năng mở khóa bằng khuôn mặt."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Đã tạm thời tắt cảm biến."</string> <string name="face_name_template" msgid="3877037340223318119">"Khuôn mặt <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Dùng tính năng mở khóa bằng khuôn mặt"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Dùng khuôn mặt hoặc phương thức khóa màn hình"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Hãy dùng khuôn mặt của bạn để tiếp tục"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Dùng khuôn mặt của bạn hoặc phương thức khóa màn hình để tiếp tục"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Mở rộng vùng khóa."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Mở khóa bằng cách trượt."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Mở khóa bằng hình."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Mở khóa bằng khuôn mặt."</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Mở khóa bằng mã pin."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Mở khóa bằng mã PIN của SIM."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Mở khóa bằng mã PUK của SIM."</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index ceec5f6be0c9..3bf61b2823da 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"指纹图标"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"管理人脸解锁硬件"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"允许该应用调用方法来添加和删除可用的人脸模板。"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"使用人脸解锁硬件"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"允许该应用使用人脸解锁硬件进行身份验证"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"人脸解锁"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"重新注册您的面孔"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"要提升识别精确度,请重新注册您的面孔"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"设置人脸解锁"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"脸部对准手机即可将其解锁"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"设置更多解锁方式"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"点按即可添加指纹"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"无法验证人脸。硬件无法使用。"</string> - <string name="face_error_timeout" msgid="522924647742024699">"请重新尝试人脸解锁。"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"无法存储新的人脸数据。请先删除旧的人脸数据。"</string> <string name="face_error_canceled" msgid="2164434737103802131">"面孔处理操作已取消。"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"用户已取消人脸解锁。"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"尝试次数过多,请稍后重试。"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"尝试次数过多,人脸解锁已停用。"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"无法验证人脸,请重试。"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"您尚未设置人脸解锁。"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"此设备不支持人脸解锁。"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"传感器已暂时停用。"</string> <string name="face_name_template" msgid="3877037340223318119">"面孔 <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"使用人脸解锁"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"使用人脸解锁或屏幕锁定凭据"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"使用您的面孔验证身份才能继续"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"使用人脸解锁或屏幕锁定凭据验证身份,才能继续操作"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"展开解锁区域。"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"滑动解锁。"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"图案解锁。"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"人脸解锁。"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"PIN码解锁。"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM 卡 PIN 码解锁。"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM 卡 PUK 码解锁。"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 2c6fff0c5353..c24e75d5b6dd 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"指紋圖示"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"管理臉孔解鎖硬件"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"允許應用程式調用方法,以加入和刪除可用的臉孔範本。"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"使用臉孔解鎖硬件"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"允許應用程式使用臉孔解鎖硬件來驗證"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"臉孔解鎖"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"重新註冊臉孔"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"如要提高識別能力,請重新註冊您的臉孔"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"設定臉孔解鎖功能"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"直望手機即可解鎖"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"設定更多解鎖方法"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"輕按即可新增指紋"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"無法驗證臉孔,硬件無法使用。"</string> - <string name="face_error_timeout" msgid="522924647742024699">"請再次嘗試「臉孔解鎖」。"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"無法儲存新的臉容資料,請先刪除舊資料。"</string> <string name="face_error_canceled" msgid="2164434737103802131">"臉孔操作已取消。"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"使用者已取消「臉孔解鎖」。"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"嘗試次數過多,請稍後再試。"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"嘗試次數過多,「臉孔解鎖」已停用。"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"無法驗證臉孔。請再試一次。"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"您尚未設定「臉孔解鎖」。"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"此裝置不支援「臉孔解鎖」。"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"感應器已暫時停用。"</string> <string name="face_name_template" msgid="3877037340223318119">"臉孔 <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"使用臉孔解鎖"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"使用臉孔或螢幕鎖定"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"如要繼續操作,請使用您的面孔驗證身分"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"請使用臉孔解鎖或螢幕鎖定功能驗證身分,才能繼續操作"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"展開解鎖區域。"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"滑動解鎖。"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"圖案解鎖。"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"臉孔解鎖。"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"PIN 解鎖。"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM 卡 PIN 碼解鎖。"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM 卡 PUK 解鎖。"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index c530c33220f5..70630122265a 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"指紋圖示"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"管理人臉解鎖硬體"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"允許應用程式呼叫方法來新增及移除可用的臉孔範本。"</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"使用人臉解鎖硬體"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"允許應用程式使用人臉解鎖硬體進行驗證"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"人臉解鎖"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"請重新註冊你的臉孔"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"為提升辨識精準度,請重新註冊你的臉孔"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"設定人臉解鎖功能"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"看著手機就能解鎖"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"設定更多解鎖方式"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"輕觸即可新增指紋"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"相關硬體無法使用,因此無法驗證臉孔。"</string> - <string name="face_error_timeout" msgid="522924647742024699">"請重新進行人臉解鎖。"</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"無法儲存新的臉孔資料,請先刪除舊的資料。"</string> <string name="face_error_canceled" msgid="2164434737103802131">"臉孔處理作業已取消。"</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"使用者已取消人臉解鎖作業。"</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"嘗試次數過多,請稍後再試。"</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"嘗試次數過多,因此系統已停用人臉解鎖功能。"</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"無法驗證臉孔,請再試一次。"</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"你尚未設定人臉解鎖功能。"</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"這個裝置不支援人臉解鎖功能。"</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"感應器已暫時停用。"</string> <string name="face_name_template" msgid="3877037340223318119">"臉孔 <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"使用人臉解鎖功能"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"使用人臉解鎖或螢幕鎖定功能"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"如要繼續操作,請透過你的臉孔驗證身分"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"請使用人臉解鎖或螢幕鎖定功能驗證身分,才能繼續操作"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"展開解鎖區域。"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"滑動解鎖。"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"圖案解鎖。"</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"人臉解鎖。"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"PIN 解鎖。"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"SIM 卡 PIN 碼解鎖。"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"SIM 卡 PUK 解鎖。"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index b242b7788851..8828f85ef987 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -609,14 +609,12 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Isithonjana sezigxivizo zeminwe"</string> - <string name="permlab_manageFace" msgid="4569549381889283282">"phatha izingxenyekazi zekhompyutha zokuvula ngobuso"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"Ivumela uhlelo lokusebenza ukuthi luhoxise izindlela zokungeza nokususa amathempulethi obuso azosetshenziswa."</string> - <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"sebenzisa izingxenyekazi zekhompuyutha zokuvula ngobuso"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"Ivumela i-app isebenzise izingxenyekazi zekhompyutha zokuvula ngobuso ukuze kuqinisekiswe"</string> - <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"Ukuvula ngobuso"</string> + <!-- no translation found for face_recalibrate_notification_name (7311163114750748686) --> + <skip /> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"Phinda ubhalise ubuso bakho"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"Ukuze uthuthukise ukubonwa, sicela uphinde ubhalise ubuso bakho"</string> - <string name="face_setup_notification_title" msgid="550617822603450009">"Setha ukuvula ngobuso"</string> + <!-- no translation found for face_setup_notification_title (8843461561970741790) --> + <skip /> <string name="face_setup_notification_content" msgid="5463999831057751676">"Vula ifoni yakho ngokuyibheka"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Setha izindlela eziningi zokuvula"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Thepha ukuze ungeze izigxivizo zomunwe"</string> @@ -643,18 +641,26 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Ayikwazi ukuqinisekisa ubuso. Izingxenyekazi zekhompyutha azitholakali."</string> - <string name="face_error_timeout" msgid="522924647742024699">"Zama ukuvula ngobuso futhi."</string> + <!-- no translation found for face_error_timeout (2598544068593889762) --> + <skip /> <string name="face_error_no_space" msgid="5649264057026021723">"Ayikwazi ukulondoloza idatha yobuso. Susa endala."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Umsebenzi wobuso ukhanselwe."</string> - <string name="face_error_user_canceled" msgid="8553045452825849843">"Ukuvula ngobuso kukhanselwe umsebenzisi."</string> + <!-- no translation found for face_error_user_canceled (5766472033202928373) --> + <skip /> <string name="face_error_lockout" msgid="7864408714994529437">"Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi."</string> - <string name="face_error_lockout_permanent" msgid="8277853602168960343">"Imizamo eminingi kakhulu. Ukuvula ngobuso kukhutshaziwe."</string> + <!-- no translation found for face_error_lockout_permanent (3277134834042995260) --> + <skip /> + <!-- no translation found for face_error_lockout_screen_lock (5062609811636860928) --> + <skip /> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Ayikwazi ukuqinisekisa ubuso. Zama futhi."</string> - <string name="face_error_not_enrolled" msgid="7369928733504691611">"Awukakusethi ukuvula ngobuso."</string> - <string name="face_error_hw_not_present" msgid="1070600921591729944">"Ukuvula ngobuso kusekelwe kule divayisi."</string> + <!-- no translation found for face_error_not_enrolled (1134739108536328412) --> + <skip /> + <!-- no translation found for face_error_hw_not_present (7940978724978763011) --> + <skip /> <string name="face_error_security_update_required" msgid="5076017208528750161">"Inzwa ikhutshazwe okwesikhashana."</string> <string name="face_name_template" msgid="3877037340223318119">"Ubuso be-<xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="8130135875458467243">"Sebenzisa ukuvula ngobuso"</string> + <!-- no translation found for face_app_setting_name (5854024256907828015) --> + <skip /> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Sebenzisa i-face lock noma ukukhiya isikrini"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Sebenzisa ubuso bakho ukuze uqhubeke"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Sebenzisa ubuso bakho noma ukukhiya isikrini ukuze uqhubeke"</string> @@ -957,7 +963,8 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Nwebisa indawo yokuvula."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Ukuvula ngokuslayida."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Ukuvula ngephethini."</string> - <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"Ukuvula ngobuso"</string> + <!-- no translation found for keyguard_accessibility_face_unlock (4533832120787386728) --> + <skip /> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Ukuvula ngephinikhodi."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Ukuvulwa kwephinikhodi ye-Sim."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Ukuvulwa kwe-puk ye-Sim."</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index e975938d3f7f..a5f505176d5d 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1137,6 +1137,9 @@ <!-- Darker accent color used on Material NEXT buttons. @hide --> <attr name="colorAccentPrimaryVariant" format="color" /> + <!-- Text color used on top of Material NEXT accent colors. @hide --> + <attr name="textColorOnAccent" format="color" /> + <!-- Secondary darker accent color used on Material NEXT buttons. @hide --> <attr name="colorAccentSecondaryVariant" format="color" /> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index ab53b4c2b3e2..1ddff3272b11 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -955,7 +955,7 @@ 4 - Go to voice assist 5 - Go to assistant (Settings.Secure.ASSISTANT) --> - <integer name="config_longPressOnPowerBehavior">1</integer> + <integer name="config_longPressOnPowerBehavior">5</integer> <!-- Whether the setting to change long press on power behaviour from default to assistant (5) is available in Settings. @@ -973,7 +973,7 @@ 1 - Mute toggle 2 - Global actions menu --> - <integer name="config_keyChordPowerVolumeUp">1</integer> + <integer name="config_keyChordPowerVolumeUp">2</integer> <!-- Control the behavior when the user long presses the back button. Non-zero values are only valid for watches as part of CDD/CTS. @@ -3971,6 +3971,9 @@ <!-- URI for in call notification sound --> <string translatable="false" name="config_inCallNotificationSound">/product/media/audio/ui/InCallNotification.ogg</string> + <!-- URI for default ringtone sound file to be used for silent ringer vibration --> + <string translatable="false" name="config_defaultRingtoneVibrationSound">/product/media/audio/ui/AttentionalHaptics.ogg</string> + <!-- Default number of notifications from the same app before they are automatically grouped by the OS --> <integer translatable="false" name="config_autoGroupAtCount">4</integer> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 552898bff1ed..ef5cfe33c661 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -3236,6 +3236,8 @@ <public name="config_systemCompanionDeviceProvider"/> <!-- @hide @SystemApi --> <public name="config_systemUi" /> + <!-- @hide For use by platform and tools only. Developers should not specify this value. --> + <public name="config_defaultRingtoneVibrationSound"/> </staging-public-group> <staging-public-group type="id" first-id="0x01020055"> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 52892431fc8e..b33a2819b55d 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1594,7 +1594,7 @@ <!-- Message shown during fingerprint acquisision when the fingerprint sensor needs cleaning --> <string name="fingerprint_acquired_imager_dirty">Clean the sensor</string> <!-- Message shown during fingerprint acquisision when the user removes their finger from the sensor too quickly --> - <string name="fingerprint_acquired_too_fast">Finger moved too fast</string> + <string name="fingerprint_acquired_too_fast">Hold a little longer</string> <!-- Message shown during fingerprint acquisision when the user moves their finger too slowly --> <string name="fingerprint_acquired_too_slow">Finger moved too slow. Please try again.</string> <!-- Message shown during fingerprint acquisition when the fingerprint was already enrolled.[CHAR LIMIT=50] --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index d86c6e727048..4da5859fa49b 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4274,6 +4274,7 @@ <java-symbol type="attr" name="colorSurfaceHighlight" format="color" /> <java-symbol type="attr" name="colorSurfaceVariant" format="color" /> <java-symbol type="attr" name="colorSurfaceHeader" format="color" /> + <java-symbol type="attr" name="textColorOnAccent" format="color" /> <!-- CEC Configuration --> <java-symbol type="bool" name="config_cecHdmiCecEnabled_userConfigurable" /> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 41bedb2ed43c..97acd5b9bf1e 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -232,6 +232,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> </style> @@ -260,6 +261,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -305,6 +307,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -352,6 +355,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -398,6 +402,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -459,6 +464,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -497,6 +503,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -541,6 +548,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -586,6 +594,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -647,6 +656,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -693,6 +703,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -737,6 +748,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -783,6 +795,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -828,6 +841,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -873,6 +887,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -918,6 +933,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -963,6 +979,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1012,6 +1029,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -1058,6 +1076,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -1101,6 +1120,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -1298,6 +1318,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> <item name="colorPopupBackground">?attr/colorBackgroundFloating</item> @@ -1327,6 +1348,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1371,6 +1393,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1416,6 +1439,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1463,6 +1487,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1509,6 +1534,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1572,6 +1598,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1609,6 +1636,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1656,6 +1684,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1704,6 +1733,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1751,6 +1781,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> </style> @@ -1780,6 +1811,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> </style> @@ -1810,6 +1842,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1859,6 +1892,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1906,6 +1940,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1952,6 +1987,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -1997,6 +2033,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -2042,6 +2079,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -2085,6 +2123,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -2246,6 +2285,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_dark</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_dark</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_dark</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_dark</item> <item name="colorForegroundInverse">@color/foreground_device_default_light</item> @@ -2290,6 +2330,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -2344,6 +2385,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> @@ -2391,6 +2433,7 @@ easier. <item name="textColorPrimary">@color/text_color_primary_device_default_light</item> <item name="textColorSecondary">@color/text_color_secondary_device_default_light</item> <item name="textColorTertiary">@color/text_color_tertiary_device_default_light</item> + <item name="textColorOnAccent">@color/text_color_on_accent_device_default</item> <item name="colorForeground">@color/foreground_device_default_light</item> <item name="colorForegroundInverse">@color/foreground_device_default_dark</item> diff --git a/core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java b/core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java index bee0a0bf1fd6..333eebb86d4c 100644 --- a/core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java +++ b/core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java @@ -48,9 +48,8 @@ public class BatteryUsageStatsPulledTest { @Test public void testGetStatsProto() { - final long sessionEndTimestampMs = 1050; final BatteryUsageStats bus = buildBatteryUsageStats(); - final byte[] bytes = bus.getStatsProto(sessionEndTimestampMs); + final byte[] bytes = bus.getStatsProto(); BatteryUsageStatsAtomsProto proto; try { proto = BatteryUsageStatsAtomsProto.parseFrom(bytes); @@ -60,9 +59,9 @@ public class BatteryUsageStatsPulledTest { } assertEquals(bus.getStatsStartTimestamp(), proto.sessionStartMillis); - assertEquals(sessionEndTimestampMs, proto.sessionEndMillis); + assertEquals(bus.getStatsEndTimestamp(), proto.sessionEndMillis); assertEquals( - sessionEndTimestampMs - bus.getStatsStartTimestamp(), + bus.getStatsEndTimestamp() - bus.getStatsStartTimestamp(), proto.sessionDurationMillis); assertEquals(bus.getDischargePercentage(), proto.sessionDischargePercentage); diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp index 415b1f27b5bb..93e4a294a2cb 100644 --- a/core/tests/coretests/Android.bp +++ b/core/tests/coretests/Android.bp @@ -41,6 +41,7 @@ android_test { "frameworks-core-util-lib", "mockwebserver", "guava", + "androidx.core_core", "androidx.test.espresso.core", "androidx.test.ext.junit", "androidx.test.runner", diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml index 520d2f1e7371..14a3a01630ab 100644 --- a/core/tests/coretests/AndroidManifest.xml +++ b/core/tests/coretests/AndroidManifest.xml @@ -156,6 +156,9 @@ <!-- Allow use of PendingIntent.getIntent() --> <uses-permission android:name="android.permission.GET_INTENT_SENDER_INTENT" /> + <!-- ChooserActivityTest permissions--> + <uses-permission android:name="android.permission.SET_CLIP_SOURCE" /> + <application android:theme="@style/Theme" android:supportsRtl="true"> <uses-library android:name="android.test.runner" /> <uses-library android:name="org.apache.http.legacy" android:required="false" /> diff --git a/core/tests/coretests/src/android/app/NotificationTest.java b/core/tests/coretests/src/android/app/NotificationTest.java index 0f8c9e2de826..cd07d464ee65 100644 --- a/core/tests/coretests/src/android/app/NotificationTest.java +++ b/core/tests/coretests/src/android/app/NotificationTest.java @@ -16,6 +16,14 @@ package android.app; +import static androidx.core.graphics.ColorUtils.calculateContrast; + +import static com.android.compatibility.common.util.SystemUtil.runShellCommand; + +import static com.google.common.truth.Truth.assertThat; + +import static junit.framework.Assert.fail; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; @@ -27,10 +35,10 @@ import android.annotation.Nullable; import android.content.Context; import android.content.Intent; import android.content.LocusId; +import android.content.res.Configuration; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.drawable.Icon; -import android.media.session.MediaSession; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; @@ -325,13 +333,142 @@ public class NotificationTest { assertNull(clone.getLocusId()); } - private Notification.Builder getMediaNotification() { - MediaSession session = new MediaSession(mContext, "test"); - return new Notification.Builder(mContext, "color") - .setSmallIcon(com.android.internal.R.drawable.emergency_icon) - .setContentTitle("Title") - .setContentText("Text") - .setStyle(new Notification.MediaStyle().setMediaSession(session.getSessionToken())); + @Test + public void testColors_ensureColors_dayMode_producesValidPalette() { + Notification.Colors c = new Notification.Colors(); + boolean colorized = false; + boolean nightMode = false; + resolveColorsInNightMode(nightMode, c, Color.BLUE, colorized); + assertValid(c); + } + + @Test + public void testColors_ensureColors_nightMode_producesValidPalette() { + Notification.Colors c = new Notification.Colors(); + boolean colorized = false; + boolean nightMode = true; + resolveColorsInNightMode(nightMode, c, Color.BLUE, colorized); + assertValid(c); + } + + @Test + public void testColors_ensureColors_colorized_producesValidPalette_default() { + validateColorizedPaletteForColor(Notification.COLOR_DEFAULT); + } + + @Test + public void testColors_ensureColors_colorized_producesValidPalette_blue() { + validateColorizedPaletteForColor(Color.BLUE); + } + + @Test + public void testColors_ensureColors_colorized_producesValidPalette_red() { + validateColorizedPaletteForColor(Color.RED); + } + + @Test + public void testColors_ensureColors_colorized_producesValidPalette_white() { + validateColorizedPaletteForColor(Color.WHITE); + } + + @Test + public void testColors_ensureColors_colorized_producesValidPalette_black() { + validateColorizedPaletteForColor(Color.BLACK); + } + + public void validateColorizedPaletteForColor(int rawColor) { + Notification.Colors cDay = new Notification.Colors(); + Notification.Colors cNight = new Notification.Colors(); + boolean colorized = true; + + resolveColorsInNightMode(false, cDay, rawColor, colorized); + resolveColorsInNightMode(true, cNight, rawColor, colorized); + + if (rawColor != Notification.COLOR_DEFAULT) { + assertEquals(rawColor, cDay.getBackgroundColor()); + assertEquals(rawColor, cNight.getBackgroundColor()); + } + + assertValid(cDay); + assertValid(cNight); + + if (rawColor != Notification.COLOR_DEFAULT) { + // When a color is provided, night mode should have no effect on the notification + assertEquals(cDay.getBackgroundColor(), cNight.getBackgroundColor()); + assertEquals(cDay.getPrimaryTextColor(), cNight.getPrimaryTextColor()); + assertEquals(cDay.getSecondaryTextColor(), cNight.getSecondaryTextColor()); + assertEquals(cDay.getPrimaryAccentColor(), cNight.getPrimaryAccentColor()); + assertEquals(cDay.getSecondaryAccentColor(), cNight.getSecondaryAccentColor()); + assertEquals(cDay.getProtectionColor(), cNight.getProtectionColor()); + assertEquals(cDay.getContrastColor(), cNight.getContrastColor()); + assertEquals(cDay.getRippleAlpha(), cNight.getRippleAlpha()); + } + } + + private void assertValid(Notification.Colors c) { + // Assert that all colors are populated + assertThat(c.getBackgroundColor()).isNotEqualTo(Notification.COLOR_INVALID); + assertThat(c.getProtectionColor()).isNotEqualTo(Notification.COLOR_INVALID); + assertThat(c.getPrimaryTextColor()).isNotEqualTo(Notification.COLOR_INVALID); + assertThat(c.getSecondaryTextColor()).isNotEqualTo(Notification.COLOR_INVALID); + assertThat(c.getPrimaryAccentColor()).isNotEqualTo(Notification.COLOR_INVALID); + assertThat(c.getSecondaryAccentColor()).isNotEqualTo(Notification.COLOR_INVALID); + assertThat(c.getErrorColor()).isNotEqualTo(Notification.COLOR_INVALID); + assertThat(c.getContrastColor()).isNotEqualTo(Notification.COLOR_INVALID); + assertThat(c.getRippleAlpha()).isAtLeast(0x00); + assertThat(c.getRippleAlpha()).isAtMost(0xff); + + // Assert that various colors have sufficient contrast + assertContrastIsAtLeast(c.getPrimaryTextColor(), c.getBackgroundColor(), 4.5); + assertContrastIsAtLeast(c.getSecondaryTextColor(), c.getBackgroundColor(), 4.5); + assertContrastIsAtLeast(c.getPrimaryAccentColor(), c.getBackgroundColor(), 4.5); + assertContrastIsAtLeast(c.getErrorColor(), c.getBackgroundColor(), 4.5); + assertContrastIsAtLeast(c.getContrastColor(), c.getBackgroundColor(), 4.5); + + // This accent color is only used for emphasized buttons + assertContrastIsAtLeast(c.getSecondaryAccentColor(), c.getBackgroundColor(), 1); + } + + private void assertContrastIsAtLeast(int foreground, int background, double minContrast) { + try { + assertThat(calculateContrast(foreground, background)).isAtLeast(minContrast); + } catch (AssertionError e) { + throw new AssertionError( + String.format("Insufficient contrast: foreground=#%08x background=#%08x", + foreground, background), e); + } + } + + private void resolveColorsInNightMode(boolean nightMode, Notification.Colors c, int rawColor, + boolean colorized) { + runInNightMode(nightMode, + () -> c.resolvePalette(mContext, rawColor, colorized, nightMode)); + } + + private void runInNightMode(boolean nightMode, Runnable task) { + final String initialNightMode = changeNightMode(nightMode); + try { + Configuration currentConfig = mContext.getResources().getConfiguration(); + boolean isNightMode = (currentConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK) + == Configuration.UI_MODE_NIGHT_YES; + assertEquals(nightMode, isNightMode); + task.run(); + } finally { + runShellCommand("cmd uimode night " + initialNightMode); + } + } + + + // Change the night mode and return the previous mode + private String changeNightMode(boolean nightMode) { + final String nightModeText = runShellCommand("cmd uimode night"); + final String[] nightModeSplit = nightModeText.split(":"); + if (nightModeSplit.length != 2) { + fail("Failed to get initial night mode value from " + nightModeText); + } + String previousMode = nightModeSplit[1].trim(); + runShellCommand("cmd uimode night " + (nightMode ? "yes" : "no")); + return previousMode; } /** diff --git a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java index 613232fe1dfa..8fd1af801094 100644 --- a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java +++ b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java @@ -110,7 +110,7 @@ public class InsetsAnimationControlImplTest { mController = new InsetsAnimationControlImpl(controls, new Rect(0, 0, 500, 500), mInsetsState, mMockListener, systemBars(), mMockController, 10 /* durationMs */, new LinearInterpolator(), - 0 /* animationType */, null /* translator */); + 0 /* animationType */, 0 /* layoutInsetsDuringAnimation */, null /* translator */); mController.mReadyDispatched = true; } diff --git a/core/tests/coretests/src/android/view/TunnelModeEnabledListenerTest.java b/core/tests/coretests/src/android/view/TunnelModeEnabledListenerTest.java new file mode 100644 index 000000000000..65dd34f723c3 --- /dev/null +++ b/core/tests/coretests/src/android/view/TunnelModeEnabledListenerTest.java @@ -0,0 +1,84 @@ +/* + * Copyright 2021 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.view; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import android.platform.test.annotations.Presubmit; + +import androidx.test.filters.MediumTest; +import androidx.test.runner.AndroidJUnit4; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@MediumTest +@Presubmit +public class TunnelModeEnabledListenerTest { + private TestableTunnelModeEnabledListener mListener; + + @Before + public void init() { + mListener = new TestableTunnelModeEnabledListener(); + } + + @Test + public void testRegisterUnregister() { + TunnelModeEnabledListener.register(mListener); + TunnelModeEnabledListener.unregister(mListener); + } + + @Test + public void testDispatchUpdatesListener() { + TunnelModeEnabledListener.dispatchOnTunnelModeEnabledChanged(mListener, true); + assertEquals(true, mListener.mTunnelModeEnabled.get()); + TunnelModeEnabledListener.dispatchOnTunnelModeEnabledChanged(mListener, false); + assertEquals(false, mListener.mTunnelModeEnabled.get()); + } + + @Test + public void testRegisterUpdatesListener() throws Exception { + TunnelModeEnabledListener.register(mListener); + TimeUnit.SECONDS.sleep(1); + assertTrue(mListener.mTunnelModeEnabledUpdated.get()); + TunnelModeEnabledListener.unregister(mListener); + } + + private static class TestableTunnelModeEnabledListener extends TunnelModeEnabledListener { + AtomicBoolean mTunnelModeEnabled; + AtomicBoolean mTunnelModeEnabledUpdated; + + TestableTunnelModeEnabledListener() { + super(Runnable::run); + mTunnelModeEnabled = new AtomicBoolean(false); + mTunnelModeEnabledUpdated = new AtomicBoolean(); + } + + @Override + public void onTunnelModeEnabledChanged(boolean tunnelModeEnabled) { + mTunnelModeEnabled.set(tunnelModeEnabled); + mTunnelModeEnabledUpdated.set(true); + } + } + +} diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java index 1633d2897fcb..19c27639a00d 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java @@ -16,6 +16,8 @@ package com.android.internal.app; +import static android.app.Activity.RESULT_OK; + import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.action.ViewActions.swipeUp; @@ -558,6 +560,8 @@ public class ChooserActivityTest { ClipDescription clipDescription = clipData.getDescription(); assertThat("text/plain", is(clipDescription.getMimeType(0))); + + assertEquals(mActivityRule.getActivityResult().getResultCode(), RESULT_OK); } @Test diff --git a/core/tests/coretests/src/com/android/internal/os/SystemServicePowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/SystemServicePowerCalculatorTest.java index cd45060b7cc4..a36d9fe94b46 100644 --- a/core/tests/coretests/src/com/android/internal/os/SystemServicePowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/SystemServicePowerCalculatorTest.java @@ -18,25 +18,28 @@ package com.android.internal.os; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.os.BatteryConsumer; -import android.os.BatteryStats; -import android.os.BatteryUsageStatsQuery; import android.os.Binder; import android.os.Process; -import android.os.UidBatteryConsumer; -import androidx.annotation.Nullable; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import com.android.internal.power.MeasuredEnergyStats; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import java.io.IOException; import java.util.ArrayList; @@ -47,6 +50,8 @@ import java.util.Collection; public class SystemServicePowerCalculatorTest { private static final double PRECISION = 0.000001; + private static final int APP_UID1 = 100; + private static final int APP_UID2 = 200; @Rule public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule() @@ -61,73 +66,52 @@ public class SystemServicePowerCalculatorTest { .setAveragePowerForCpuCore(1, 0, 500) .setAveragePowerForCpuCore(1, 1, 600); + @Mock private BatteryStatsImpl.UserInfoProvider mMockUserInfoProvider; + @Mock + private KernelCpuUidTimeReader.KernelCpuUidClusterTimeReader mMockKernelCpuUidClusterTimeReader; + @Mock + private KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader mMockCpuUidFreqTimeReader; + @Mock + private KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader mMockKernelCpuUidUserSysTimeReader; + @Mock + private KernelCpuUidTimeReader.KernelCpuUidActiveTimeReader mMockKerneCpuUidActiveTimeReader; + @Mock + private SystemServerCpuThreadReader mMockSystemServerCpuThreadReader; + + private final KernelCpuSpeedReader[] mMockKernelCpuSpeedReaders = new KernelCpuSpeedReader[]{ + mock(KernelCpuSpeedReader.class), + mock(KernelCpuSpeedReader.class), + }; + private MockBatteryStatsImpl mMockBatteryStats; - private MockKernelCpuUidFreqTimeReader mMockCpuUidFreqTimeReader; - private MockSystemServerCpuThreadReader mMockSystemServerCpuThreadReader; @Before public void setUp() throws IOException { - mMockUserInfoProvider = mock(BatteryStatsImpl.UserInfoProvider.class); - mMockSystemServerCpuThreadReader = new MockSystemServerCpuThreadReader(); - mMockCpuUidFreqTimeReader = new MockKernelCpuUidFreqTimeReader(); + MockitoAnnotations.initMocks(this); mMockBatteryStats = mStatsRule.getBatteryStats() - .setSystemServerCpuThreadReader(mMockSystemServerCpuThreadReader) + .setUserInfoProvider(mMockUserInfoProvider) + .setKernelCpuSpeedReaders(mMockKernelCpuSpeedReaders) .setKernelCpuUidFreqTimeReader(mMockCpuUidFreqTimeReader) - .setUserInfoProvider(mMockUserInfoProvider); + .setKernelCpuUidClusterTimeReader(mMockKernelCpuUidClusterTimeReader) + .setKernelCpuUidUserSysTimeReader(mMockKernelCpuUidUserSysTimeReader) + .setKernelCpuUidActiveTimeReader(mMockKerneCpuUidActiveTimeReader) + .setSystemServerCpuThreadReader(mMockSystemServerCpuThreadReader); } @Test public void testPowerProfileBasedModel() { - when(mMockUserInfoProvider.exists(anyInt())).thenReturn(true); - - // Test Power Profile has two CPU clusters with 2 speeds each, thus 4 freq times total - mMockSystemServerCpuThreadReader.setCpuTimes( - new long[] {30000, 40000, 50000, 60000}, - new long[] {20000, 30000, 40000, 50000}); - - mMockCpuUidFreqTimeReader.setSystemServerCpuTimes( - new long[] {10000, 20000, 30000, 40000} - ); - - mMockBatteryStats.readKernelUidCpuFreqTimesLocked(null, true, false, null); - - int workSourceUid1 = 100; - int workSourceUid2 = 200; - int transactionCode = 42; - - Collection<BinderCallsStats.CallStat> callStats = new ArrayList<>(); - BinderCallsStats.CallStat stat1 = new BinderCallsStats.CallStat(workSourceUid1, - Binder.class, transactionCode, true /*screenInteractive */); - stat1.incrementalCallCount = 100; - stat1.recordedCallCount = 100; - stat1.cpuTimeMicros = 1000000; - callStats.add(stat1); - - mMockBatteryStats.noteBinderCallStats(workSourceUid1, 100, callStats); - - callStats.clear(); - BinderCallsStats.CallStat stat2 = new BinderCallsStats.CallStat(workSourceUid2, - Binder.class, transactionCode, true /*screenInteractive */); - stat2.incrementalCallCount = 100; - stat2.recordedCallCount = 100; - stat2.cpuTimeMicros = 9000000; - callStats.add(stat2); - - mMockBatteryStats.noteBinderCallStats(workSourceUid2, 100, callStats); - - mMockBatteryStats.updateSystemServiceCallStats(); - mMockBatteryStats.updateSystemServerThreadStats(); + prepareBatteryStats(null); SystemServicePowerCalculator calculator = new SystemServicePowerCalculator( mStatsRule.getPowerProfile()); - mStatsRule.apply(new FakeCpuPowerCalculator(), calculator); + mStatsRule.apply(new CpuPowerCalculator(mStatsRule.getPowerProfile()), calculator); - assertThat(mStatsRule.getUidBatteryConsumer(workSourceUid1) + assertThat(mStatsRule.getUidBatteryConsumer(APP_UID1) .getConsumedPower(BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES)) .isWithin(PRECISION).of(1.888888); - assertThat(mStatsRule.getUidBatteryConsumer(workSourceUid2) + assertThat(mStatsRule.getUidBatteryConsumer(APP_UID2) .getConsumedPower(BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES)) .isWithin(PRECISION).of(17.0); assertThat(mStatsRule.getUidBatteryConsumer(Process.SYSTEM_UID) @@ -141,58 +125,105 @@ public class SystemServicePowerCalculatorTest { .isWithin(PRECISION).of(18.888888); } - private static class MockKernelCpuUidFreqTimeReader extends - KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader { - private long[] mSystemServerCpuTimes; - - MockKernelCpuUidFreqTimeReader() { - super(/*throttle */false); - } - - void setSystemServerCpuTimes(long[] systemServerCpuTimes) { - mSystemServerCpuTimes = systemServerCpuTimes; - } - - @Override - public boolean perClusterTimesAvailable() { - return true; - } - - @Override - public void readDelta(boolean forcedRead, @Nullable Callback<long[]> cb) { - if (cb != null) { - cb.onUidCpuTime(Process.SYSTEM_UID, mSystemServerCpuTimes); - } - } - } + @Test + public void testMeasuredEnergyBasedModel() { + final boolean[] supportedPowerBuckets = + new boolean[MeasuredEnergyStats.NUMBER_STANDARD_POWER_BUCKETS]; + supportedPowerBuckets[MeasuredEnergyStats.POWER_BUCKET_CPU] = true; + mStatsRule.getBatteryStats() + .initMeasuredEnergyStatsLocked(supportedPowerBuckets, new String[0]); - private static class MockSystemServerCpuThreadReader extends SystemServerCpuThreadReader { - private final SystemServiceCpuThreadTimes mThreadTimes = new SystemServiceCpuThreadTimes(); + prepareBatteryStats(new long[]{50000000, 100000000}); - MockSystemServerCpuThreadReader() { - super(null); - } + SystemServicePowerCalculator calculator = new SystemServicePowerCalculator( + mStatsRule.getPowerProfile()); - public void setCpuTimes(long[] threadCpuTimesUs, long[] binderThreadCpuTimesUs) { - mThreadTimes.threadCpuTimesUs = threadCpuTimesUs; - mThreadTimes.binderThreadCpuTimesUs = binderThreadCpuTimesUs; - } + mStatsRule.apply(new CpuPowerCalculator(mStatsRule.getPowerProfile()), calculator); - @Override - public SystemServiceCpuThreadTimes readDelta() { - return mThreadTimes; - } + assertThat(mStatsRule.getUidBatteryConsumer(APP_UID1) + .getConsumedPower(BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES)) + .isWithin(PRECISION).of(1.979351); + assertThat(mStatsRule.getUidBatteryConsumer(APP_UID2) + .getConsumedPower(BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES)) + .isWithin(PRECISION).of(17.814165); + assertThat(mStatsRule.getUidBatteryConsumer(Process.SYSTEM_UID) + .getConsumedPower(BatteryConsumer.POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS)) + .isWithin(PRECISION).of(-19.793517); + assertThat(mStatsRule.getDeviceBatteryConsumer() + .getConsumedPower(BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES)) + .isWithin(PRECISION).of(19.793517); + assertThat(mStatsRule.getAppsBatteryConsumer() + .getConsumedPower(BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES)) + .isWithin(PRECISION).of(19.793517); } - private static class FakeCpuPowerCalculator extends PowerCalculator { - @Override - protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, - long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { - if (u.getUid() == Process.SYSTEM_UID) { - // SystemServer must be attributed at least as much power as the total - // of all system services requested by apps. - app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 1000000); - } - } + private void prepareBatteryStats(long[] clusterChargesUc) { + when(mMockUserInfoProvider.exists(anyInt())).thenReturn(true); + + when(mMockKernelCpuSpeedReaders[0].readDelta()).thenReturn(new long[]{1000, 2000}); + when(mMockKernelCpuSpeedReaders[1].readDelta()).thenReturn(new long[]{3000, 4000}); + + when(mMockCpuUidFreqTimeReader.perClusterTimesAvailable()).thenReturn(false); + + // User/System CPU time in microseconds + doAnswer(invocation -> { + final KernelCpuUidTimeReader.Callback<long[]> callback = invocation.getArgument(1); + callback.onUidCpuTime(APP_UID1, new long[]{1_000_000, 2_000_000}); + callback.onUidCpuTime(APP_UID2, new long[]{3_000_000, 4_000_000}); + callback.onUidCpuTime(Process.SYSTEM_UID, new long[]{60_000_000, 80_000_000}); + return null; + }).when(mMockKernelCpuUidUserSysTimeReader).readDelta(anyBoolean(), any()); + + // Active CPU time in milliseconds + doAnswer(invocation -> { + final KernelCpuUidTimeReader.Callback<Long> callback = invocation.getArgument(1); + callback.onUidCpuTime(APP_UID1, 1111L); + callback.onUidCpuTime(APP_UID2, 3333L); + callback.onUidCpuTime(Process.SYSTEM_UID, 10000L); + return null; + }).when(mMockKerneCpuUidActiveTimeReader).readDelta(anyBoolean(), any()); + + // Per-cluster CPU time in milliseconds + doAnswer(invocation -> { + final KernelCpuUidTimeReader.Callback<long[]> callback = invocation.getArgument(1); + callback.onUidCpuTime(APP_UID1, new long[]{1111, 2222}); + callback.onUidCpuTime(APP_UID2, new long[]{3333, 4444}); + callback.onUidCpuTime(Process.SYSTEM_UID, new long[]{50_000, 80_000}); + return null; + }).when(mMockKernelCpuUidClusterTimeReader).readDelta(anyBoolean(), any()); + + // System service CPU time + final SystemServerCpuThreadReader.SystemServiceCpuThreadTimes threadTimes = + new SystemServerCpuThreadReader.SystemServiceCpuThreadTimes(); + threadTimes.binderThreadCpuTimesUs = + new long[]{20_000_000, 30_000_000, 40_000_000, 50_000_000}; + + when(mMockSystemServerCpuThreadReader.readDelta()).thenReturn(threadTimes); + + int transactionCode = 42; + + Collection<BinderCallsStats.CallStat> callStats = new ArrayList<>(); + BinderCallsStats.CallStat stat1 = new BinderCallsStats.CallStat(APP_UID1, + Binder.class, transactionCode, true /*screenInteractive */); + stat1.incrementalCallCount = 100; + stat1.recordedCallCount = 100; + stat1.cpuTimeMicros = 1_000_000; + callStats.add(stat1); + + mMockBatteryStats.noteBinderCallStats(APP_UID1, 100, callStats); + + callStats.clear(); + BinderCallsStats.CallStat stat2 = new BinderCallsStats.CallStat(APP_UID2, + Binder.class, transactionCode, true /*screenInteractive */); + stat2.incrementalCallCount = 100; + stat2.recordedCallCount = 100; + stat2.cpuTimeMicros = 9_000_000; + callStats.add(stat2); + + mMockBatteryStats.noteBinderCallStats(APP_UID2, 100, callStats); + + mMockBatteryStats.updateCpuTimeLocked(true, true, clusterChargesUc); + + mMockBatteryStats.prepareForDumpLocked(); } } diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 19332c73a9c1..8d4739dbc255 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -473,6 +473,7 @@ applications that come with the platform <permission name="android.permission.UPDATE_FONTS" /> <!-- Permission required for hotword detection service CTS tests --> <permission name="android.permission.MANAGE_HOTWORD_DETECTION" /> + <permission name="android.permission.BIND_HOTWORD_DETECTION_SERVICE" /> <permission name="android.permission.MANAGE_APP_HIBERNATION"/> <!-- Permission required for CTS test - ResourceObserverNativeTest --> <permission name="android.permission.REGISTER_MEDIA_RESOURCE_OBSERVER" /> diff --git a/framework-jarjar-rules.txt b/framework-jarjar-rules.txt index 52ee63a15a63..be21f4e87101 100644 --- a/framework-jarjar-rules.txt +++ b/framework-jarjar-rules.txt @@ -1,3 +1,7 @@ +# This rule is meant to be reused across libraries in the bootclasspath that depend +# on the HIDL libraries. rule android.hidl.** android.internal.hidl.@1 + +# Framework-specific renames. rule android.net.wifi.WifiAnnotations* android.internal.wifi.WifiAnnotations@1 rule com.android.server.vcn.util.** com.android.server.vcn.repackaged.util.@1 diff --git a/graphics/java/android/graphics/drawable/RippleAnimationSession.java b/graphics/java/android/graphics/drawable/RippleAnimationSession.java index ee867ddd5915..55fb83c81961 100644 --- a/graphics/java/android/graphics/drawable/RippleAnimationSession.java +++ b/graphics/java/android/graphics/drawable/RippleAnimationSession.java @@ -40,9 +40,9 @@ import java.util.function.Consumer; public final class RippleAnimationSession { private static final String TAG = "RippleAnimationSession"; private static final int ENTER_ANIM_DURATION = 450; - private static final int EXIT_ANIM_DURATION = 225; + private static final int EXIT_ANIM_DURATION = 375; private static final long NOISE_ANIMATION_DURATION = 7000; - private static final long MAX_NOISE_PHASE = NOISE_ANIMATION_DURATION / 120; + private static final long MAX_NOISE_PHASE = NOISE_ANIMATION_DURATION / 214; private static final TimeInterpolator LINEAR_INTERPOLATOR = new LinearInterpolator(); private static final Interpolator FAST_OUT_SLOW_IN = new PathInterpolator(0.4f, 0f, 0.2f, 1f); @@ -61,12 +61,12 @@ public final class RippleAnimationSession { } @NonNull RippleAnimationSession enter(Canvas canvas) { + mStartTime = AnimationUtils.currentAnimationTimeMillis(); if (isHwAccelerated(canvas)) { enterHardware((RecordingCanvas) canvas); } else { enterSoftware(); } - mStartTime = AnimationUtils.currentAnimationTimeMillis(); return this; } @@ -160,7 +160,8 @@ public final class RippleAnimationSession { RenderNodeAnimator expand = new RenderNodeAnimator(props.getProgress(), .5f); expand.setTarget(canvas); - RenderNodeAnimator loop = new RenderNodeAnimator(props.getNoisePhase(), MAX_NOISE_PHASE); + RenderNodeAnimator loop = new RenderNodeAnimator(props.getNoisePhase(), + mStartTime + MAX_NOISE_PHASE); loop.setTarget(canvas); startAnimation(expand, loop); } @@ -190,7 +191,7 @@ public final class RippleAnimationSession { notifyUpdate(); mProperties.getShader().setProgress((float) expand.getAnimatedValue()); }); - ValueAnimator loop = ValueAnimator.ofFloat(0f, MAX_NOISE_PHASE); + ValueAnimator loop = ValueAnimator.ofFloat(mStartTime, mStartTime + MAX_NOISE_PHASE); loop.addUpdateListener(updatedAnimation -> { notifyUpdate(); mProperties.getShader().setNoisePhase((float) loop.getAnimatedValue()); diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index 518fceb60049..7ad46a161283 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -50,6 +50,7 @@ import android.graphics.Rect; import android.graphics.Shader; import android.os.Build; import android.util.AttributeSet; +import android.view.animation.AnimationUtils; import android.view.animation.LinearInterpolator; import com.android.internal.R; @@ -151,7 +152,7 @@ public class RippleDrawable extends LayerDrawable { /** The maximum number of ripples supported. */ private static final int MAX_RIPPLES = 10; private static final LinearInterpolator LINEAR_INTERPOLATOR = new LinearInterpolator(); - private static final int DEFAULT_EFFECT_COLOR = 0x80ffffff; + private static final int DEFAULT_EFFECT_COLOR = 0x8dffffff; /** Temporary flag for teamfood. **/ private static final boolean FORCE_PATTERNED_STYLE = true; @@ -970,15 +971,16 @@ public class RippleDrawable extends LayerDrawable { ? mState.mColor.getColorForState(getState(), Color.BLACK) : mMaskColorFilter.getColor()); final int effectColor = mState.mEffectColor.getColorForState(getState(), Color.MAGENTA); + final float noisePhase = AnimationUtils.currentAnimationTimeMillis(); shader.setColor(color, effectColor); shader.setOrigin(cx, cy); shader.setTouch(x, y); - shader.setResolution(w, h, mState.mDensity); - shader.setNoisePhase(0); + shader.setResolution(w, h); + shader.setNoisePhase(noisePhase); shader.setRadius(radius); shader.setProgress(.0f); properties = new RippleAnimationSession.AnimationProperties<>( - cx, cy, radius, 0f, p, 0f, color, shader); + cx, cy, radius, noisePhase, p, 0f, color, shader); if (mMaskShader == null) { shader.setShader(null); } else { @@ -1191,6 +1193,9 @@ public class RippleDrawable extends LayerDrawable { mRipplePaint = new Paint(); mRipplePaint.setAntiAlias(true); mRipplePaint.setStyle(Paint.Style.FILL); + if (mState.mRippleStyle == STYLE_PATTERNED) { + mRipplePaint.setDither(true); + } } final float x = mHotspotBounds.exactCenterX(); diff --git a/graphics/java/android/graphics/drawable/RippleShader.java b/graphics/java/android/graphics/drawable/RippleShader.java index e5651e0758fd..57b322334867 100644 --- a/graphics/java/android/graphics/drawable/RippleShader.java +++ b/graphics/java/android/graphics/drawable/RippleShader.java @@ -20,7 +20,6 @@ import android.annotation.ColorInt; import android.graphics.Color; import android.graphics.RuntimeShader; import android.graphics.Shader; -import android.util.DisplayMetrics; final class RippleShader extends RuntimeShader { private static final String SHADER_UNIFORMS = "uniform vec2 in_origin;\n" @@ -58,7 +57,7 @@ final class RippleShader extends RuntimeShader { + " float s = 0.0;\n" + " for (float i = 0; i < 4; i += 1) {\n" + " float l = i * 0.1;\n" - + " float h = l + 0.025;\n" + + " float h = l + 0.05;\n" + " float o = sin(PI * (t + 0.35 * i));\n" + " s += threshold(n + o, l, h);\n" + " }\n" @@ -70,7 +69,7 @@ final class RippleShader extends RuntimeShader { + " return 1. - smoothstep(1. - blurHalf, 1. + blurHalf, d / radius);\n" + "}\n" + "float softRing(vec2 uv, vec2 xy, float radius, float progress, float blur) {\n" - + " float thickness = 0.3 * radius;\n" + + " float thickness = 0.05 * radius;\n" + " float currentRadius = radius * progress;\n" + " float circle_outer = softCircle(uv, xy, currentRadius + thickness, blur);\n" + " float circle_inner = softCircle(uv, xy, max(currentRadius - thickness, 0.), " @@ -93,7 +92,7 @@ final class RippleShader extends RuntimeShader { + " return softCircle(coord, vec2(normal_radius), radius, radius * 50.0);\n" + "}\n" + "float turbulence(vec2 uv, float t) {\n" - + " const vec2 scale = vec2(1.5);\n" + + " const vec2 scale = vec2(0.8);\n" + " uv = uv * scale;\n" + " float g1 = circle_grid(scale, uv, t, in_tCircle1, in_tRotation1, 0.17);\n" + " float g2 = circle_grid(scale, uv, t, in_tCircle2, in_tRotation2, 0.2);\n" @@ -102,12 +101,12 @@ final class RippleShader extends RuntimeShader { + " return saturate(0.45 + 0.8 * v);\n" + "}\n"; private static final String SHADER_MAIN = "vec4 main(vec2 p) {\n" - + " float fadeIn = subProgress(0., 0.1, in_progress);\n" - + " float scaleIn = subProgress(0., 0.45, in_progress);\n" - + " float fadeOutNoise = subProgress(0.5, 0.95, in_progress);\n" - + " float fadeOutRipple = subProgress(0.5, 1., in_progress);\n" - + " vec2 center = mix(in_touch, in_origin, scaleIn);\n" - + " float ring = softRing(p, center, in_maxRadius, scaleIn, 0.45);\n" + + " float fadeIn = subProgress(0., 0.13, in_progress);\n" + + " float scaleIn = subProgress(0., 1.0, in_progress);\n" + + " float fadeOutNoise = subProgress(0.4, 0.5, in_progress);\n" + + " float fadeOutRipple = subProgress(0.4, 1., in_progress);\n" + + " vec2 center = mix(in_touch, in_origin, saturate(in_progress * 2.0));\n" + + " float ring = softRing(p, center, in_maxRadius, scaleIn, 1.);\n" + " float alpha = min(fadeIn, 1. - fadeOutNoise);\n" + " vec2 uv = p * in_resolutionScale;\n" + " vec2 densityUv = uv - mod(uv, in_noiseScale);\n" @@ -115,7 +114,7 @@ final class RippleShader extends RuntimeShader { + " float sparkleAlpha = sparkles(densityUv, in_noisePhase) * ring * alpha " + "* turbulence;\n" + " float fade = min(fadeIn, 1. - fadeOutRipple);\n" - + " float waveAlpha = softCircle(p, center, in_maxRadius * scaleIn, 0.2) * fade " + + " float waveAlpha = softCircle(p, center, in_maxRadius * scaleIn, 1.) * fade " + "* in_color.a;\n" + " vec4 waveColor = vec4(in_color.rgb * waveAlpha, waveAlpha);\n" + " vec4 sparkleColor = vec4(in_sparkleColor.rgb * in_sparkleColor.a, " @@ -139,7 +138,7 @@ final class RippleShader extends RuntimeShader { } public void setRadius(float radius) { - setUniform("in_maxRadius", radius); + setUniform("in_maxRadius", radius * 2.3f); } public void setOrigin(float x, float y) { @@ -204,8 +203,8 @@ final class RippleShader extends RuntimeShader { sparkleColor.green(), sparkleColor.blue(), sparkleColor.alpha()}); } - public void setResolution(float w, float h, int density) { - final float densityScale = density * DisplayMetrics.DENSITY_DEFAULT_SCALE; + public void setResolution(float w, float h) { + final float densityScale = 2.1f; setUniform("in_resolutionScale", new float[] {1f / w, 1f / h}); setUniform("in_noiseScale", new float[] {densityScale / w, densityScale / h}); } diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml index a45258340a5d..0195f3df83a6 100644 --- a/libs/WindowManager/Shell/res/values-de/strings.xml +++ b/libs/WindowManager/Shell/res/values-de/strings.xml @@ -28,10 +28,8 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"Vorwärts springen"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"Rückwärts springen"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Größe anpassen"</string> - <!-- no translation found for accessibility_action_pip_stash (4060775037619702641) --> - <skip /> - <!-- no translation found for accessibility_action_pip_unstash (7467499339610437646) --> - <skip /> + <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"In Stash legen"</string> + <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Aus Stash entfernen"</string> <string name="dock_forced_resizable" msgid="1749750436092293116">"Die App funktioniert unter Umständen bei geteiltem Bildschirmmodus nicht."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Das Teilen des Bildschirms wird in dieser App nicht unterstützt."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Die App funktioniert auf einem sekundären Display möglicherweise nicht."</string> diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml index bb0cdc469def..b0c03edf168d 100644 --- a/libs/WindowManager/Shell/res/values-iw/strings.xml +++ b/libs/WindowManager/Shell/res/values-iw/strings.xml @@ -28,10 +28,8 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"אפשר לדלג אל הבא"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"אפשר לדלג אל הקודם"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"שינוי גודל"</string> - <!-- no translation found for accessibility_action_pip_stash (4060775037619702641) --> - <skip /> - <!-- no translation found for accessibility_action_pip_unstash (7467499339610437646) --> - <skip /> + <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"הסתרה זמנית"</string> + <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"ביטול ההסתרה הזמנית"</string> <string name="dock_forced_resizable" msgid="1749750436092293116">"ייתכן שהאפליקציה לא תפעל במסך מפוצל."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"האפליקציה אינה תומכת במסך מפוצל."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ייתכן שהאפליקציה לא תפעל במסך משני."</string> diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml index 5b9384ca4ce6..5e655b4c7bee 100644 --- a/libs/WindowManager/Shell/res/values-kn/strings.xml +++ b/libs/WindowManager/Shell/res/values-kn/strings.xml @@ -28,10 +28,8 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"ಮುಂದಕ್ಕೆ ಸ್ಕಿಪ್ ಮಾಡಿ"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"ಹಿಂದಕ್ಕೆ ಸ್ಕಿಪ್ ಮಾಡಿ"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ಮರುಗಾತ್ರಗೊಳಿಸಿ"</string> - <!-- no translation found for accessibility_action_pip_stash (4060775037619702641) --> - <skip /> - <!-- no translation found for accessibility_action_pip_unstash (7467499339610437646) --> - <skip /> + <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"ಸ್ಟ್ಯಾಶ್ ಮಾಡಿ"</string> + <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"ಅನ್ಸ್ಟ್ಯಾಶ್ ಮಾಡಿ"</string> <string name="dock_forced_resizable" msgid="1749750436092293116">"ವಿಭಜಿಸಿದ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ಆ್ಯಪ್ ಕೆಲಸ ಮಾಡದೇ ಇರಬಹುದು."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ಅಪ್ಲಿಕೇಶನ್ ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ಸೆಕೆಂಡರಿ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಕಾರ್ಯ ನಿರ್ವಹಿಸದೇ ಇರಬಹುದು."</string> diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml index 8c3969335666..5b9b87205428 100644 --- a/libs/WindowManager/Shell/res/values-ne/strings.xml +++ b/libs/WindowManager/Shell/res/values-ne/strings.xml @@ -28,10 +28,8 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"अर्कोमा जानुहोस्"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"अघिल्लोमा जानुहोस्"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"आकार बदल्नुहोस्"</string> - <!-- no translation found for accessibility_action_pip_stash (4060775037619702641) --> - <skip /> - <!-- no translation found for accessibility_action_pip_unstash (7467499339610437646) --> - <skip /> + <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"स्ट्यास गर्नुहोस्"</string> + <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"अनस्ट्यास गर्नुहोस्"</string> <string name="dock_forced_resizable" msgid="1749750436092293116">"एप विभाजित स्क्रिनमा काम नगर्न सक्छ।"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"अनुप्रयोगले विभाजित-स्क्रिनलाई समर्थन गर्दैन।"</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"यो एपले सहायक प्रदर्शनमा काम नगर्नसक्छ।"</string> diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml index 73752a6f02fe..ac1e84a6e283 100644 --- a/libs/WindowManager/Shell/res/values-or/strings.xml +++ b/libs/WindowManager/Shell/res/values-or/strings.xml @@ -28,10 +28,8 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"ପରବର୍ତ୍ତୀକୁ ଯାଆନ୍ତୁ"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"ପୂର୍ବବର୍ତ୍ତୀକୁ ଛାଡ଼ନ୍ତୁ"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ରିସାଇଜ୍ କରନ୍ତୁ"</string> - <!-- no translation found for accessibility_action_pip_stash (4060775037619702641) --> - <skip /> - <!-- no translation found for accessibility_action_pip_unstash (7467499339610437646) --> - <skip /> + <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"ଲୁଚାନ୍ତୁ"</string> + <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"ଦେଖାନ୍ତୁ"</string> <string name="dock_forced_resizable" msgid="1749750436092293116">"ସ୍ପ୍ଲିଟ୍-ସ୍କ୍ରିନରେ ଆପ୍ କାମ କରିନପାରେ।"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ଆପ୍ ସ୍ପ୍ଲିଟ୍-ସ୍କ୍ରୀନକୁ ସପୋର୍ଟ କରେ ନାହିଁ।"</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ସେକେଣ୍ଡାରୀ ଡିସପ୍ଲେରେ ଆପ୍ କାମ ନକରିପାରେ।"</string> diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml index 9c68bc836783..bf5b733c22ea 100644 --- a/libs/WindowManager/Shell/res/values-pa/strings.xml +++ b/libs/WindowManager/Shell/res/values-pa/strings.xml @@ -28,10 +28,8 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"ਅਗਲੇ \'ਤੇ ਜਾਓ"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"ਪਿਛਲੇ \'ਤੇ ਜਾਓ"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ਆਕਾਰ ਬਦਲੋ"</string> - <!-- no translation found for accessibility_action_pip_stash (4060775037619702641) --> - <skip /> - <!-- no translation found for accessibility_action_pip_unstash (7467499339610437646) --> - <skip /> + <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"ਸਟੈਸ਼"</string> + <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"ਅਣਸਟੈਸ਼"</string> <string name="dock_forced_resizable" msgid="1749750436092293116">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ।"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ।"</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇ \'ਤੇ ਕੰਮ ਨਾ ਕਰੇ।"</string> diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml index d884be7e5ba8..13e830cbd100 100644 --- a/libs/WindowManager/Shell/res/values-sq/strings.xml +++ b/libs/WindowManager/Shell/res/values-sq/strings.xml @@ -28,10 +28,8 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"Kalo te tjetra"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"Kalo tek e mëparshmja"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Ndrysho përmasat"</string> - <!-- no translation found for accessibility_action_pip_stash (4060775037619702641) --> - <skip /> - <!-- no translation found for accessibility_action_pip_unstash (7467499339610437646) --> - <skip /> + <string name="accessibility_action_pip_stash" msgid="4060775037619702641">"Fshih"</string> + <string name="accessibility_action_pip_unstash" msgid="7467499339610437646">"Mos e fshih"</string> <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacioni mund të mos funksionojë me ekranin e ndarë."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacioni nuk mbështet ekranin e ndarë."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacioni mund të mos funksionojë në një ekran dytësor."</string> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java index 187e104c9bfb..1a03ebd4caae 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java @@ -277,8 +277,9 @@ public class StartingSurfaceDrawer { // waiting for setContentView before relayoutWindow SplashScreenView contentView = viewSupplier.get(); final StartingWindowRecord record = mStartingWindowRecords.get(taskId); - // if record == null, either the starting window added fail or removed already. - if (record != null) { + // If record == null, either the starting window added fail or removed already. + // Do not add this view if the token is mismatch. + if (record != null && appToken == record.mAppToken) { // if view == null then creation of content view was failed. if (contentView != null) { try { @@ -297,15 +298,16 @@ public class StartingSurfaceDrawer { try { final WindowManager wm = context.getSystemService(WindowManager.class); - postAddWindow(taskId, appToken, rootLayout, wm, params); - - // We use the splash screen worker thread to create SplashScreenView while adding the - // window, as otherwise Choreographer#doFrame might be delayed on this thread. - // And since Choreographer#doFrame won't happen immediately after adding the window, if - // the view is not added to the PhoneWindow on the first #doFrame, the view will not be - // rendered on the first frame. So here we need to synchronize the view on the window - // before first round relayoutWindow, which will happen after insets animation. - mChoreographer.postCallback(CALLBACK_INSETS_ANIMATION, setViewSynchronized, null); + if (postAddWindow(taskId, appToken, rootLayout, wm, params)) { + // We use the splash screen worker thread to create SplashScreenView while adding + // the window, as otherwise Choreographer#doFrame might be delayed on this thread. + // And since Choreographer#doFrame won't happen immediately after adding the window, + // if the view is not added to the PhoneWindow on the first #doFrame, the view will + // not be rendered on the first frame. So here we need to synchronize the view on + // the window before first round relayoutWindow, which will happen after insets + // animation. + mChoreographer.postCallback(CALLBACK_INSETS_ANIMATION, setViewSynchronized, null); + } } catch (RuntimeException e) { // don't crash if something else bad happens, for example a // failure loading resources because we are loading from an app @@ -347,7 +349,8 @@ public class StartingSurfaceDrawer { final int taskId = startingWindowInfo.taskInfo.taskId; final TaskSnapshotWindow surface = TaskSnapshotWindow.create(startingWindowInfo, appToken, snapshot, mSplashScreenExecutor, () -> removeWindowNoAnimate(taskId)); - final StartingWindowRecord tView = new StartingWindowRecord(null/* decorView */, surface); + final StartingWindowRecord tView = new StartingWindowRecord(appToken, + null/* decorView */, surface); mStartingWindowRecords.put(taskId, tView); } @@ -372,6 +375,7 @@ public class StartingSurfaceDrawer { if (preView != null && preView.mContentView != null && preView.mContentView.isCopyable()) { parcelable = new SplashScreenViewParcelable(preView.mContentView); + preView.mContentView.onCopied(); } else { parcelable = null; } @@ -382,7 +386,7 @@ public class StartingSurfaceDrawer { ActivityTaskManager.getInstance().onSplashScreenViewCopyFinished(taskId, parcelable); } - protected void postAddWindow(int taskId, IBinder appToken, View view, WindowManager wm, + protected boolean postAddWindow(int taskId, IBinder appToken, View view, WindowManager wm, WindowManager.LayoutParams params) { boolean shouldSaveView = true; try { @@ -401,12 +405,13 @@ public class StartingSurfaceDrawer { } if (shouldSaveView) { removeWindowNoAnimate(taskId); - saveSplashScreenRecord(taskId, view); + saveSplashScreenRecord(appToken, taskId, view); } + return shouldSaveView; } - private void saveSplashScreenRecord(int taskId, View view) { - final StartingWindowRecord tView = new StartingWindowRecord(view, + private void saveSplashScreenRecord(IBinder appToken, int taskId, View view) { + final StartingWindowRecord tView = new StartingWindowRecord(appToken, view, null/* TaskSnapshotWindow */); mStartingWindowRecords.put(taskId, tView); } @@ -468,12 +473,15 @@ public class StartingSurfaceDrawer { * Record the view or surface for a starting window. */ private static class StartingWindowRecord { + private final IBinder mAppToken; private final View mDecorView; private final TaskSnapshotWindow mTaskSnapshotWindow; private SplashScreenView mContentView; private boolean mSetSplashScreen; - StartingWindowRecord(View decorView, TaskSnapshotWindow taskSnapshotWindow) { + StartingWindowRecord(IBinder appToken, View decorView, + TaskSnapshotWindow taskSnapshotWindow) { + mAppToken = appToken; mDecorView = decorView; mTaskSnapshotWindow = taskSnapshotWindow; } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java index 262353502bb7..4e3e133f85b0 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java @@ -83,11 +83,12 @@ public class StartingSurfaceDrawerTests { } @Override - protected void postAddWindow(int taskId, IBinder appToken, + protected boolean postAddWindow(int taskId, IBinder appToken, View view, WindowManager wm, WindowManager.LayoutParams params) { // listen for addView mAddWindowForTask = taskId; mViewThemeResId = view.getContext().getThemeResId(); + return true; } @Override diff --git a/location/java/android/location/LocationDeviceConfig.java b/location/java/android/location/LocationDeviceConfig.java index 92845745828b..c55eed9211f7 100644 --- a/location/java/android/location/LocationDeviceConfig.java +++ b/location/java/android/location/LocationDeviceConfig.java @@ -16,16 +16,11 @@ package android.location; -import android.annotation.SystemApi; -import android.annotation.TestApi; - /** * DeviceConfig keys within the location namespace. * * @hide */ -@SystemApi -@TestApi public final class LocationDeviceConfig { /** diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index f83dc407d870..ae44c5e34521 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -1823,6 +1823,7 @@ public class LocationManager { * @deprecated Use {@link #isProviderPackage(String, String, String)} instead. * * @hide + * @removed */ @Deprecated @SystemApi diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java index 79d505ebbde8..f8297bc93b72 100644 --- a/media/java/android/media/Ringtone.java +++ b/media/java/android/media/Ringtone.java @@ -405,9 +405,11 @@ public class Ringtone { */ public void play() { if (mLocalPlayer != null) { - // do not play ringtones if stream volume is 0 - // (typically because ringer mode is silent). - if (mAudioManager.getStreamVolume( + // Play ringtones if stream volume is over 0 or if it is a haptic-only ringtone + // (typically because ringer mode is vibrate). + boolean isHapticOnly = AudioManager.hasHapticChannels(mUri) + && !mAudioAttributes.areHapticChannelsMuted() && mVolume == 0; + if (isHapticOnly || mAudioManager.getStreamVolume( AudioAttributes.toLegacyStreamType(mAudioAttributes)) != 0) { startLocalPlayer(); } diff --git a/packages/SettingsLib/AppPreference/res/layout/preference_app.xml b/packages/SettingsLib/AppPreference/res/layout/preference_app.xml index 657a12cd13de..e65f7de2466a 100644 --- a/packages/SettingsLib/AppPreference/res/layout/preference_app.xml +++ b/packages/SettingsLib/AppPreference/res/layout/preference_app.xml @@ -90,7 +90,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical|end" - android:minWidth="64dp" + android:minWidth="@dimen/two_target_min_width" android:orientation="vertical"/> </LinearLayout> diff --git a/packages/SettingsLib/BannerMessagePreference/src/com/android/settingslib/widget/BannerMessagePreference.java b/packages/SettingsLib/BannerMessagePreference/src/com/android/settingslib/widget/BannerMessagePreference.java index 5bedd7a18890..9e39355e452d 100644 --- a/packages/SettingsLib/BannerMessagePreference/src/com/android/settingslib/widget/BannerMessagePreference.java +++ b/packages/SettingsLib/BannerMessagePreference/src/com/android/settingslib/widget/BannerMessagePreference.java @@ -73,11 +73,11 @@ public class BannerMessagePreference extends Preference { throw new IllegalArgumentException(); } - @ColorRes int getAccentColorResId() { + public @ColorRes int getAccentColorResId() { return mAccentColorResId; } - @ColorRes int getBackgroundColorResId() { + public @ColorRes int getBackgroundColorResId() { return mBackgroundColorResId; } } diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java index 4c45c5e3cb56..8c2621d3e4ec 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java @@ -16,6 +16,8 @@ package com.android.settingslib.collapsingtoolbar; +import static com.android.settingslib.transition.SettingsTransitionHelper.EXTRA_PAGE_TRANSITION_TYPE; + import android.app.ActivityOptions; import android.content.Intent; import android.os.Bundle; @@ -28,6 +30,7 @@ import androidx.core.os.BuildCompat; import androidx.fragment.app.FragmentActivity; import com.android.settingslib.transition.SettingsTransitionHelper; +import com.android.settingslib.transition.SettingsTransitionHelper.TransitionType; /** * A base Activity for Settings-specific page transition. Activities extending it will get @@ -35,7 +38,6 @@ import com.android.settingslib.transition.SettingsTransitionHelper; */ public abstract class SettingsTransitionActivity extends FragmentActivity { private static final String TAG = "SettingsTransitionActivity"; - private static final int DEFAULT_REQUEST = -1; private Toolbar mToolbar; @@ -58,45 +60,17 @@ public abstract class SettingsTransitionActivity extends FragmentActivity { } @Override - public void startActivity(Intent intent) { - if (!isSettingsTransitionEnabled()) { - super.startActivity(intent); - return; - } - - super.startActivity(intent, createActivityOptionsBundleForTransition(null)); - } - - @Override - public void startActivity(Intent intent, @Nullable Bundle options) { - if (!isSettingsTransitionEnabled()) { - super.startActivity(intent, options); - return; - } - - super.startActivity(intent, createActivityOptionsBundleForTransition(options)); - } - - @Override - public void startActivityForResult(Intent intent, int requestCode) { - if (!isSettingsTransitionEnabled() || requestCode == DEFAULT_REQUEST) { - super.startActivityForResult(intent, requestCode); - return; - } - - super.startActivityForResult(intent, requestCode, createActivityOptionsBundleForTransition( - null)); - } - - @Override public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) { - if (!isSettingsTransitionEnabled() || requestCode == DEFAULT_REQUEST) { + final int transitionType = intent.getIntExtra(EXTRA_PAGE_TRANSITION_TYPE, + TransitionType.TRANSITION_SHARED_AXIS); + if (!isSettingsTransitionEnabled() || + transitionType == TransitionType.TRANSITION_NONE) { super.startActivityForResult(intent, requestCode, options); return; } - super.startActivityForResult(intent, requestCode, createActivityOptionsBundleForTransition( - options)); + super.startActivityForResult(intent, requestCode, + createActivityOptionsBundleForTransition(options)); } protected boolean isSettingsTransitionEnabled() { diff --git a/packages/SettingsLib/MainSwitchPreference/Android.bp b/packages/SettingsLib/MainSwitchPreference/Android.bp index 4ce854ada849..23ee49e70595 100644 --- a/packages/SettingsLib/MainSwitchPreference/Android.bp +++ b/packages/SettingsLib/MainSwitchPreference/Android.bp @@ -15,6 +15,7 @@ android_library { static_libs: [ "androidx.preference_preference", + "SettingsLibSettingsTheme", ], sdk_version: "system_current", diff --git a/packages/SettingsLib/MainSwitchPreference/res/values-night/colors.xml b/packages/SettingsLib/MainSwitchPreference/res/values-night/colors.xml index 9ca3683dfd31..58ab9921f9f7 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/values-night/colors.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/values-night/colors.xml @@ -18,13 +18,4 @@ <resources> <color name="settingslib_switchbar_switch_track_tint">#82000000</color> <color name="settingslib_switchbar_switch_thumb_tint">@android:color/black</color> - - <!-- Material next thumb off color--> - <color name="settingslib_thumb_off_color">@android:color/system_neutral2_300</color> - - <!-- Material next track on color--> - <color name="settingslib_track_on_color">@android:color/system_accent2_700</color> - - <!-- Material next track off color--> - <color name="settingslib_track_off_color">@android:color/system_neutral1_700</color> </resources> diff --git a/packages/SettingsLib/MainSwitchPreference/res/values/colors.xml b/packages/SettingsLib/MainSwitchPreference/res/values/colors.xml index 2c73238da254..0c95a9ec65e1 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/values/colors.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/values/colors.xml @@ -19,19 +19,4 @@ <color name="settingslib_switchbar_background_color">@*android:color/material_grey_600</color> <color name="settingslib_switchbar_switch_track_tint">#BFFFFFFF</color> <color name="settingslib_switchbar_switch_thumb_tint">@android:color/white</color> - - <!-- Material next state on color--> - <color name="settingslib_state_on_color">?androidprv:attr/colorAccentPrimary</color> - - <!-- Material next state off color--> - <color name="settingslib_state_off_color">?androidprv:attr/colorAccentSecondary</color> - - <!-- Material next thumb off color--> - <color name="settingslib_thumb_off_color">@android:color/system_neutral2_100</color> - - <!-- Material next track on color--> - <color name="settingslib_track_on_color">?androidprv:attr/colorAccentPrimaryVariant</color> - - <!-- Material next track off color--> - <color name="settingslib_track_off_color">@android:color/system_neutral2_600</color> </resources> diff --git a/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml b/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml index e92b6716976e..b299061ce591 100644 --- a/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml +++ b/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml @@ -58,13 +58,14 @@ android:layout_weight="1" android:orientation="vertical" android:paddingTop="16dp" - android:paddingBottom="16dp"> + android:paddingBottom="16dp" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> <TextView android:id="@android:id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:singleLine="true" + android:maxLines="2" android:textAppearance="?android:attr/textAppearanceListItem"/> <LinearLayout @@ -109,12 +110,13 @@ android:background="?android:attr/dividerVertical" /> <ImageView android:id="@+id/radio_extra_widget" - android:layout_width="wrap_content" + android:layout_width="match_parent" + android:minWidth="@dimen/two_target_min_width" android:layout_height="fill_parent" android:src="@drawable/ic_settings_accent" android:contentDescription="@string/settings_label" - android:paddingStart="16dp" - android:paddingEnd="16dp" + android:paddingStart="24dp" + android:paddingEnd="24dp" android:layout_gravity="center" android:background="?android:attr/selectableItemBackground" /> </LinearLayout> diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_thumb_color.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_thumb_color.xml new file mode 100644 index 000000000000..df3bad4ee377 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_thumb_color.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2021 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- Disabled status of thumb --> + <item android:state_enabled="false" + android:color="@color/settingslib_thumb_off_color" /> + <!-- Toggle off status of thumb --> + <item android:state_checked="false" + android:color="@color/settingslib_thumb_off_color" /> + <!-- Enabled or toggle on status of thumb --> + <item android:color="@color/settingslib_state_on_color" /> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_track_color.xml b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_track_color.xml new file mode 100644 index 000000000000..9568f52dcd01 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/color-v31/settingslib_switch_track_color.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2021 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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- Disabled status of thumb --> + <item android:state_enabled="false" + android:color="@color/settingslib_track_off_color" + android:alpha="?android:attr/disabledAlpha" /> + <!-- Toggle off status of thumb --> + <item android:state_checked="false" + android:color="@color/settingslib_track_off_color" /> + <!-- Enabled or toggle on status of thumb --> + <item android:color="@color/settingslib_track_on_color" /> +</selector>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_switch_thumb.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_switch_thumb.xml new file mode 100644 index 000000000000..87c6dea49e2b --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_switch_thumb.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2021 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 + android:top="4dp" + android:left="4dp" + android:right="4dp" + android:bottom="4dp"> + <shape android:shape="oval" > + <size android:height="20dp" android:width="20dp" /> + <solid android:color="@color/settingslib_switch_thumb_color" /> + </shape> + </item> +</layer-list>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_switch_track.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_switch_track.xml new file mode 100644 index 000000000000..cb8f3f09201c --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/drawable-v31/settingslib_switch_track.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2021 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. + --> + +<shape + xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle" + android:width="52dp" + android:height="28dp"> + + <solid android:color="@color/settingslib_switch_track_color" /> + <corners android:radius="35dp" /> +</shape>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml new file mode 100644 index 000000000000..df0e3e1d9641 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2020 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> + <!-- Material next thumb off color--> + <color name="settingslib_thumb_off_color">@android:color/system_neutral2_300</color> + + <!-- Material next track on color--> + <color name="settingslib_track_on_color">@android:color/system_accent2_700</color> + + <!-- Material next track off color--> + <color name="settingslib_track_off_color">@android:color/system_neutral1_700</color> +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml new file mode 100644 index 000000000000..c9bc583b209f --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2020 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> + <!-- Material next state on color--> + <color name="settingslib_state_on_color">?androidprv:attr/colorAccentPrimary</color> + + <!-- Material next state off color--> + <color name="settingslib_state_off_color">?androidprv:attr/colorAccentSecondary</color> + + <!-- Material next thumb off color--> + <color name="settingslib_thumb_off_color">@android:color/system_neutral2_100</color> + + <!-- Material next track on color--> + <color name="settingslib_track_on_color">?androidprv:attr/colorAccentPrimaryVariant</color> + + <!-- Material next track off color--> + <color name="settingslib_track_off_color">@android:color/system_neutral2_600</color> +</resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/styles.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/styles.xml index 83a259e624bd..e3a023995e76 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v31/styles.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-v31/styles.xml @@ -22,4 +22,10 @@ <style name="TextAppearance.CategoryTitle.SettingsLib" parent="@*android:style/TextAppearance.DeviceDefault.Body2" /> + + <style name="Switch.SettingsLib" parent="@android:style/Widget.Material.CompoundButton.Switch"> + <item name="android:switchMinWidth">52dp</item> + <item name="android:track">@drawable/settingslib_switch_track</item> + <item name="android:thumb">@drawable/settingslib_switch_thumb</item> + </style> </resources> diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml index 69649e042ac4..adf506dc47cb 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml @@ -22,6 +22,7 @@ <item name="android:listPreferredItemPaddingStart">24dp</item> <item name="android:listPreferredItemPaddingEnd">16dp</item> <item name="preferenceTheme">@style/PreferenceTheme.SettingsLib</item> + <item name="android:switchStyle">@style/Switch.SettingsLib</item> </style> <!-- Using in SubSettings page including injected settings page --> diff --git a/packages/SettingsLib/SettingsTheme/res/values/dimens.xml b/packages/SettingsLib/SettingsTheme/res/values/dimens.xml index 3f473a3e0e85..25f9514c29b7 100644 --- a/packages/SettingsLib/SettingsTheme/res/values/dimens.xml +++ b/packages/SettingsLib/SettingsTheme/res/values/dimens.xml @@ -19,4 +19,5 @@ <dimen name="secondary_app_icon_size">32dp</dimen> <dimen name="app_preference_padding_start">?android:attr/listPreferredItemPaddingStart</dimen> <dimen name="app_icon_min_width">56dp</dimen> + <dimen name="two_target_min_width">72dp</dimen> </resources> diff --git a/packages/SettingsLib/SettingsTransition/src/com/android/settingslib/transition/SettingsTransitionHelper.java b/packages/SettingsLib/SettingsTransition/src/com/android/settingslib/transition/SettingsTransitionHelper.java index ed447f873610..4612861b5766 100644 --- a/packages/SettingsLib/SettingsTransition/src/com/android/settingslib/transition/SettingsTransitionHelper.java +++ b/packages/SettingsLib/SettingsTransition/src/com/android/settingslib/transition/SettingsTransitionHelper.java @@ -16,6 +16,7 @@ package com.android.settingslib.transition; +import androidx.annotation.IntDef; import android.app.Activity; import android.content.Context; import android.util.Log; @@ -29,11 +30,33 @@ import com.google.android.material.transition.platform.FadeThroughProvider; import com.google.android.material.transition.platform.MaterialSharedAxis; import com.google.android.material.transition.platform.SlideDistanceProvider; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * A helper class to apply Settings Transition */ public class SettingsTransitionHelper { + /** + * Flags indicating the type of the transition. + */ + @IntDef({ + TransitionType.TRANSITION_NONE, + TransitionType.TRANSITION_SHARED_AXIS, + TransitionType.TRANSITION_SLIDE, + TransitionType.TRANSITION_FADE + }) + @Retention(RetentionPolicy.SOURCE) + public @interface TransitionType { + int TRANSITION_NONE = -1; + int TRANSITION_SHARED_AXIS = 0; + int TRANSITION_SLIDE = 1; + int TRANSITION_FADE = 2; + } + + public static final String EXTRA_PAGE_TRANSITION_TYPE = "page_transition_type"; + private static final String TAG = "SettingsTransitionHelper"; private static final long DURATION = 450L; private static final float FADE_THROUGH_THRESHOLD = 0.22F; diff --git a/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java b/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java index 52d2b3c919d9..8f3e4bd87aa7 100644 --- a/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java +++ b/packages/SettingsLib/Tile/src/com/android/settingslib/drawer/Tile.java @@ -19,7 +19,6 @@ package com.android.settingslib.drawer; import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_ORDER; import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_PROFILE; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON; -import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_URI; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY_URI; @@ -301,16 +300,8 @@ public abstract class Tile implements Parcelable { } int iconResId = mMetaData.getInt(META_DATA_PREFERENCE_ICON); - // Set the icon - if (iconResId == 0) { - // Only fallback to componentInfo.icon if metadata does not contain ICON_URI. - // ICON_URI should be loaded in app UI when need the icon object. Handling IPC at this - // level is too complex because we don't have a strong threading contract for this class - if (!mMetaData.containsKey(META_DATA_PREFERENCE_ICON_URI)) { - iconResId = getComponentIcon(componentInfo); - } - } - if (iconResId != 0) { + // Set the icon. Skip the transparent color for backward compatibility since Android S. + if (iconResId != 0 && iconResId != android.R.color.transparent) { final Icon icon = Icon.createWithResource(componentInfo.packageName, iconResId); if (isIconTintable(context)) { final TypedArray a = context.obtainStyledAttributes(new int[]{ diff --git a/packages/SettingsLib/TwoTargetPreference/res/layout/preference_two_target.xml b/packages/SettingsLib/TwoTargetPreference/res/layout/preference_two_target.xml index 7978e73b9b37..2c2756b36533 100644 --- a/packages/SettingsLib/TwoTargetPreference/res/layout/preference_two_target.xml +++ b/packages/SettingsLib/TwoTargetPreference/res/layout/preference_two_target.xml @@ -63,7 +63,7 @@ android:id="@android:id/widget_frame" android:layout_width="wrap_content" android:layout_height="match_parent" - android:minWidth="64dp" + android:minWidth="@dimen/two_target_min_width" android:gravity="center" android:orientation="vertical" /> diff --git a/packages/SettingsLib/res/layout/preference_access_point.xml b/packages/SettingsLib/res/layout/preference_access_point.xml index 9dc87de38ec2..f3f43accca3c 100644 --- a/packages/SettingsLib/res/layout/preference_access_point.xml +++ b/packages/SettingsLib/res/layout/preference_access_point.xml @@ -24,6 +24,8 @@ android:minHeight="?android:attr/listPreferredItemHeightSmall" android:gravity="center_vertical" android:background="?android:attr/selectableItemBackground" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:clipToPadding="false"> <LinearLayout @@ -31,9 +33,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="start|center_vertical" - android:clipToPadding="false" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> + android:clipToPadding="false"> <LinearLayout android:id="@+id/icon_frame" @@ -89,7 +89,7 @@ android:id="@android:id/widget_frame" android:layout_width="wrap_content" android:layout_height="match_parent" - android:minWidth="64dp" + android:minWidth="@dimen/two_target_min_width" android:gravity="center" android:orientation="vertical" /> @@ -97,7 +97,7 @@ android:id="@+id/icon_button" android:layout_width="wrap_content" android:layout_height="match_parent" - android:minWidth="64dp" + android:minWidth="@dimen/two_target_min_width" android:minHeight="@dimen/min_tap_target_size" android:layout_gravity="center" android:background="?android:attr/selectableItemBackground" diff --git a/packages/SettingsLib/res/layout/preference_checkable_two_target.xml b/packages/SettingsLib/res/layout/preference_checkable_two_target.xml index 1ae1c8967679..e4f72422e408 100644 --- a/packages/SettingsLib/res/layout/preference_checkable_two_target.xml +++ b/packages/SettingsLib/res/layout/preference_checkable_two_target.xml @@ -24,6 +24,8 @@ android:minHeight="?android:attr/listPreferredItemHeightSmall" android:gravity="center_vertical" android:background="@android:color/transparent" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:clipToPadding="false"> <LinearLayout @@ -32,9 +34,7 @@ android:layout_weight="1" android:background="?android:attr/selectableItemBackground" android:gravity="start|center_vertical" - android:clipToPadding="false" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> + android:clipToPadding="false"> <LinearLayout android:id="@+id/checkbox_container" @@ -86,7 +86,7 @@ android:id="@android:id/widget_frame" android:layout_width="wrap_content" android:layout_height="match_parent" - android:minWidth="64dp" + android:minWidth="@dimen/two_target_min_width" android:gravity="center" android:orientation="vertical" /> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 4e30f384cb82..8b703f6de466 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -515,7 +515,7 @@ <string name="alarms_and_reminders_footer_title" product="device" msgid="349578867821273761">"يمكنك السماح لهذا التطبيق بضبط المنبّهات وجدولة الإجراءات الأخرى. قد يتم استخدام هذا التطبيق عند عدم استخدامك للجهاز، مما قد يستهلك المزيد من شحن البطارية. إذا كان هذا الإذن غير مفعّل، قد لا يعمل هذا التطبيق بشكل طبيعي ولن تعمل المنبّهات فيه كما هو مقرر."</string> <string name="keywords_alarms_and_reminders" msgid="6633360095891110611">"جدول زمني، جدولة، منبّه، تذكير، ساعة"</string> <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"تفعيل"</string> - <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"تفعيل وضع \"الرجاء عدم الإزعاج\""</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"تفعيل ميزة \"عدم الإزعاج\""</string> <string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"مطلقًا"</string> <string name="zen_interruption_level_priority" msgid="5392140786447823299">"الأولوية فقط"</string> <string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 36bdf476140f..e5aa95d568f4 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -284,7 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Afficher les options pour la certification d\'affichage sans fil"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Détailler davantage les données Wi-Fi, afficher par SSID RSSI dans sélect. Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Réduit l\'utilisation de la pile et améliore les performances réseau"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Lorsque ce mode est activé, l\'adresse MAC de cet appareil pourrait changer chaque fois qu\'il se connecter à un réseau sur lequel la sélection aléatoire des adresses MAC est activée."</string> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Lorsque ce mode est activé, l\'adresse MAC de cet appareil pourrait changer chaque fois qu\'il se connecte à un réseau sur lequel la sélection aléatoire des adresses MAC est activée."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Facturé à l\'usage"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Non mesuré"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tailles des mémoires tampons d\'enregistreur"</string> @@ -376,7 +376,7 @@ <string name="force_allow_on_external" msgid="9187902444231637880">"Forcer l\'autor. d\'applis sur stockage externe"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"Rend possible l\'enregistrement de toute application sur un espace de stockage externe, indépendamment des valeurs du fichier manifeste"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"Forcer les activités à être redimensionnables"</string> - <string name="force_resizable_activities_summary" msgid="2490382056981583062">"Permet de redimensionner toutes les activités pour le mode multifenêtre, indépendamment des valeurs du fichier manifeste."</string> + <string name="force_resizable_activities_summary" msgid="2490382056981583062">"Permet de redimensionner toutes les activités pour le mode multi-fenêtre, indépendamment des valeurs du fichier manifeste."</string> <string name="enable_freeform_support" msgid="7599125687603914253">"Activer les fenêtres de forme libre"</string> <string name="enable_freeform_support_summary" msgid="1822862728719276331">"Activer la compatibilité avec les fenêtres de forme libre expérimentales."</string> <string name="local_backup_password_title" msgid="4631017948933578709">"Mot de passe sauvegarde PC"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index da62dedd481d..2dc05f45d625 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -474,7 +474,7 @@ <item msgid="7529124349186240216">"100%"</item> </string-array> <string name="charge_length_format" msgid="6941645744588690932">"<xliff:g id="ID_1">%1$s</xliff:g>前"</string> - <string name="remaining_length_format" msgid="4310625772926171089">"还需 <xliff:g id="ID_1">%1$s</xliff:g>"</string> + <string name="remaining_length_format" msgid="4310625772926171089">"还可以使用 <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="6050633151263074260">"小"</string> <string name="screen_zoom_summary_default" msgid="1888865694033865408">"默认"</string> <string name="screen_zoom_summary_large" msgid="4706951482598978984">"大"</string> diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 404299a2bd38..af8cd1e49efe 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -1133,7 +1133,7 @@ <!-- [CHAR_LIMIT=40] Label for battery level chart when charging with duration --> <string name="power_charging_duration"><xliff:g id="level">%1$s</xliff:g> - <xliff:g id="time">%2$s</xliff:g> left until full</string> <!-- [CHAR_LIMIT=80] Label for battery level chart when charge been limited --> - <string name="power_charging_limited"><xliff:g id="level">%1$s</xliff:g> - Optimizing for battery health</string> + <string name="power_charging_limited"><xliff:g id="level">%1$s</xliff:g> - Charging temporarily limited</string> <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed --> <string name="battery_info_status_unknown">Unknown</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index 4558a8a3d33e..fe92e2664eda 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -1222,19 +1222,22 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> */ public Pair<Drawable, String> getDrawableWithDescription() { Uri uri = BluetoothUtils.getUriMetaData(mDevice, BluetoothDevice.METADATA_MAIN_ICON); + Pair<Drawable, String> pair = BluetoothUtils.getBtClassDrawableWithDescription( + mContext, this); + if (BluetoothUtils.isAdvancedDetailsHeader(mDevice) && uri != null) { BitmapDrawable drawable = mDrawableCache.get(uri.toString()); if (drawable != null) { Resources resources = mContext.getResources(); return new Pair<>(new AdaptiveOutlineDrawable( - resources, drawable.getBitmap()), - BluetoothUtils.getBtClassDrawableWithDescription(mContext, this).second); + resources, drawable.getBitmap()), pair.second); } refresh(); } - return BluetoothUtils.getBtRainbowDrawableWithDescription(mContext, this); + return new Pair<>(BluetoothUtils.buildBtRainbowDrawable( + mContext, pair.first, getAddress().hashCode()), pair.second); } void releaseLruCache() { diff --git a/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/MetricsFeatureProvider.java b/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/MetricsFeatureProvider.java index bd0b9e93b09d..6cb60d1aaf0e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/MetricsFeatureProvider.java +++ b/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/MetricsFeatureProvider.java @@ -98,7 +98,7 @@ public class MetricsFeatureProvider { /** * Logs a simple action without page id or attribution */ - public void action(Context context, int category, Pair<Integer, Object>... taggedData) { + public void action(Context context, int category, Pair<Integer, Object>... taggedData) { for (LogWriter writer : mLoggerWriters) { writer.action(context, category, taggedData); } diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminController.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminController.java index 8730af1d6a1d..6d7f8df8aeb0 100644 --- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminController.java +++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminController.java @@ -16,11 +16,9 @@ package com.android.settingslib.enterprise; -import android.app.Activity; import android.content.Context; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog.Builder; import com.android.settingslib.RestrictedLockUtils; @@ -33,7 +31,7 @@ public interface ActionDisabledByAdminController { * Handles the adding and setting up of the learn more button. If button is not needed, then * this method can be left empty. */ - void setupLearnMoreButton(Activity activity, Builder builder); + void setupLearnMoreButton(Context context, Object alertDialogBuilder); /** * Returns the admin support dialog's title resource id. diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java index 9d2df23ce869..65b91f129c95 100644 --- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java +++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java @@ -16,9 +16,7 @@ package com.android.settingslib.enterprise; -import android.app.Activity; - -import androidx.appcompat.app.AlertDialog; +import android.content.Context; import com.android.settingslib.RestrictedLockUtils; @@ -31,8 +29,8 @@ public interface ActionDisabledLearnMoreButtonLauncher { * Sets up a "learn more" button which shows a screen with device policy settings */ void setupLearnMoreButtonToShowAdminPolicies( - Activity activity, - AlertDialog.Builder builder, + Context context, + Object alertDialogBuilder, int enforcementAdminUserId, RestrictedLockUtils.EnforcedAdmin enforcedAdmin); @@ -40,7 +38,7 @@ public interface ActionDisabledLearnMoreButtonLauncher { * Sets up a "learn more" button which launches a help page */ void setupLearnMoreButtonToLaunchHelpPage( - Activity activity, - AlertDialog.Builder builder, + Context context, + Object alertDialogBuilder, String url); } diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/FinancedDeviceActionDisabledByAdminController.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/FinancedDeviceActionDisabledByAdminController.java index 587979dcf8da..cd816e88f080 100644 --- a/packages/SettingsLib/src/com/android/settingslib/enterprise/FinancedDeviceActionDisabledByAdminController.java +++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/FinancedDeviceActionDisabledByAdminController.java @@ -19,11 +19,9 @@ package com.android.settingslib.enterprise; import static java.util.Objects.requireNonNull; import android.annotation.UserIdInt; -import android.app.Activity; import android.content.Context; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog.Builder; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; @@ -41,21 +39,22 @@ public class FinancedDeviceActionDisabledByAdminController FinancedDeviceActionDisabledByAdminController( ActionDisabledLearnMoreButtonLauncher helper, DeviceAdminStringProvider deviceAdminStringProvider) { - mHelper = requireNonNull(helper); - mDeviceAdminStringProvider = requireNonNull(deviceAdminStringProvider); + mHelper = requireNonNull(helper, "helper cannot be null"); + mDeviceAdminStringProvider = requireNonNull(deviceAdminStringProvider, + "deviceAdminStringProvider cannot be null"); } @Override public void updateEnforcedAdmin(EnforcedAdmin admin, int adminUserId) { mEnforcementAdminUserId = adminUserId; - mEnforcedAdmin = requireNonNull(admin); + mEnforcedAdmin = requireNonNull(admin, "admin cannot be null"); } @Override - public void setupLearnMoreButton(Activity activity, Builder builder) { + public void setupLearnMoreButton(Context context, Object alertDialogBuilder) { mHelper.setupLearnMoreButtonToShowAdminPolicies( - activity, - builder, + context, + alertDialogBuilder, mEnforcementAdminUserId, mEnforcedAdmin); } diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java index 624c88e461ea..70e19f97028b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java +++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java @@ -19,14 +19,11 @@ package com.android.settingslib.enterprise; import static java.util.Objects.requireNonNull; import android.annotation.UserIdInt; -import android.app.Activity; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.os.UserManager; import android.text.TextUtils; -import androidx.appcompat.app.AlertDialog.Builder; - import com.android.settingslib.RestrictedLockUtils; /** @@ -49,20 +46,20 @@ class ManagedDeviceActionDisabledByAdminController implements @Override public void updateEnforcedAdmin(RestrictedLockUtils.EnforcedAdmin admin, int adminUserId) { mEnforcementAdminUserId = adminUserId; - mEnforcedAdmin = requireNonNull(admin); + mEnforcedAdmin = requireNonNull(admin, "admin cannot be null"); } @Override - public void setupLearnMoreButton(Activity activity, Builder builder) { + public void setupLearnMoreButton(Context context, Object alertDialogBuilder) { String url = mStringProvider.getLearnMoreHelpPageUrl(); if (TextUtils.isEmpty(url)) { mHelper.setupLearnMoreButtonToShowAdminPolicies( - activity, - builder, + context, + alertDialogBuilder, mEnforcementAdminUserId, mEnforcedAdmin); } else { - mHelper.setupLearnMoreButtonToLaunchHelpPage(activity, builder, url); + mHelper.setupLearnMoreButtonToLaunchHelpPage(context, alertDialogBuilder, url); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java index 38172f7600a6..f52335489415 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java @@ -31,7 +31,9 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; +import android.graphics.drawable.BitmapDrawable; import android.media.AudioManager; +import android.util.LruCache; import com.android.settingslib.R; import com.android.settingslib.testutils.shadow.ShadowBluetoothAdapter; @@ -961,6 +963,10 @@ public class CachedBluetoothDeviceTest { @Test public void getDrawableWithDescription_isAdvancedDevice_returnAdvancedIcon() { + LruCache lruCache = mock(LruCache.class); + mCachedDevice.mDrawableCache = lruCache; + BitmapDrawable drawable = mock(BitmapDrawable.class); + when(lruCache.get("fake_uri")).thenReturn(drawable); when(mDevice.getMetadata(BluetoothDevice.METADATA_MAIN_ICON)) .thenReturn("fake_uri".getBytes()); when(mDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/ActivityTileTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/ActivityTileTest.java index 4f8ecf8f8823..aa6b0bf33b69 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/ActivityTileTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/ActivityTileTest.java @@ -105,11 +105,10 @@ public class ActivityTileTest { } @Test - public void getIcon_noIconMetadata_returnActivityIcon() { - mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON, 0); + public void getIcon_transparentColorInMetadata_returnNull() { + mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON, android.R.color.transparent); - assertThat(mTile.getIcon(RuntimeEnvironment.application).getResId()) - .isEqualTo(mActivityInfo.icon); + assertThat(mTile.getIcon(RuntimeEnvironment.application)).isNull(); } @Test diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java index e0c94241c462..4b517906aaa7 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java @@ -19,6 +19,7 @@ package com.android.settingslib.enterprise; import static com.google.common.truth.Truth.assertThat; import android.app.Activity; +import android.content.Context; import androidx.appcompat.app.AlertDialog; @@ -37,15 +38,15 @@ class ActionDisabledByAdminControllerTestUtils { ActionDisabledLearnMoreButtonLauncher createLearnMoreButtonLauncher() { return new ActionDisabledLearnMoreButtonLauncher() { @Override - public void setupLearnMoreButtonToShowAdminPolicies(Activity activity, - AlertDialog.Builder builder, int enforcementAdminUserId, + public void setupLearnMoreButtonToShowAdminPolicies(Context context, + Object alertDialogBuilder, int enforcementAdminUserId, RestrictedLockUtils.EnforcedAdmin enforcedAdmin) { mLearnMoreButtonAction = LEARN_MORE_ACTION_SHOW_ADMIN_POLICIES; } @Override - public void setupLearnMoreButtonToLaunchHelpPage(Activity activity, - AlertDialog.Builder builder, String url) { + public void setupLearnMoreButtonToLaunchHelpPage(Context context, + Object alertDialogBuilder, String url) { mLearnMoreButtonAction = LEARN_MORE_ACTION_LAUNCH_HELP_PAGE; } }; diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 6e256c1dbf8b..d2947c648b0a 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -528,6 +528,7 @@ <!-- Permission required for hotword detection service CTS tests --> <uses-permission android:name="android.permission.MANAGE_HOTWORD_DETECTION" /> + <uses-permission android:name="android.permission.BIND_HOTWORD_DETECTION_SERVICE" /> <uses-permission android:name="android.permission.MANAGE_APP_HIBERNATION"/> diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt index 1cf0c5f52bb4..2b8773783048 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt @@ -4,12 +4,15 @@ import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.animation.ValueAnimator import android.app.ActivityManager +import android.app.ActivityTaskManager import android.app.PendingIntent import android.content.Context import android.graphics.Matrix import android.graphics.Rect +import android.graphics.RectF import android.os.Looper import android.os.RemoteException +import android.util.Log import android.util.MathUtils import android.view.IRemoteAnimationFinishedCallback import android.view.IRemoteAnimationRunner @@ -30,6 +33,8 @@ import kotlin.math.roundToInt * nicely into the starting window. */ class ActivityLaunchAnimator(context: Context) { + private val TAG = this::class.java.simpleName + companion object { const val ANIMATION_DURATION = 500L const val ANIMATION_DURATION_FADE_OUT_CONTENT = 183L @@ -78,29 +83,49 @@ class ActivityLaunchAnimator(context: Context) { * If [controller] is null or [animate] is false, then the intent will be started and no * animation will run. * + * If possible, you should pass the [packageName] of the intent that will be started so that + * trampoline activity launches will also be animated. + * * This method will throw any exception thrown by [intentStarter]. */ @JvmOverloads - inline fun startIntentWithAnimation( + fun startIntentWithAnimation( controller: Controller?, animate: Boolean = true, + packageName: String? = null, intentStarter: (RemoteAnimationAdapter?) -> Int ) { if (controller == null || !animate) { + Log.d(TAG, "Starting intent with no animation") intentStarter(null) controller?.callOnIntentStartedOnMainThread(willAnimate = false) return } + Log.d(TAG, "Starting intent with a launch animation") val runner = Runner(controller) val animationAdapter = RemoteAnimationAdapter( runner, ANIMATION_DURATION, ANIMATION_DURATION - 150 /* statusBarTransitionDelay */ ) + + // Register the remote animation for the given package to also animate trampoline + // activity launches. + if (packageName != null) { + try { + ActivityTaskManager.getService().registerRemoteAnimationForNextActivityStart( + packageName, animationAdapter) + } catch (e: RemoteException) { + Log.w(TAG, "Unable to register the remote animation", e) + } + } + val launchResult = intentStarter(animationAdapter) val willAnimate = launchResult == ActivityManager.START_TASK_TO_FRONT || launchResult == ActivityManager.START_SUCCESS + + Log.d(TAG, "launchResult=$launchResult willAnimate=$willAnimate") controller.callOnIntentStartedOnMainThread(willAnimate) // If we expect an animation, post a timeout to cancel it in case the remote animation is @@ -110,7 +135,6 @@ class ActivityLaunchAnimator(context: Context) { } } - @PublishedApi internal fun Controller.callOnIntentStartedOnMainThread(willAnimate: Boolean) { if (Looper.myLooper() != Looper.getMainLooper()) { this.launchContainer.context.mainExecutor.execute { @@ -125,15 +149,21 @@ class ActivityLaunchAnimator(context: Context) { * Same as [startIntentWithAnimation] but allows [intentStarter] to throw a * [PendingIntent.CanceledException] which must then be handled by the caller. This is useful * for Java caller starting a [PendingIntent]. + * + * If possible, you should pass the [packageName] of the intent that will be started so that + * trampoline activity launches will also be animated. */ @Throws(PendingIntent.CanceledException::class) @JvmOverloads fun startPendingIntentWithAnimation( controller: Controller?, animate: Boolean = true, + packageName: String? = null, intentStarter: PendingIntentStarter ) { - startIntentWithAnimation(controller, animate) { intentStarter.startPendingIntent(it) } + startIntentWithAnimation(controller, animate, packageName) { + intentStarter.startPendingIntent(it) + } } /** Create a new animation [Runner] controlled by [controller]. */ @@ -278,11 +308,14 @@ class ActivityLaunchAnimator(context: Context) { @VisibleForTesting inner class Runner(private val controller: Controller) : IRemoteAnimationRunner.Stub() { private val launchContainer = controller.launchContainer - @PublishedApi internal val context = launchContainer.context + private val context = launchContainer.context private val transactionApplier = SyncRtSurfaceTransactionApplier(launchContainer) private var animator: ValueAnimator? = null + private val matrix = Matrix() + private val invertMatrix = Matrix() private var windowCrop = Rect() + private var windowCropF = RectF() private var timedOut = false private var cancelled = false @@ -294,7 +327,6 @@ class ActivityLaunchAnimator(context: Context) { // posting it. private var onTimeout = Runnable { onAnimationTimedOut() } - @PublishedApi internal fun postTimeout() { launchContainer.postDelayed(onTimeout, LAUNCH_TIMEOUT) } @@ -336,11 +368,13 @@ class ActivityLaunchAnimator(context: Context) { remoteAnimationNonAppTargets: Array<out RemoteAnimationTarget>, iCallback: IRemoteAnimationFinishedCallback ) { + Log.d(TAG, "Remote animation started") val window = remoteAnimationTargets.firstOrNull { it.mode == RemoteAnimationTarget.MODE_OPENING } if (window == null) { + Log.d(TAG, "Aborting the animation as no window is opening") removeTimeout() invokeCallback(iCallback) controller.onLaunchAnimationCancelled() @@ -399,10 +433,12 @@ class ActivityLaunchAnimator(context: Context) { animator.addListener(object : AnimatorListenerAdapter() { override fun onAnimationStart(animation: Animator?, isReverse: Boolean) { + Log.d(TAG, "Animation started") controller.onLaunchAnimationStart(isExpandingFullyAbove) } override fun onAnimationEnd(animation: Animator?) { + Log.d(TAG, "Animation ended") invokeCallback(iCallback) controller.onLaunchAnimationEnd(isExpandingFullyAbove) } @@ -447,19 +483,52 @@ class ActivityLaunchAnimator(context: Context) { } private fun applyStateToWindow(window: RemoteAnimationTarget, state: State) { - val m = Matrix() - m.postTranslate(0f, (state.top - window.sourceContainerBounds.top).toFloat()) - windowCrop.set(state.left, 0, state.right, state.height) + val screenBounds = window.screenSpaceBounds + val centerX = (screenBounds.left + screenBounds.right) / 2f + val centerY = (screenBounds.top + screenBounds.bottom) / 2f + val width = screenBounds.right - screenBounds.left + val height = screenBounds.bottom - screenBounds.top + + // Scale the window. We use the max of (widthRatio, heightRatio) so that there is no + // blank space on any side. + val widthRatio = state.width.toFloat() / width + val heightRatio = state.height.toFloat() / height + val scale = maxOf(widthRatio, heightRatio) + matrix.reset() + matrix.setScale(scale, scale, centerX, centerY) + + // Align it to the top and center it in the x-axis. + val heightChange = height * scale - height + val translationX = state.centerX - centerX + val translationY = state.top - screenBounds.top + heightChange / 2f + matrix.postTranslate(translationX, translationY) + + // Crop it. The matrix will also be applied to the crop, so we apply the inverse + // operation. Given that we only scale (by factor > 0) then translate, we can assume + // that the matrix is invertible. + val cropX = state.left.toFloat() - screenBounds.left + val cropY = state.top.toFloat() - screenBounds.top + windowCropF.set(cropX, cropY, cropX + state.width, cropY + state.height) + matrix.invert(invertMatrix) + invertMatrix.mapRect(windowCropF) + windowCrop.set( + windowCropF.left.roundToInt(), + windowCropF.top.roundToInt(), + windowCropF.right.roundToInt(), + windowCropF.bottom.roundToInt() + ) - val cornerRadius = minOf(state.topCornerRadius, state.bottomCornerRadius) + // The scale will also be applied to the corner radius, so we divide by the scale to + // keep the original radius. + val cornerRadius = minOf(state.topCornerRadius, state.bottomCornerRadius) / scale val params = SyncRtSurfaceTransactionApplier.SurfaceParams.Builder(window.leash) - .withAlpha(1f) - .withMatrix(m) - .withWindowCrop(windowCrop) - .withLayer(window.prefixOrderIndex) - .withCornerRadius(cornerRadius) - .withVisibility(true) - .build() + .withAlpha(1f) + .withMatrix(matrix) + .withWindowCrop(windowCrop) + .withLayer(window.prefixOrderIndex) + .withCornerRadius(cornerRadius) + .withVisibility(true) + .build() transactionApplier.scheduleApply(params) } @@ -474,12 +543,13 @@ class ActivityLaunchAnimator(context: Context) { val params = SyncRtSurfaceTransactionApplier.SurfaceParams.Builder(navigationBar.leash) if (fadeInProgress > 0) { - val m = Matrix() - m.postTranslate(0f, (state.top - navigationBar.sourceContainerBounds.top).toFloat()) + matrix.reset() + matrix.setTranslate( + 0f, (state.top - navigationBar.sourceContainerBounds.top).toFloat()) windowCrop.set(state.left, 0, state.right, state.height) params .withAlpha(NAV_FADE_IN_INTERPOLATOR.getInterpolation(fadeInProgress)) - .withMatrix(m) + .withMatrix(matrix) .withWindowCrop(windowCrop) .withVisibility(true) } else { @@ -496,6 +566,7 @@ class ActivityLaunchAnimator(context: Context) { return } + Log.d(TAG, "Remote animation timed out") timedOut = true controller.onLaunchAnimationCancelled() } @@ -505,6 +576,7 @@ class ActivityLaunchAnimator(context: Context) { return } + Log.d(TAG, "Remote animation was cancelled") cancelled = true removeTimeout() context.mainExecutor.execute { diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java b/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java index 044b5ed16b68..e1f72c193784 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java @@ -96,13 +96,18 @@ public class Interpolators { /** * Interpolate alpha for notifications background scrim during shade expansion. * @param fraction Shade expansion fraction + * @param forNotification If we want the alpha of the notification shade or the scrim. */ - public static float getNotificationScrimAlpha(float fraction) { + public static float getNotificationScrimAlpha(float fraction, boolean forNotification) { + if (!forNotification) { + fraction = MathUtils.saturate(1.7f * fraction); + } fraction = fraction * 1.2f - 0.2f; if (fraction <= 0) { return 0; } else { - return (float) (1f - 0.5f * (1f - Math.cos(3.14159f * Math.pow(1f - fraction, 2f)))); + final float oneMinusFrac = 1f - fraction; + return (float) (1f - 0.5f * (1f - Math.cos(3.14159f * oneMinusFrac * oneMinusFrac))); } } } diff --git a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java index b3c437480af7..989010e8730c 100644 --- a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java +++ b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java @@ -114,6 +114,11 @@ public interface BcSmartspaceDataPlugin extends Plugin { * Set or clear next alarm information */ void setNextAlarm(@Nullable Drawable image, @Nullable String description); + + /** + * Set or clear device media playing + */ + void setMediaTarget(@Nullable SmartspaceTarget target); } /** Interface for launching Intents, which can differ on the lockscreen */ diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml index 83a0a32f5eef..2742ac3de7a7 100644 --- a/packages/SystemUI/res-keyguard/values-eu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="514691256816366517">"Teklatu-babeslea"</string> <string name="keyguard_password_enter_pin_code" msgid="8582296866585566671">"Idatzi PIN kodea"</string> - <string name="keyguard_password_enter_puk_code" msgid="3813154965969758868">"Idatzi SIM txartelaren PUK kodea eta PIN kode berria"</string> + <string name="keyguard_password_enter_puk_code" msgid="3813154965969758868">"Idatzi SIM txartelaren PUKa eta PIN berria"</string> <string name="keyguard_password_enter_puk_prompt" msgid="3529260761374385243">"SIM txartelaren PUK kodea"</string> <string name="keyguard_password_enter_pin_prompt" msgid="2304037870481240781">"SIM txartelaren PIN berria"</string> <string name="keyguard_password_entry_touch_hint" msgid="6180028658339706333"><font size="17">"Pasahitza idazteko, sakatu hau"</font></string> @@ -31,7 +31,7 @@ <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Idatzi PIN kodea"</string> <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Marraztu eredua"</string> <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Idatzi pasahitza"</string> - <string name="keyguard_password_wrong_pin_code" msgid="3514267777289393046">"PIN kode hori ez da zuzena."</string> + <string name="keyguard_password_wrong_pin_code" msgid="3514267777289393046">"PINa ez da zuzena."</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Txartelak ez du balio."</string> <string name="keyguard_charged" msgid="5478247181205188995">"Kargatuta"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Hari gabe kargatzen"</string> diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml index d6fdfaf17e27..88c52d9be8f7 100644 --- a/packages/SystemUI/res-keyguard/values-lv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml @@ -39,7 +39,7 @@ <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Notiek ātrā uzlāde"</string> <string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Notiek lēnā uzlāde"</string> <string name="keyguard_plugged_in_charging_limited" msgid="1158086783302116604">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Akumulatora darbības optimizēšana"</string> - <string name="keyguard_low_battery" msgid="1868012396800230904">"Pievienojiet uzlādes ierīci."</string> + <string name="keyguard_low_battery" msgid="1868012396800230904">"Pievienojiet lādētāju."</string> <string name="keyguard_instructions_when_pattern_disabled" msgid="8448804180089936954">"Lai atbloķētu, nospiediet izvēlnes ikonu."</string> <string name="keyguard_network_locked_message" msgid="407096292844868608">"Tīkls ir bloķēts."</string> <string name="keyguard_missing_sim_message_short" msgid="704159478161444907">"Nav SIM kartes."</string> diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml index 4b6621379b44..caa216688cbc 100644 --- a/packages/SystemUI/res-keyguard/values/strings.xml +++ b/packages/SystemUI/res-keyguard/values/strings.xml @@ -79,8 +79,8 @@ is not fully charged, and it's plugged into a slow charger, say that it's charging slowly. --> <string name="keyguard_plugged_in_charging_slowly"><xliff:g id="percentage">%s</xliff:g> • Charging slowly</string> - <!-- When the lock screen is showing and the phone plugged in, and the defend mode is triggered, say that it's optimizing for battery health. --> - <string name="keyguard_plugged_in_charging_limited"><xliff:g id="percentage">%s</xliff:g> • Optimizing for battery health</string> + <!-- When the lock screen is showing and the phone plugged in, and the defend mode is triggered, say that it's charging temporarily limited. --> + <string name="keyguard_plugged_in_charging_limited"><xliff:g id="percentage">%s</xliff:g> • Charging temporarily limited</string> <!-- When the lock screen is showing and the battery is low, warn user to plug in the phone soon. --> diff --git a/packages/SystemUI/res/drawable/ic_cake.xml b/packages/SystemUI/res/drawable/ic_cake.xml new file mode 100644 index 000000000000..9c83b43ab057 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_cake.xml @@ -0,0 +1,24 @@ +<!-- + ~ Copyright (C) 2021 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. + --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:pathData="M19,14v-4c0,-1.1 -0.9,-2 -2,-2h-4L13,6.55c0.15,-0.09 0.29,-0.18 0.41,-0.31 0.39,-0.39 0.59,-0.92 0.59,-1.42s-0.2,-1.02 -0.59,-1.41L12,2l-1.41,1.41c-0.39,0.39 -0.59,0.91 -0.59,1.41s0.2,1.03 0.59,1.42c0.13,0.13 0.27,0.22 0.41,0.31L11,8L7,8c-1.1,0 -2,0.9 -2,2v4c-1.1,0 -2,0.9 -2,2v4c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-4c0,-1.1 -0.9,-2 -2,-2zM7,10h10v4L7,14v-4zM19,20L5,20v-4h14v4z" + android:fillColor="#FFFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_celebration.xml b/packages/SystemUI/res/drawable/ic_celebration.xml new file mode 100644 index 000000000000..10fe4066994c --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_celebration.xml @@ -0,0 +1,37 @@ +<!-- + ~ Copyright (C) 2021 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. + --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:pathData="M2,22l14,-5L7,8L2,22zM12.35,16.18L5.3,18.7l2.52,-7.05L12.35,16.18z" + android:fillColor="#FFFFFFFF"/> + <path + android:pathData="M14.53,12.53l5.59,-5.59c0.49,-0.49 1.28,-0.49 1.77,0l0.59,0.59l1.06,-1.06l-0.59,-0.59c-1.07,-1.07 -2.82,-1.07 -3.89,0l-5.59,5.59L14.53,12.53z" + android:fillColor="#FFFFFFFF"/> + <path + android:pathData="M10.06,6.88L9.47,7.47l1.06,1.06l0.59,-0.59c1.07,-1.07 1.07,-2.82 0,-3.89l-0.59,-0.59L9.47,4.53l0.59,0.59C10.54,5.6 10.54,6.4 10.06,6.88z" + android:fillColor="#FFFFFFFF"/> + <path + android:pathData="M17.06,11.88l-1.59,1.59l1.06,1.06l1.59,-1.59c0.49,-0.49 1.28,-0.49 1.77,0l1.61,1.61l1.06,-1.06l-1.61,-1.61C19.87,10.81 18.13,10.81 17.06,11.88z" + android:fillColor="#FFFFFFFF"/> + <path + android:pathData="M15.06,5.88l-3.59,3.59l1.06,1.06l3.59,-3.59c1.07,-1.07 1.07,-2.82 0,-3.89l-1.59,-1.59l-1.06,1.06l1.59,1.59C15.54,4.6 15.54,5.4 15.06,5.88z" + android:fillColor="#FFFFFFFF"/> +</vector> + diff --git a/packages/SystemUI/res/drawable/ic_gift.xml b/packages/SystemUI/res/drawable/ic_gift.xml new file mode 100644 index 000000000000..fab36c3ce0df --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_gift.xml @@ -0,0 +1,24 @@ +<!-- + ~ Copyright (C) 2021 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. + --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:pathData="M22,5h-5.18C16.93,4.69 17,4.35 17,4c0,-1.65 -1.35,-3 -3,-3c-0.77,0 -1.47,0.3 -2,0.78C11.47,1.3 10.77,1 10,1C8.35,1 7,2.35 7,4c0,0.35 0.07,0.69 0.18,1H2v6h2v11h16V11h2V5zM14,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1s-1,-0.45 -1,-1S13.45,3 14,3zM9,4c0,-0.55 0.45,-1 1,-1s1,0.45 1,1s-0.45,1 -1,1S9,4.55 9,4zM4,7h7v2H4V7zM6,11h5v9H6V11zM18,20h-5v-9h5V20zM20,9h-7V7h7V9z" + android:fillColor="#FFFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_pages.xml b/packages/SystemUI/res/drawable/ic_pages.xml new file mode 100644 index 000000000000..9cd076d10631 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_pages.xml @@ -0,0 +1,24 @@ +<!-- + ~ Copyright (C) 2021 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. + --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:pathData="M19,5v14L5,19L5,5h14m0,-2L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,17l1.57,-3.43L17,12l-3.43,-1.57L12,7l-1.57,3.43L7,12l3.43,1.57L12,17z" + android:fillColor="#FFFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_play_games.xml b/packages/SystemUI/res/drawable/ic_play_games.xml new file mode 100644 index 000000000000..20096f45b812 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_play_games.xml @@ -0,0 +1,24 @@ +<!-- + ~ Copyright (C) 2021 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. + --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:pathData="M20.47,8c-0.39,-2.3 -2.4,-4 -4.81,-4L8.34,4C5.93,4 3.93,5.7 3.53,8 3.53,8 2,16.8 2,16.93 2,18.07 2.93,19 4.07,19c0.57,0 1.09,-0.2 1.47,-0.58L9,15h6l3.46,3.42c0.38,0.38 0.89,0.58 1.47,0.58 1.15,0 2.07,-0.93 2.07,-2.07C22,16.8 20.47,8 20.47,8zM11,10L9,10v2L8,12v-2L6,10L6,9h2L8,7h1v2h2v1zM13.8,10.3c-0.44,0 -0.8,-0.36 -0.8,-0.8 0,-0.44 0.36,-0.8 0.8,-0.8 0.44,0 0.8,0.36 0.8,0.8 0,0.44 -0.36,0.8 -0.8,0.8zM15.49,12c-0.44,0 -0.8,-0.36 -0.8,-0.8 0,-0.44 0.36,-0.8 0.8,-0.8 0.44,0 0.8,0.36 0.8,0.8 0,0.44 -0.36,0.8 -0.8,0.8zM15.49,8.6c-0.44,0 -0.8,-0.36 -0.8,-0.8s0.36,-0.8 0.8,-0.8c0.44,0 0.8,0.36 0.8,0.8s-0.36,0.8 -0.8,0.8zM17.2,10.3c-0.44,0 -0.8,-0.36 -0.8,-0.8 0,-0.44 0.36,-0.8 0.8,-0.8s0.8,0.36 0.8,0.8c0,0.44 -0.36,0.8 -0.8,0.8z" + android:fillColor="#FFFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_video.xml b/packages/SystemUI/res/drawable/ic_video.xml new file mode 100644 index 000000000000..3668338a0e43 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_video.xml @@ -0,0 +1,24 @@ +<!-- + ~ Copyright (C) 2021 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. + --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:pathData="M9,7v8l7,-4zM21,3L3,3c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h5v2h8v-2h5c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,17L3,17L3,5h18v12z" + android:fillColor="#FFFFFFFF"/> +</vector> diff --git a/packages/SystemUI/res/drawable/volume_background_bottom.xml b/packages/SystemUI/res/drawable/volume_background_bottom.xml new file mode 100644 index 000000000000..ae3d15991f65 --- /dev/null +++ b/packages/SystemUI/res/drawable/volume_background_bottom.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2021 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 + --> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> + <size android:width="@dimen/volume_dialog_panel_width" /> + <solid android:color="?androidprv:attr/colorSurface" /> + <corners android:bottomLeftRadius="@dimen/volume_dialog_panel_width_half" + android:bottomRightRadius="@dimen/volume_dialog_panel_width_half"/> +</shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/volume_background.xml b/packages/SystemUI/res/drawable/volume_background_top.xml index 66f1d0da4990..3cd87fc32061 100644 --- a/packages/SystemUI/res/drawable/volume_background.xml +++ b/packages/SystemUI/res/drawable/volume_background_top.xml @@ -20,7 +20,8 @@ <shape> <size android:width="@dimen/volume_dialog_panel_width" /> <solid android:color="?androidprv:attr/colorSurface" /> - <corners android:radius="@dimen/volume_dialog_panel_width_half"/> + <corners android:topLeftRadius="@dimen/volume_dialog_panel_width_half" + android:topRightRadius="@dimen/volume_dialog_panel_width_half"/> </shape> </item> </layer-list>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/volume_background_top_rounded.xml b/packages/SystemUI/res/drawable/volume_background_top_rounded.xml new file mode 100644 index 000000000000..77382e14631f --- /dev/null +++ b/packages/SystemUI/res/drawable/volume_background_top_rounded.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2021 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" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> + <item> + <shape> + <size android:width="@dimen/volume_dialog_panel_width" /> + <solid android:color="?androidprv:attr/colorSurface" /> + <corners android:topLeftRadius="@dimen/volume_dialog_panel_width_half" + android:topRightRadius="@dimen/volume_dialog_panel_width_half" + android:bottomLeftRadius="@dimen/volume_dialog_panel_width_half" + android:bottomRightRadius="@dimen/volume_dialog_panel_width_half"/> + </shape> + </item> +</layer-list>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/volume_row_rounded_background.xml b/packages/SystemUI/res/drawable/volume_row_rounded_background.xml new file mode 100644 index 000000000000..95ba73df61c4 --- /dev/null +++ b/packages/SystemUI/res/drawable/volume_row_rounded_background.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2021 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 + --> + +<shape xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> + <size android:width="@dimen/volume_dialog_panel_width" /> + <solid android:color="?androidprv:attr/colorSurface" /> + <corners android:radius="@dimen/volume_dialog_panel_width_half"/> +</shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout-land-television/volume_dialog.xml b/packages/SystemUI/res/layout-land-television/volume_dialog.xml index 8adc6eb753b5..6b5629facd41 100644 --- a/packages/SystemUI/res/layout-land-television/volume_dialog.xml +++ b/packages/SystemUI/res/layout-land-television/volume_dialog.xml @@ -32,7 +32,7 @@ android:clipToPadding="false"> <LinearLayout - android:id="@+id/main" + android:id="@+id/volume_dialog_rows_container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" diff --git a/packages/SystemUI/res/layout-land/volume_dialog.xml b/packages/SystemUI/res/layout-land/volume_dialog.xml index 237dc02e5d8c..f1cda277f045 100644 --- a/packages/SystemUI/res/layout-land/volume_dialog.xml +++ b/packages/SystemUI/res/layout-land/volume_dialog.xml @@ -16,6 +16,7 @@ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:sysui="http://schemas.android.com/apk/res-auto" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:id="@+id/volume_dialog_container" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -24,64 +25,28 @@ android:background="@android:color/transparent" android:theme="@style/volume_dialog_theme"> - <FrameLayout + <!-- right-aligned to be physically near volume button --> + <LinearLayout android:id="@+id/volume_dialog" - android:minWidth="@dimen/volume_dialog_panel_width" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="right" android:layout_gravity="right" - android:background="@android:color/transparent" - android:paddingRight="@dimen/volume_dialog_stream_padding" - android:paddingLeft="@dimen/volume_dialog_panel_transparent_padding" - android:clipToPadding="false"> + android:layout_marginRight="@dimen/volume_dialog_panel_transparent_padding_right" + android:orientation="vertical" + android:clipToPadding="false" + android:clipChildren="false"> + - <!-- - Container for a) the ringer drawer and the caption button next to b) the volume rows. - --> <LinearLayout + android:id="@+id/volume_dialog_top_container" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:orientation="horizontal" + android:orientation="vertical" android:clipChildren="false" - android:clipToPadding="false"> - - <!-- The ringer drawer and the caption button. --> - <FrameLayout - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:paddingRight="@dimen/volume_dialog_stream_padding" - android:clipChildren="false" - android:clipToPadding="false" - android:orientation="vertical"> - - <include layout="@layout/volume_ringer_drawer" - android:layout_gravity="top|right"/> - - <FrameLayout - android:id="@+id/odi_captions" - android:layout_width="@dimen/volume_dialog_caption_size" - android:layout_height="@dimen/volume_dialog_caption_size" - android:gravity="center" - android:layout_gravity="bottom|right" - android:layout_marginBottom="@dimen/volume_dialog_tap_target_size" - android:clipToPadding="false"> - - <com.android.systemui.volume.CaptionsToggleImageButton - android:id="@+id/odi_captions_icon" - android:src="@drawable/ic_volume_odi_captions_disabled" - style="@style/VolumeButtons" - android:background="@drawable/rounded_ripple" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:tint="@color/caption_tint_color_selector" - android:layout_gravity="center" - android:soundEffectsEnabled="false" - sysui:optedOut="false"/> + android:gravity="right"> - </FrameLayout> - - </FrameLayout> + <include layout="@layout/volume_ringer_drawer" /> <FrameLayout android:visibility="gone" @@ -102,40 +67,42 @@ android:layout_height="match_parent" android:scaleType="fitCenter" android:padding="@dimen/volume_dialog_ringer_icon_padding" - android:tint="@color/accent_tint_color_selector" + android:tint="?android:attr/textColorPrimary" android:layout_gravity="center" android:soundEffectsEnabled="false" /> <include layout="@layout/volume_dnd_icon" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginRight="@dimen/volume_dialog_stream_padding" - android:layout_marginTop="6dp"/> + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginRight="@dimen/volume_dialog_stream_padding" + android:layout_marginTop="6dp"/> </FrameLayout> <LinearLayout - android:id="@+id/main" + android:id="@+id/volume_dialog_rows_container" android:layout_width="wrap_content" - android:minWidth="@dimen/volume_dialog_panel_width" android:layout_height="wrap_content" android:gravity="right" android:layout_gravity="right" android:orientation="vertical" android:clipChildren="false" - android:clipToPadding="false"> + android:clipToPadding="false" > <LinearLayout android:id="@+id/volume_dialog_rows" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:minWidth="@dimen/volume_dialog_panel_width" android:gravity="center" android:orientation="horizontal"> <!-- volume rows added and removed here! :-) --> </LinearLayout> <FrameLayout android:id="@+id/settings_container" - android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@drawable/volume_background_bottom" + android:paddingLeft="@dimen/volume_dialog_ringer_rows_padding" + android:paddingBottom="@dimen/volume_dialog_ringer_rows_padding" + android:paddingRight="@dimen/volume_dialog_ringer_rows_padding"> <com.android.keyguard.AlphaOptimizedImageButton android:id="@+id/settings" android:src="@drawable/horizontal_ellipsis" @@ -144,23 +111,43 @@ android:layout_gravity="center" android:contentDescription="@string/accessibility_volume_settings" android:background="@drawable/ripple_drawable_20dp" - android:tint="?android:attr/colorBackgroundFloating" + android:tint="?androidprv:attr/colorAccent" android:soundEffectsEnabled="false" /> </FrameLayout> </LinearLayout> </LinearLayout> - <ViewStub - android:id="@+id/odi_captions_tooltip_stub" - android:inflatedId="@+id/odi_captions_tooltip_view" - android:layout="@layout/volume_tool_tip_view" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginRight="@dimen/volume_tool_tip_right_margin" - android:layout_marginTop="@dimen/volume_tool_tip_top_margin" - android:layout_gravity="right"/> + <FrameLayout + android:id="@+id/odi_captions" + android:layout_width="@dimen/volume_dialog_caption_size" + android:layout_height="@dimen/volume_dialog_caption_size" + android:layout_marginTop="@dimen/volume_dialog_row_margin_bottom" + android:gravity="right" + android:layout_gravity="right" + android:clipToPadding="false" + android:clipToOutline="true" + android:background="@drawable/volume_row_rounded_background"> + <com.android.systemui.volume.CaptionsToggleImageButton + android:id="@+id/odi_captions_icon" + android:src="@drawable/ic_volume_odi_captions_disabled" + style="@style/VolumeButtons" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:tint="?android:attr/colorAccent" + android:layout_gravity="center" + android:soundEffectsEnabled="false" + sysui:optedOut="false"/> + </FrameLayout> + </LinearLayout> - </FrameLayout> + <ViewStub + android:id="@+id/odi_captions_tooltip_stub" + android:inflatedId="@+id/odi_captions_tooltip_view" + android:layout="@layout/volume_tool_tip_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom | right" + android:layout_marginRight="@dimen/volume_tool_tip_right_margin"/> </FrameLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/long_screenshot.xml b/packages/SystemUI/res/layout/long_screenshot.xml index 9430862db623..de3384657d9d 100644 --- a/packages/SystemUI/res/layout/long_screenshot.xml +++ b/packages/SystemUI/res/layout/long_screenshot.xml @@ -33,7 +33,7 @@ android:layout_marginStart="8dp" android:layout_marginTop="4dp" android:backgroundTint="?androidprv:attr/colorAccentSecondary" - android:textColor="?android:textColorPrimary" + android:textColor="?android:textColorSecondary" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@id/preview" /> @@ -117,7 +117,7 @@ android:backgroundTint="?androidprv:attr/colorAccentSecondary" android:src="@drawable/ic_screenshot_edit" android:contentDescription="@string/screenshot_edit_label" - android:tint="?android:textColorPrimary" + android:tint="?android:textColorSecondary" android:padding="16dp" android:scaleType="fitCenter" app:layout_constraintBottom_toBottomOf="parent" diff --git a/packages/SystemUI/res/layout/media_carousel.xml b/packages/SystemUI/res/layout/media_carousel.xml index 87acfd088939..52132e881c43 100644 --- a/packages/SystemUI/res/layout/media_carousel.xml +++ b/packages/SystemUI/res/layout/media_carousel.xml @@ -22,6 +22,7 @@ android:layout_height="wrap_content" android:clipChildren="false" android:clipToPadding="false" + android:forceHasOverlappingRendering="false" android:theme="@style/MediaPlayer"> <com.android.systemui.media.MediaScrollView android:id="@+id/media_carousel_scroller" diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packages/SystemUI/res/layout/navigation_bar.xml index a2a14c754e98..5f59e781ef5e 100644 --- a/packages/SystemUI/res/layout/navigation_bar.xml +++ b/packages/SystemUI/res/layout/navigation_bar.xml @@ -22,11 +22,15 @@ android:id="@+id/navigation_bar_view" android:layout_height="match_parent" android:layout_width="match_parent" + android:clipChildren="false" + android:clipToPadding="false" android:background="@drawable/system_bar_background"> <com.android.systemui.navigationbar.NavigationBarInflaterView android:id="@+id/navigation_inflater" android:layout_width="match_parent" - android:layout_height="match_parent" /> + android:layout_height="match_parent" + android:clipChildren="false" + android:clipToPadding="false" /> </com.android.systemui.navigationbar.NavigationBarView> diff --git a/packages/SystemUI/res/layout/navigation_layout.xml b/packages/SystemUI/res/layout/navigation_layout.xml index 64c7422c27ed..46f238cbe588 100644 --- a/packages/SystemUI/res/layout/navigation_layout.xml +++ b/packages/SystemUI/res/layout/navigation_layout.xml @@ -23,6 +23,8 @@ android:layout_marginEnd="@dimen/rounded_corner_content_padding" android:paddingStart="@dimen/nav_content_padding" android:paddingEnd="@dimen/nav_content_padding" + android:clipChildren="false" + android:clipToPadding="false" android:id="@+id/horizontal"> <com.android.systemui.navigationbar.buttons.NearestTouchFrame diff --git a/packages/SystemUI/res/layout/ongoing_call_chip.xml b/packages/SystemUI/res/layout/ongoing_call_chip.xml index f8175d476630..5389d9bbcc97 100644 --- a/packages/SystemUI/res/layout/ongoing_call_chip.xml +++ b/packages/SystemUI/res/layout/ongoing_call_chip.xml @@ -23,6 +23,7 @@ android:layout_gravity="center_vertical|start" > <LinearLayout + android:id="@+id/ongoing_call_chip_background" android:layout_width="wrap_content" android:layout_height="@dimen/ongoing_appops_chip_height" android:layout_gravity="center_vertical" diff --git a/packages/SystemUI/res/layout/people_tile_large_with_content.xml b/packages/SystemUI/res/layout/people_tile_large_with_content.xml index 4994c696e902..b7e86a3b0b84 100644 --- a/packages/SystemUI/res/layout/people_tile_large_with_content.xml +++ b/packages/SystemUI/res/layout/people_tile_large_with_content.xml @@ -14,6 +14,7 @@ ~ limitations under the License. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" @@ -34,8 +35,6 @@ <ImageView android:id="@+id/person_icon" - android:layout_marginStart="-2dp" - android:layout_marginTop="-2dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" /> @@ -54,7 +53,7 @@ android:paddingStart="8dp" android:paddingEnd="8dp" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem" - android:textColor="?android:attr/textColorPrimary" + android:textColor="?androidprv:attr/textColorOnAccent" android:background="@drawable/people_space_messages_count_background" android:textSize="14sp" android:maxLines="1" @@ -73,12 +72,12 @@ <include layout="@layout/people_tile_emoji_background_large" /> <TextView - android:layout_gravity="top" android:id="@+id/name" - android:layout_width="match_parent" + android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="@dimen/below_name_text_padding" - android:gravity="start|top" + android:layout_gravity="start|center_vertical" + android:gravity="start|center_vertical" android:singleLine="true" android:ellipsize="end" android:text="@string/empty_user_name" @@ -103,7 +102,7 @@ <ImageView android:id="@+id/predefined_icon" - android:tint="?android:attr/colorAccent" + android:tint="?android:attr/textColorTertiary" android:gravity="start|center_vertical" android:layout_width="@dimen/regular_predefined_icon" android:layout_height="@dimen/regular_predefined_icon" /> diff --git a/packages/SystemUI/res/layout/people_tile_medium_empty.xml b/packages/SystemUI/res/layout/people_tile_medium_empty.xml index bebc872be514..8b2fddc5c927 100644 --- a/packages/SystemUI/res/layout/people_tile_medium_empty.xml +++ b/packages/SystemUI/res/layout/people_tile_medium_empty.xml @@ -27,19 +27,23 @@ android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> - <ImageView - android:id="@+id/person_icon" - android:layout_marginTop="-2dp" - android:layout_marginStart="-2dp" - android:layout_width="64dp" - android:layout_height="64dp" /> - <ImageView - android:id="@+id/availability" - android:gravity="top" - android:layout_marginStart="-2dp" - android:layout_width="10dp" - android:layout_height="10dp" - android:background="@drawable/availability_dot_10dp" /> + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <ImageView + android:id="@+id/person_icon" + android:layout_width="64dp" + android:layout_height="64dp" /> + <ImageView + android:id="@+id/availability" + android:layout_width="10dp" + android:layout_height="10dp" + android:gravity="top" + android:layout_gravity="top" + android:layout_marginStart="-2dp" + android:background="@drawable/availability_dot_10dp" /> + </LinearLayout> <LinearLayout android:orientation="vertical" android:paddingStart="4dp" diff --git a/packages/SystemUI/res/layout/people_tile_medium_with_content.xml b/packages/SystemUI/res/layout/people_tile_medium_with_content.xml index a7a635482cc6..1086a1361366 100644 --- a/packages/SystemUI/res/layout/people_tile_medium_with_content.xml +++ b/packages/SystemUI/res/layout/people_tile_medium_with_content.xml @@ -16,6 +16,7 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:theme="@android:style/Theme.DeviceDefault.DayNight" android:id="@+id/item" android:background="@drawable/people_space_tile_view_card" @@ -47,8 +48,6 @@ <ImageView android:gravity="start" android:id="@+id/person_icon" - android:layout_marginStart="-2dp" - android:layout_marginTop="-2dp" android:layout_width="52dp" android:layout_height="52dp" /> @@ -112,7 +111,8 @@ android:clipToOutline="true"> <TextView android:id="@+id/name" - android:gravity="center_vertical" + android:layout_gravity="start|center_vertical" + android:gravity="start|center_vertical" android:layout_weight="1" android:text="@string/empty_user_name" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem" @@ -129,7 +129,7 @@ android:paddingStart="8dp" android:paddingEnd="8dp" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem" - android:textColor="?android:attr/textColorPrimary" + android:textColor="?androidprv:attr/textColorOnAccent" android:background="@drawable/people_space_messages_count_background" android:textSize="14sp" android:maxLines="1" @@ -140,7 +140,7 @@ /> <ImageView android:id="@+id/predefined_icon" - android:tint="?android:attr/colorAccent" + android:tint="?android:attr/textColorTertiary" android:gravity="end|center_vertical" android:layout_width="@dimen/regular_predefined_icon" android:layout_height="@dimen/regular_predefined_icon" /> diff --git a/packages/SystemUI/res/layout/people_tile_small.xml b/packages/SystemUI/res/layout/people_tile_small.xml index 4e5c04cb5ad6..22fcd3bcce37 100644 --- a/packages/SystemUI/res/layout/people_tile_small.xml +++ b/packages/SystemUI/res/layout/people_tile_small.xml @@ -14,6 +14,7 @@ ~ limitations under the License. --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:theme="@android:style/Theme.DeviceDefault.DayNight" android:layout_width="match_parent" android:layout_height="match_parent"> @@ -39,7 +40,7 @@ <ImageView android:id="@+id/predefined_icon" - android:tint="?android:attr/colorAccent" + android:tint="?android:attr/textColorTertiary" android:layout_gravity="center" android:layout_width="18dp" android:layout_height="22dp" /> @@ -50,7 +51,7 @@ android:gravity="center" android:paddingHorizontal="8dp" android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem" - android:textColor="?android:attr/textColorPrimary" + android:textColor="?androidprv:attr/textColorOnAccent" android:background="@drawable/people_space_messages_count_background" android:textSize="@dimen/name_text_size_for_small" android:maxLines="1" diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index 3543fd11d64a..fb39d3e4027d 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -64,10 +64,6 @@ android:clipToPadding="false" android:clipChildren="false"> - <include - layout="@layout/keyguard_status_view" - android:visibility="gone"/> - <com.android.systemui.scrim.ScrimView android:id="@+id/scrim_notifications" android:layout_width="0dp" @@ -78,7 +74,11 @@ systemui:layout_constraintEnd_toEndOf="parent" systemui:layout_constraintTop_toTopOf="parent" systemui:layout_constraintBottom_toBottomOf="parent" - /> + /> + + <include + layout="@layout/keyguard_status_view" + android:visibility="gone"/> <include layout="@layout/dock_info_overlay" /> @@ -129,7 +129,22 @@ android:layout_marginTop="@dimen/status_bar_header_height_keyguard" android:text="@string/report_rejected_touch" android:visibility="gone" /> - + <com.android.systemui.statusbar.phone.TapAgainView + android:id="@+id/shade_falsing_tap_again" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + systemui:layout_constraintLeft_toLeftOf="parent" + systemui:layout_constraintRight_toRightOf="parent" + systemui:layout_constraintBottom_toBottomOf="parent" + android:layout_marginBottom="20dp" + android:paddingHorizontal="16dp" + android:minHeight="44dp" + android:elevation="4dp" + android:background="@drawable/rounded_bg_full" + android:gravity="center" + android:text="@string/tap_again" + android:visibility="gone" + /> </com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer> <FrameLayout diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml index a39006c70fa7..51718d9af054 100644 --- a/packages/SystemUI/res/layout/volume_dialog.xml +++ b/packages/SystemUI/res/layout/volume_dialog.xml @@ -37,15 +37,13 @@ android:clipToPadding="false" android:clipChildren="false"> - <LinearLayout - android:id="@+id/volume_dialog_ringer_and_rows_container" + android:id="@+id/volume_dialog_top_container" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="7dp" android:clipChildren="false" - android:background="@drawable/volume_background"> + android:orientation="vertical" + android:gravity="right"> <include layout="@layout/volume_ringer_drawer" /> @@ -80,7 +78,7 @@ </FrameLayout> <LinearLayout - android:id="@+id/main" + android:id="@+id/volume_dialog_rows_container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="right" @@ -93,14 +91,17 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:orientation="horizontal" - android:layout_marginTop="@dimen/volume_row_slider_padding_start"> + android:orientation="horizontal"> <!-- volume rows added and removed here! :-) --> </LinearLayout> <FrameLayout android:id="@+id/settings_container" - android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@drawable/volume_background_bottom" + android:paddingLeft="@dimen/volume_dialog_ringer_rows_padding" + android:paddingBottom="@dimen/volume_dialog_ringer_rows_padding" + android:paddingRight="@dimen/volume_dialog_ringer_rows_padding"> <com.android.keyguard.AlphaOptimizedImageButton android:id="@+id/settings" android:src="@drawable/horizontal_ellipsis" @@ -122,9 +123,10 @@ android:layout_height="@dimen/volume_dialog_caption_size" android:layout_marginTop="@dimen/volume_dialog_row_margin_bottom" android:gravity="right" - android:layout_gravity="center" + android:layout_gravity="right" android:clipToPadding="false" - android:background="@drawable/volume_background"> + android:clipToOutline="true" + android:background="@drawable/volume_row_rounded_background"> <com.android.systemui.volume.CaptionsToggleImageButton android:id="@+id/odi_captions_icon" android:src="@drawable/ic_volume_odi_captions_disabled" @@ -145,7 +147,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom | right" - android:layout_marginRight="@dimen/volume_tool_tip_right_margin" - android:layout_marginBottom="@dimen/volume_tool_tip_bottom_margin"/> + android:layout_marginRight="@dimen/volume_tool_tip_right_margin"/> </FrameLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml index 4b5a008b896b..ee89b97a4a9c 100644 --- a/packages/SystemUI/res/layout/volume_dialog_row.xml +++ b/packages/SystemUI/res/layout/volume_dialog_row.xml @@ -17,15 +17,18 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:tag="row" android:layout_height="wrap_content" - android:layout_width="@dimen/volume_dialog_slider_width" + android:layout_width="@dimen/volume_dialog_panel_width" android:clipChildren="false" android:clipToPadding="false" - android:translationZ="@dimen/volume_dialog_elevation" + android:gravity="center" + android:paddingTop="@dimen/volume_dialog_ringer_rows_padding" + android:paddingBottom="@dimen/volume_dialog_ringer_rows_padding" + android:background="@drawable/volume_row_rounded_background" android:theme="@style/volume_dialog_theme"> <LinearLayout android:layout_height="wrap_content" - android:layout_width="@dimen/volume_dialog_slider_width" + android:layout_width="@dimen/volume_dialog_panel_width" android:gravity="center" android:layout_gravity="center" android:orientation="vertical" > @@ -57,6 +60,7 @@ android:thumb="@null" android:splitTrack="false" android:progressDrawable="@drawable/volume_row_seekbar" + android:background="@null" android:layoutDirection="ltr" android:rotation="270" /> </FrameLayout> diff --git a/packages/SystemUI/res/layout/volume_ringer_drawer.xml b/packages/SystemUI/res/layout/volume_ringer_drawer.xml index 9d14ac46e406..9b6c92c71e5d 100644 --- a/packages/SystemUI/res/layout/volume_ringer_drawer.xml +++ b/packages/SystemUI/res/layout/volume_ringer_drawer.xml @@ -18,9 +18,16 @@ <!-- Contains the active ringer icon and a hidden drawer containing all three ringer options. --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/volume_ringer_and_drawer_container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" + android:paddingLeft="@dimen/volume_dialog_ringer_rows_padding" + android:paddingTop="@dimen/volume_dialog_ringer_rows_padding" + android:paddingRight="@dimen/volume_dialog_ringer_rows_padding" + android:paddingBottom="@dimen/volume_dialog_ringer_rows_padding" + android:background="@drawable/volume_background_top" + android:layoutDirection="ltr" android:clipToPadding="false" android:clipChildren="false"> diff --git a/packages/SystemUI/res/layout/volume_tool_tip_view.xml b/packages/SystemUI/res/layout/volume_tool_tip_view.xml index 9fe885ebefc7..ee2496948752 100644 --- a/packages/SystemUI/res/layout/volume_tool_tip_view.xml +++ b/packages/SystemUI/res/layout/volume_tool_tip_view.xml @@ -17,6 +17,7 @@ <com.android.systemui.volume.VolumeToolTipView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:id="@+id/tooltip_view" android:layout_height="wrap_content" android:layout_width="wrap_content" @@ -35,7 +36,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:textColor="@android:color/white" + android:textColor="?android:attr/textColorPrimaryInverse" android:text="@string/volume_odi_captions_tip" android:textSize="14sp"/> <ImageView @@ -48,7 +49,7 @@ android:layout_marginEnd="2dp" android:alpha="0.7" android:src="@drawable/ic_remove_no_shadow" - android:tint="@android:color/white" + android:tint="?android:attr/textColorPrimaryInverse" android:background="?android:attr/selectableItemBackgroundBorderless" android:contentDescription="@string/accessibility_volume_close_odi_captions_tip"/> </LinearLayout> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 21c5d6eff1eb..31ff9c66b847 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -179,7 +179,7 @@ <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"لقد استنفدت عدد المحاولات غير الصحيحة وسيتم حذف هذا المستخدم."</string> <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"لقد استنفدت عدد المحاولات غير الصحيحة وسيتم حذف الملف الشخصي للعمل وبياناته."</string> <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"إغلاق"</string> - <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"المس زر استشعار بصمة الإصبع"</string> + <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"المس مستشعر بصمة الإصبع"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"رمز بصمة الإصبع"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"يتعذّر التعرّف على الوجه. استخدِم بصمة الإصبع بدلاً من ذلك."</string> <string name="fingerprint_dialog_use_fingerprint" msgid="923777032861374285">"عليك استخدام بصمة الإصبع للمتابعة."</string> @@ -431,8 +431,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"تم إيقاف الاتصال القريب المدى"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"تم تفعيل الاتصال القريب المدى"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"تسجيل الشاشة"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"بدء"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"إيقاف"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"هل تريد إزالة حظر ميكروفون الجهاز؟"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index cd6a00782b71..a288d6fe5274 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -408,8 +408,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="6798849610647988987">"<xliff:g id="DATA_USED">%s</xliff:g> ব্যৱহৃত"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সীমা"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সকীয়নি"</string> - <!-- no translation found for quick_settings_work_mode_label (6440531507319809121) --> - <skip /> + <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"কৰ্মস্থানৰ এপ্"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"ৰাতিৰ পোহৰ"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"সূৰ্যাস্তত অন কৰক"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"সূৰ্যোদয়ৰ লৈকে"</string> @@ -424,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC নিষ্ক্ৰিয় হৈ আছে"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC সক্ষম হৈ আছে"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"স্ক্ৰীন ৰেকৰ্ড কৰা"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"আৰম্ভ কৰক"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"বন্ধ কৰক"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ডিভাইচৰ মাইক্ৰ\'ফ\'ন অৱৰোধৰ পৰা আঁতৰাবনে?"</string> @@ -1042,8 +1040,7 @@ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"কাষলৈ নিয়ক আৰু লুকুৱাওক"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"কাষৰ বাহিৰলৈ নিয়ক আৰু দেখুৱাওক"</string> <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ট’গল কৰক"</string> - <!-- no translation found for quick_controls_title (7095074621086860062) --> - <skip /> + <string name="quick_controls_title" msgid="7095074621086860062">"গৃহ নিয়ন্ত্ৰণ"</string> <string name="controls_providers_title" msgid="6879775889857085056">"নিয়ন্ত্ৰণসমূহ যোগ কৰিবলৈ এপ্ বাছনি কৰক"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> টা নিয়ন্ত্ৰণ যোগ কৰা হ’ল।</item> @@ -1057,8 +1054,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"অপ্ৰিয়"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"<xliff:g id="NUMBER">%d</xliff:g> নম্বৰ অৱস্থানলৈ স্থানান্তৰিত কৰক"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"নিয়ন্ত্ৰণসমূহ"</string> - <!-- no translation found for controls_favorite_subtitle (6481675111056961083) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="6481675111056961083">"ক্ষিপ্ৰ ছেটিঙৰ পৰা এক্সেছ কৰিবলৈ নিয়ন্ত্ৰণসমূহ বাছনি কৰক"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"নিয়ন্ত্ৰণসমূহ পুনৰ সজাবলৈ ধৰি ৰাখক আৰু টানি আনি এৰক"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"সকলো নিয়ন্ত্ৰণ আঁতৰোৱা হৈছে"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"সালসলনিসমূহ ছেভ নহ’ল"</string> @@ -1097,8 +1093,7 @@ <string name="controls_error_generic" msgid="352500456918362905">"স্থিতি ল’ড কৰিব নোৱাৰি"</string> <string name="controls_error_failed" msgid="960228639198558525">"আসোঁৱাহ হৈছে, আকৌ চেষ্টা কৰক"</string> <string name="controls_in_progress" msgid="4421080500238215939">"চলি আছে"</string> - <!-- no translation found for controls_added_tooltip (5866098408470111984) --> - <skip /> + <string name="controls_added_tooltip" msgid="5866098408470111984">"নতুন নিয়ন্ত্ৰণসমূহ চাবলৈ ক্ষিপ্ৰ ছেটিং খোলক"</string> <string name="controls_menu_add" msgid="4447246119229920050">"নিয়ন্ত্ৰণসমূহ যোগ দিয়ক"</string> <string name="controls_menu_edit" msgid="890623986951347062">"নিয়ন্ত্ৰণসমূহ সম্পাদনা কৰক"</string> <string name="media_output_dialog_add_output" msgid="5642703238877329518">"আউটপুটসমূহ যোগ দিয়ক"</string> @@ -1117,16 +1112,11 @@ <string name="priority_conversations" msgid="3967482288896653039">"অগ্ৰাধিকাৰপ্ৰাপ্ত বাৰ্তালাপ"</string> <string name="recent_conversations" msgid="8531874684782574622">"শেহতীয়া বাৰ্তালাপ"</string> <string name="okay" msgid="6490552955618608554">"ঠিক আছে"</string> - <!-- no translation found for days_timestamp (5821854736213214331) --> - <skip /> - <!-- no translation found for one_week_timestamp (4925600765473875590) --> - <skip /> - <!-- no translation found for two_weeks_timestamp (9111801081871962155) --> - <skip /> - <!-- no translation found for over_one_week_timestamp (3770560704420807142) --> - <skip /> - <!-- no translation found for over_two_weeks_timestamp (6300507859007874050) --> - <skip /> + <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> দিন আগতে"</string> + <string name="one_week_timestamp" msgid="4925600765473875590">"১ সপ্তাহ আগতে"</string> + <string name="two_weeks_timestamp" msgid="9111801081871962155">"২ সপ্তাহ পূৰ্বে"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"১ সপ্তাহতকৈ বেছি আগতে"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"২ সপ্তাহতকৈ বেছি আগতে"</string> <string name="birthday_status" msgid="2596961629465396761">"জন্মদিন"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"এয়া <xliff:g id="NAME">%1$s</xliff:g>ৰ জন্মদিন"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"জন্মদিন সোনকালে আহি আছে"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 0a3e73f36e18..0e8cb5737fd8 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC deaktiv edilib"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC aktiv edilib"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Ekran yazması"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Başlayın"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Dayandırın"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Cihaz mikrofonu blokdan çıxarılsın?"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index bdf62a3c18ae..83c8513f6ad4 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -425,8 +425,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je onemogućen"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je omogućen"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Snimanje ekrana"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Počnite"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Zaustavite"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Želite da odblokirate mikrofon uređaja?"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 2f41132934d2..63ec9264961e 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -427,8 +427,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC адключаны"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC уключаны"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Запіс экрана"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Пачаць"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Спыніць"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Разблакіраваць мікрафон прылады?"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 14297dbc931a..a064d108e5b6 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"КБП е деактивирана"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"КБП е активирана"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Запис на екрана"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Старт"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Стоп"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Да се отблокира ли микрофонът на устройството?"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index e683594177b2..4400cfbc1588 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -408,8 +408,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="6798849610647988987">"<xliff:g id="DATA_USED">%s</xliff:g> ব্যবহৃত হয়েছে"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"সীমা <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সতর্কতা"</string> - <!-- no translation found for quick_settings_work_mode_label (6440531507319809121) --> - <skip /> + <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"অফিসের অ্যাপ"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"নাইট লাইট"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"সূর্যাস্তে চালু হবে"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"সূর্যোদয় পর্যন্ত"</string> @@ -1042,8 +1041,7 @@ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"প্রান্তে যান ও আড়াল করুন"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"প্রান্ত থেকে সরান এবং দেখুন"</string> <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"টগল করুন"</string> - <!-- no translation found for quick_controls_title (7095074621086860062) --> - <skip /> + <string name="quick_controls_title" msgid="7095074621086860062">"হোম কন্ট্রোল"</string> <string name="controls_providers_title" msgid="6879775889857085056">"কন্ট্রোল যোগ করতে অ্যাপ বেছে নিন"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g>টি কন্ট্রোল যোগ করা হয়েছে।</item> @@ -1057,8 +1055,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"পছন্দসই থেকে সরান"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"<xliff:g id="NUMBER">%d</xliff:g> অবস্থানে সরান"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"নিয়ন্ত্রণ"</string> - <!-- no translation found for controls_favorite_subtitle (6481675111056961083) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="6481675111056961083">"যে কন্ট্রোল অ্যাক্সেস করতে চান তা \'দ্রুত সেটিংস\' থেকে বেছে নিন"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"কন্ট্রোলগুলিকে আবার সাজানোর জন্য ধরে রেখে টেনে আনুন"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"সমস্ত কন্ট্রোল সরানো হয়েছে"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"পরিবর্তন সেভ করা হয়নি"</string> @@ -1097,8 +1094,7 @@ <string name="controls_error_generic" msgid="352500456918362905">"স্ট্যাটাস লোড করা যাচ্ছে না"</string> <string name="controls_error_failed" msgid="960228639198558525">"সমস্যা হয়েছে, আবার চেষ্টা করুন"</string> <string name="controls_in_progress" msgid="4421080500238215939">"চলছে"</string> - <!-- no translation found for controls_added_tooltip (5866098408470111984) --> - <skip /> + <string name="controls_added_tooltip" msgid="5866098408470111984">"নতুন কন্ট্রোলগুলি দেখতে \'দ্রুত সেটিংস\' খুলুন"</string> <string name="controls_menu_add" msgid="4447246119229920050">"কন্ট্রোল যোগ করুন"</string> <string name="controls_menu_edit" msgid="890623986951347062">"কন্ট্রোল এডিট করুন"</string> <string name="media_output_dialog_add_output" msgid="5642703238877329518">"আউটপুট যোগ করুন"</string> @@ -1117,16 +1113,11 @@ <string name="priority_conversations" msgid="3967482288896653039">"গুরুত্বপূর্ণ কথোপকথন"</string> <string name="recent_conversations" msgid="8531874684782574622">"সাম্প্রতিক কথোপকথন"</string> <string name="okay" msgid="6490552955618608554">"ঠিক আছে"</string> - <!-- no translation found for days_timestamp (5821854736213214331) --> - <skip /> - <!-- no translation found for one_week_timestamp (4925600765473875590) --> - <skip /> - <!-- no translation found for two_weeks_timestamp (9111801081871962155) --> - <skip /> - <!-- no translation found for over_one_week_timestamp (3770560704420807142) --> - <skip /> - <!-- no translation found for over_two_weeks_timestamp (6300507859007874050) --> - <skip /> + <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> দিন আগে"</string> + <string name="one_week_timestamp" msgid="4925600765473875590">"১ সপ্তাহ আগে"</string> + <string name="two_weeks_timestamp" msgid="9111801081871962155">"২ সপ্তাহ আগে"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"১ সপ্তাহেরও আগে"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"২ সপ্তাহেরও আগে"</string> <string name="birthday_status" msgid="2596961629465396761">"জন্মদিন"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"এটি হল <xliff:g id="NAME">%1$s</xliff:g>-এর জন্মদিন"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"জন্মদিন শীঘ্রই আসছে"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 058e8ed74c74..b0b012b0278b 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -425,7 +425,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je onemogućen"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je omogućen"</string> - <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Snimanje zaslona"</string> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Snimanje ekrana"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Započnite"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Zaustavite"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Deblokirati mikrofon uređaja?"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 59edc3f00a2a..06c25422b461 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -427,8 +427,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je vypnuto"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je zapnuto"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Záznam obrazovky"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Spustit"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Ukončit"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Odblokovat mikrofon zařízení?"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 7c35e07ab13e..5fd3c03327a4 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC er deaktiveret"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC er aktiveret"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Skærmoptagelse"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Start"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stop"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vil du fjerne blokeringen af enhedens mikrofone?"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index b8f6aa531b31..6220a48e664a 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ist deaktiviert"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ist aktiviert"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Bildschirmaufzeichnung"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Starten"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Beenden"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Blockierung des Gerätemikrofons aufheben?"</string> @@ -1113,16 +1112,11 @@ <string name="priority_conversations" msgid="3967482288896653039">"Vorrangige Unterhaltungen"</string> <string name="recent_conversations" msgid="8531874684782574622">"Neueste Unterhaltungen"</string> <string name="okay" msgid="6490552955618608554">"Ok"</string> - <!-- no translation found for days_timestamp (5821854736213214331) --> - <skip /> - <!-- no translation found for one_week_timestamp (4925600765473875590) --> - <skip /> - <!-- no translation found for two_weeks_timestamp (9111801081871962155) --> - <skip /> - <!-- no translation found for over_one_week_timestamp (3770560704420807142) --> - <skip /> - <!-- no translation found for over_two_weeks_timestamp (6300507859007874050) --> - <skip /> + <string name="days_timestamp" msgid="5821854736213214331">"Vor <xliff:g id="DURATION">%1$s</xliff:g> Tagen"</string> + <string name="one_week_timestamp" msgid="4925600765473875590">"Vor 1 Woche"</string> + <string name="two_weeks_timestamp" msgid="9111801081871962155">"Vor 2 Wochen"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"Vor über 1 Woche"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"Vor über 2 Wochen"</string> <string name="birthday_status" msgid="2596961629465396761">"Geburtstag"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"<xliff:g id="NAME">%1$s</xliff:g> hat heute Geburtstag"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"Bald Geburtstag"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 5cf9bdf8774a..29c938b6a5ba 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -535,7 +535,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"Este dispositivo pertenece a <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> y está conectado a VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Tu organización puede controlar el tráfico de red en tu perfil de trabajo"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Es posible que <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> controle el tráfico de red en tu perfil de trabajo"</string> - <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"El admin. de TI puede ver la actividad de red de tu perfil de trabajo"</string> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"El administrador de IT puede ver la actividad de red de tu perfil de trabajo"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Es posible que la red esté supervisada"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"Este dispositivo está conectado a VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Tu perfil de trabajo está conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index e3928ef8bde6..0b0936912897 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -547,7 +547,7 @@ <string name="monitoring_title" msgid="4063890083735924568">"Supervisión de red"</string> <string name="monitoring_subtitle_vpn" msgid="800485258004629079">"VPN"</string> <string name="monitoring_subtitle_network_logging" msgid="2444199331891219596">"Registro de red"</string> - <string name="monitoring_subtitle_ca_certificate" msgid="8588092029755175800">"Certificados de CA"</string> + <string name="monitoring_subtitle_ca_certificate" msgid="8588092029755175800">"Certificados AC"</string> <string name="disable_vpn" msgid="482685974985502922">"Inhabilitar VPN"</string> <string name="disconnect_vpn" msgid="26286850045344557">"Desconectar VPN"</string> <string name="monitoring_button_view_policies" msgid="3869724835853502410">"Ver políticas"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index fdc06fb1aec5..71ac58388017 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC on keelatud"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC on lubatud"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Ekraanisalvestus"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Alustage"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Peatage"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Kas tühistada seadme mikrofoni blokeerimine?"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 77911e9229b9..04abe9dc3ac2 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"Desgaituta dago NFC"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"Gaituta dago NFC"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Pantaila-grabaketa"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Hasi"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Gelditu"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Gailuaren mikrofonoa desblokeatu nahi duzu?"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 1af4a7b7dc36..18e33e5d375a 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC on poistettu käytöstä"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC on käytössä"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Näytön tallennus"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Aloita"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Lopeta"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Kumotaanko laitteen mikrofonin esto?"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 235dbe9f480d..33b023bbaf8a 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC désactivée"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC activée"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Enregistrement de l\'écran"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Démarrer"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Arrêter"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Débloquer le microphone de l\'appareil?"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 2a88d9ad12d4..b4a584399efd 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC désactivée"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"La technologie NFC est activée"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Enregistreur d\'écran"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Démarrer"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Arrêter"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Débloquer le micro de l\'appareil ?"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index b3f58269cc80..045143ef0d65 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -218,7 +218,7 @@ <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string> <string name="data_connection_roaming" msgid="375650836665414797">"Itinerancia"</string> <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string> - <string name="accessibility_no_sim" msgid="1140839832913084973">"Sen SIM"</string> + <string name="accessibility_no_sim" msgid="1140839832913084973">"Non hai SIM"</string> <string name="accessibility_cell_data" msgid="172950885786007392">"Datos móbiles"</string> <string name="accessibility_cell_data_on" msgid="691666434519443162">"Os datos móbiles están activados"</string> <string name="cell_data_off" msgid="4886198950247099526">"Desactivados"</string> @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"A opción NFC está desactivada"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"A opción NFC está activada"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Gravación da pantalla"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Iniciar"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Deter"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Queres desbloquear o micrófono do dispositivo?"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index b7b5516f7005..815430ca60eb 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -409,8 +409,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="6798849610647988987">"<xliff:g id="DATA_USED">%s</xliff:g> વાપર્યો"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"<xliff:g id="DATA_LIMIT">%s</xliff:g> મર્યાદા"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ચેતવણી"</string> - <!-- no translation found for quick_settings_work_mode_label (6440531507319809121) --> - <skip /> + <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"ઑફિસ માટેની ઍપ"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"રાત્રિ પ્રકાશ"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"સૂર્યાસ્ત વખતે"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"સૂર્યોદય સુધી"</string> @@ -670,12 +669,10 @@ <string name="wallet_title" msgid="5369767670735827105">"વૉલેટ"</string> <string name="wallet_app_button_label" msgid="7123784239111190992">"બધું બતાવો"</string> <string name="wallet_action_button_label_unlock" msgid="8663239748726774487">"ચુકવણી કરવા માટે અનલૉક કરો"</string> - <!-- no translation found for wallet_secondary_label_no_card (1282609666895946317) --> - <skip /> + <string name="wallet_secondary_label_no_card" msgid="1282609666895946317">"કોઈ સેટઅપ કર્યું નથી"</string> <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"ઉપયોગ કરવા માટે અનલૉક કરો"</string> <string name="wallet_error_generic" msgid="257704570182963611">"તમારા કાર્ડની માહિતી મેળવવામાં સમસ્યા આવી હતી, કૃપા કરીને થોડા સમય પછી ફરી પ્રયાસ કરો"</string> - <!-- no translation found for wallet_lockscreen_settings_label (3539105300870383570) --> - <skip /> + <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"લૉક સ્ક્રીનના સેટિંગ"</string> <string name="status_bar_work" msgid="5238641949837091056">"ઑફિસની પ્રોફાઇલ"</string> <string name="status_bar_airplane" msgid="4848702508684541009">"એરપ્લેન મોડ"</string> <string name="add_tile" msgid="6239678623873086686">"ટાઇલ ઉમેરો"</string> @@ -865,8 +862,7 @@ <string name="switch_bar_on" msgid="1770868129120096114">"ચાલુ"</string> <string name="switch_bar_off" msgid="5669805115416379556">"બંધ"</string> <string name="tile_unavailable" msgid="3095879009136616920">"ઉપલબ્ધ નથી"</string> - <!-- no translation found for tile_disabled (373212051546573069) --> - <skip /> + <string name="tile_disabled" msgid="373212051546573069">"બંધ છે"</string> <string name="nav_bar" msgid="4642708685386136807">"નેવિગેશન બાર"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"લેઆઉટ"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"અતિરિક્ત ડાબો બટન પ્રકાર"</string> @@ -1046,8 +1042,7 @@ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"કિનારી પર ખસેડો અને છુપાવો"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"કિનારીથી ખસેડો અને બતાવો"</string> <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ટૉગલ કરો"</string> - <!-- no translation found for quick_controls_title (7095074621086860062) --> - <skip /> + <string name="quick_controls_title" msgid="7095074621086860062">"ઘરેલું સાધનોનાં નિયંત્રણો"</string> <string name="controls_providers_title" msgid="6879775889857085056">"નિયંત્રણો ઉમેરવા માટે ઍપ પસંદ કરો"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> નિયંત્રણ ઉમેર્યું.</item> @@ -1061,8 +1056,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"મનપસંદમાંથી કાઢી નાખો"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"સ્થાન <xliff:g id="NUMBER">%d</xliff:g> પર ખસેડો"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"નિયંત્રણો"</string> - <!-- no translation found for controls_favorite_subtitle (6481675111056961083) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="6481675111056961083">"ઝડપી સેટિંગમાંથી ઍક્સેસ કરવાના નિયંત્રણો પસંદ કરો"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"નિયંત્રણોને ફરીથી ગોઠવવા માટે તેમને હોલ્ડ કરીને ખેંચો"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"બધા નિયંત્રણો કાઢી નાખ્યા"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ફેરફારો સાચવ્યા નથી"</string> @@ -1101,8 +1095,7 @@ <string name="controls_error_generic" msgid="352500456918362905">"સ્ટેટસ લોડ કરી શકાતું નથી"</string> <string name="controls_error_failed" msgid="960228639198558525">"ભૂલ, ફરીથી પ્રયાસ કરો"</string> <string name="controls_in_progress" msgid="4421080500238215939">"પ્રક્રિયા ચાલુ છે"</string> - <!-- no translation found for controls_added_tooltip (5866098408470111984) --> - <skip /> + <string name="controls_added_tooltip" msgid="5866098408470111984">"નવા નિયંત્રણો જોવા માટે ઝડપી સેટિંગ ખોલો"</string> <string name="controls_menu_add" msgid="4447246119229920050">"નિયંત્રણો ઉમેરો"</string> <string name="controls_menu_edit" msgid="890623986951347062">"નિયંત્રણોમાં ફેરફાર કરો"</string> <string name="media_output_dialog_add_output" msgid="5642703238877329518">"આઉટપુટ ઉમેરો"</string> @@ -1121,16 +1114,11 @@ <string name="priority_conversations" msgid="3967482288896653039">"પ્રાધાન્યતા ધરાવતી વાતચીતો"</string> <string name="recent_conversations" msgid="8531874684782574622">"તાજેતરની વાતચીતો"</string> <string name="okay" msgid="6490552955618608554">"ઓકે"</string> - <!-- no translation found for days_timestamp (5821854736213214331) --> - <skip /> - <!-- no translation found for one_week_timestamp (4925600765473875590) --> - <skip /> - <!-- no translation found for two_weeks_timestamp (9111801081871962155) --> - <skip /> - <!-- no translation found for over_one_week_timestamp (3770560704420807142) --> - <skip /> - <!-- no translation found for over_two_weeks_timestamp (6300507859007874050) --> - <skip /> + <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> દિવસ પહેલાં"</string> + <string name="one_week_timestamp" msgid="4925600765473875590">"1 અઠવાડિયા પહેલાં"</string> + <string name="two_weeks_timestamp" msgid="9111801081871962155">"2 અઠવાડિયા પહેલાં"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"1 અઠવાડિયા કરતાં પહેલાંથી"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"2 અઠવાડિયા કરતાં પહેલાંથી"</string> <string name="birthday_status" msgid="2596961629465396761">"જન્મદિવસ"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"આ તો <xliff:g id="NAME">%1$s</xliff:g>નો જન્મદિવસ છે"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"જલ્દી જ જન્મદિવસ છે"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 35bfca9c68e6..f77db5c7d53f 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"एनएफ़सी"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC बंद है"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC चालू है"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"स्क्रीन रिकॉर्डर"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"शुरू करें"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"रोकें"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"क्या आप डिवाइस के माइक्रोफ़ोन को अनब्लॉक करना चाहते हैं?"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 3e5b0445a76d..540bd43a3782 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"Az NFC ki van kapcsolva"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"Az NFC be van kapcsolva"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Képernyőrögzítés"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Indítás"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Leállítás"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Feloldja az eszközmikrofon letiltását?"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 36da43919b7f..4f4afd6b801d 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC-ն անջատված է"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC-ն միացված է"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Էկրանի տեսագրում"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Սկսել"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Կանգնեցնել"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Արգելահանե՞լ սարքի խոսափողը"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index ee718b470465..8fc2e8af30dd 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC dinonaktifkan"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC diaktifkan"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Perekam layar"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Mulai"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Berhenti"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Batalkan pemblokiran mikrofon perangkat?"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 476ed383609a..adaa7a73ae61 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"Slökkt á NFC"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"Kveikt á NFC"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Skjáupptaka"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Hefja"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stöðva"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Opna fyrir hljóðnema tækisins?"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 7b2fbac6d9c1..12e4dc7b03be 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -427,8 +427,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC מושבת"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC מופעל"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"הקלטת המסך"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"התחלה"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"עצירה"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"לבטל את חסימת המיקרופון של המכשיר?"</string> @@ -1051,7 +1050,7 @@ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"העברה לשוליים והסתרה"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"העברה מהשוליים והצגה"</string> <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"החלפת מצב"</string> - <string name="quick_controls_title" msgid="7095074621086860062">"בית חכם"</string> + <string name="quick_controls_title" msgid="7095074621086860062">"פקדי הבית החכם"</string> <string name="controls_providers_title" msgid="6879775889857085056">"יש לבחור אפליקציה כדי להוסיף פקדים"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="two">נוספו <xliff:g id="NUMBER_1">%s</xliff:g> פקדים.</item> @@ -1125,16 +1124,11 @@ <string name="priority_conversations" msgid="3967482288896653039">"שיחות בעדיפות גבוהה"</string> <string name="recent_conversations" msgid="8531874684782574622">"שיחות אחרונות"</string> <string name="okay" msgid="6490552955618608554">"בסדר"</string> - <!-- no translation found for days_timestamp (5821854736213214331) --> - <skip /> - <!-- no translation found for one_week_timestamp (4925600765473875590) --> - <skip /> - <!-- no translation found for two_weeks_timestamp (9111801081871962155) --> - <skip /> - <!-- no translation found for over_one_week_timestamp (3770560704420807142) --> - <skip /> - <!-- no translation found for over_two_weeks_timestamp (6300507859007874050) --> - <skip /> + <string name="days_timestamp" msgid="5821854736213214331">"לפני <xliff:g id="DURATION">%1$s</xliff:g> ימים"</string> + <string name="one_week_timestamp" msgid="4925600765473875590">"לפני שבוע"</string> + <string name="two_weeks_timestamp" msgid="9111801081871962155">"לפני שבועיים"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"לפני יותר משבוע"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"לפני יותר משבועיים"</string> <string name="birthday_status" msgid="2596961629465396761">"יום הולדת"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"זהו יום ההולדת של <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"יום הולדת יחול בקרוב"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 717ab3fb260e..f093cadbba61 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC は無効です"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC は有効です"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"スクリーン レコード"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"開始"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"停止"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"デバイスのマイクのブロックを解除しますか?"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index f910f76efa1d..6d012516cc78 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC өшірулі"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC қосулы"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Экранды жазу"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Бастау"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Тоқтату"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Құрылғы микрофонының бөгеуі алынсын ба?"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 326aab514050..08045e32a31f 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"បានបិទ NFC"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"បានបើក NFC"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"ការថតវីដេអូអេក្រង់"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"ចាប់ផ្ដើម"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"ឈប់"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ឈប់ទប់ស្កាត់មីក្រូហ្វូនរបស់ឧបករណ៍ឬ?"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index bbc0a0f9fd43..211e943afedf 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -136,8 +136,7 @@ <string name="accessibility_camera_button" msgid="2938898391716647247">"ಕ್ಯಾಮರಾ"</string> <string name="accessibility_phone_button" msgid="4256353121703100427">"ಫೋನ್"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"ಧ್ವನಿ ಸಹಾಯಕ"</string> - <!-- no translation found for accessibility_wallet_button (1458258783460555507) --> - <skip /> + <string name="accessibility_wallet_button" msgid="1458258783460555507">"Wallet"</string> <string name="accessibility_unlock_button" msgid="122785427241471085">"ಅನ್ಲಾಕ್"</string> <string name="accessibility_lock_icon" msgid="661492842417875775">"ಸಾಧನ ಲಾಕ್ ಆಗಿದೆ"</string> <string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ"</string> @@ -424,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ಸಕ್ರಿಯಗೊಂಡಿದೆ"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡ್"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"ಪ್ರಾರಂಭಿಸಿ"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"ನಿಲ್ಲಿಸಿ"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ಸಾಧನದ ಮೈಕ್ರೋಫೋನ್ ನಿರ್ಬಂಧವನ್ನು ತೆಗೆಯಬೇಕೆ?"</string> @@ -1114,16 +1112,11 @@ <string name="priority_conversations" msgid="3967482288896653039">"ಆದ್ಯತೆಯ ಸಂಭಾಷಣೆಗಳು"</string> <string name="recent_conversations" msgid="8531874684782574622">"ಇತ್ತೀಚಿನ ಸಂಭಾಷಣೆಗಳು"</string> <string name="okay" msgid="6490552955618608554">"ಸರಿ"</string> - <!-- no translation found for days_timestamp (5821854736213214331) --> - <skip /> - <!-- no translation found for one_week_timestamp (4925600765473875590) --> - <skip /> - <!-- no translation found for two_weeks_timestamp (9111801081871962155) --> - <skip /> - <!-- no translation found for over_one_week_timestamp (3770560704420807142) --> - <skip /> - <!-- no translation found for over_two_weeks_timestamp (6300507859007874050) --> - <skip /> + <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> ದಿನಗಳ ಹಿಂದೆ"</string> + <string name="one_week_timestamp" msgid="4925600765473875590">"1 ವಾರದ ಹಿಂದೆ"</string> + <string name="two_weeks_timestamp" msgid="9111801081871962155">"2 ವಾರಗಳ ಹಿಂದೆ"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"1 ವಾರಕ್ಕಿಂತ ಹಿಂದೆ"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"2 ವಾರಗಳಿಗಿಂತ ಹಿಂದೆ"</string> <string name="birthday_status" msgid="2596961629465396761">"ಜನ್ಮದಿನ"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"<xliff:g id="NAME">%1$s</xliff:g> ಅವರ ಜನ್ಮದಿನ"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"ಶೀಘ್ರದಲ್ಲಿ ಜನ್ಮದಿನವಿದೆ"</string> @@ -1154,8 +1147,6 @@ <string name="accessibility_authenticate_hint" msgid="798914151813205721">"ದೃಢೀಕರಿಸಿ"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"ಸಾಧನವನ್ನು ಪ್ರವೇಶಿಸಿ"</string> <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ತೆರೆಯುವುದಕ್ಕಾಗಿ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಬಳಸಿ"</string> - <!-- no translation found for accessibility_fingerprint_bouncer (7189102492498735519) --> - <skip /> - <!-- no translation found for ongoing_phone_call_content_description (5332334388483099947) --> - <skip /> + <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ದೃಢೀಕರಣದ ಅವಶ್ಯಕತೆಯಿದೆ. ದೃಢೀಕರಿಸಲು ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ."</string> + <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಫೋನ್ ಕರೆ"</string> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 019f31027e8c..f32aeff15597 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 사용 중지됨"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC 사용 설정됨"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"화면 녹화"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"시작"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"중지"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"기기 마이크를 차단 해제하시겠습니까?"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index f523fa291d2a..d997a7b68d47 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -423,16 +423,15 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC өчүрүлгөн"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC иштетилген"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Экрандан видео жаздырып алуу"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Баштадык"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Токтотуу"</string> - <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Түзмөктүн микрофонунун кулпусу ачысынбы?"</string> - <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Түзмөктүн камерасынын кулпусу ачылсынбы?"</string> + <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Түзмөктүн микрофонунун кулпусун ачасызбы?"</string> + <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Түзмөктүн камерасынын кулпусун ачасызбы?"</string> <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Түзмөктүн камерасы менен микрофону бөгөттөн чыгарылсынбы?"</string> - <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Ушуну менен микрофонуңузду колдонууга уруксаты бар бардык колдонмолор менен кызматтар бөгөттөн чыгарылат."</string> - <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Ушуну менен камераңызды колдонууга уруксаты бар бардык колдонмолор менен кызматтар бөгөттөн чыгарылат."</string> - <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Ушуну менен камераңызды же микрофонуңузду колдонууга уруксаты бар бардык колдонмолор менен кызматтар бөгөттөн чыгарылат."</string> + <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Микрофонуңузду колдонууга уруксат алган бардык колдонмолор менен кызматтар бөгөттөн чыгат."</string> + <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Камераны колдонууга уруксат алган бардык колдонмолор менен кызматтар бөгөттөн чыгат."</string> + <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Камераңызды же микрофонуңузду колдонууга уруксат алган бардык колдонмолор менен кызматтар бөгөттөн чыгат."</string> <string name="media_seamless_remote_device" msgid="177033467332920464">"Түзмөк"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Башка колдонмого которулуу үчүн өйдө сүрүңүз"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Колдонмолорду тез которуштуруу үчүн, оңго сүйрөңүз"</string> @@ -1116,8 +1115,8 @@ <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> күн мурун"</string> <string name="one_week_timestamp" msgid="4925600765473875590">"1 апта мурун"</string> <string name="two_weeks_timestamp" msgid="9111801081871962155">"2 апта мурда"</string> - <string name="over_one_week_timestamp" msgid="3770560704420807142">"1 аптадан ашуун мурда"</string> - <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"2 аптадан ашуун мурда"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"1 аптадан ашык мурда"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"2 аптадан ашык мурда"</string> <string name="birthday_status" msgid="2596961629465396761">"Туулган күн"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"<xliff:g id="NAME">%1$s</xliff:g> бүгүн туулган күнүн белгилеп жатат"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"Алдыдагы туулган күн"</string> diff --git a/packages/SystemUI/res/values-land-television/dimens.xml b/packages/SystemUI/res/values-land-television/dimens.xml index 220ed5cce83e..a9bc9e5cd638 100644 --- a/packages/SystemUI/res/values-land-television/dimens.xml +++ b/packages/SystemUI/res/values-land-television/dimens.xml @@ -23,6 +23,7 @@ <dimen name="volume_dialog_slider_width">4dp</dimen> <dimen name="volume_dialog_slider_corner_radius">@dimen/volume_dialog_slider_width</dimen> <dimen name="volume_dialog_background_blur_radius">100dp</dimen> + <dimen name="volume_tool_tip_right_margin">136dp</dimen> <dimen name="tv_volume_dialog_bubble_size">36dp</dimen> <dimen name="tv_volume_dialog_row_padding">6dp</dimen> diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml index c6931e82ba70..9df9db607b9f 100644 --- a/packages/SystemUI/res/values-land/dimens.xml +++ b/packages/SystemUI/res/values-land/dimens.xml @@ -43,8 +43,8 @@ <dimen name="qs_detail_margin_top">14dp</dimen> - <dimen name="volume_tool_tip_right_margin">136dp</dimen> <dimen name="volume_tool_tip_top_margin">12dp</dimen> + <dimen name="volume_row_slider_height">128dp</dimen> <dimen name="controls_activity_view_top_offset">25dp</dimen> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 6eb84eec91bf..ae4fd14c78aa 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -427,8 +427,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"ALR"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"ALR išjungtas"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"ALR įjungtas"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Ekrano įrašas"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Pradėti"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stabdyti"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Panaikinti įrenginio mikrofono blokavimą?"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 3c5905a56e21..635baa0c1a33 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -29,9 +29,9 @@ <string name="battery_low_percent_format_hybrid" msgid="3985614339605686167">"Atlikušais laiks: <xliff:g id="PERCENTAGE">%1$s</xliff:g> — aptuveni <xliff:g id="TIME">%2$s</xliff:g> (ņemot vērā lietojumu)"</string> <string name="battery_low_percent_format_hybrid_short" msgid="5917433188456218857">"Atlikušais laiks: <xliff:g id="PERCENTAGE">%1$s</xliff:g> — aptuveni <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"Atlikuši <xliff:g id="PERCENTAGE">%s</xliff:g>. Ir ieslēgts akumulatora enerģijas taupīšanas režīms."</string> - <string name="invalid_charger" msgid="4370074072117767416">"Nevar veikt uzlādi, izmantojot USB. Izmantojiet ierīces komplektācijā iekļauto uzlādes ierīci."</string> + <string name="invalid_charger" msgid="4370074072117767416">"Nevar veikt uzlādi, izmantojot USB. Izmantojiet ierīces komplektācijā iekļauto lādētāju."</string> <string name="invalid_charger_title" msgid="938685362320735167">"Nevar veikt uzlādi, izmantojot USB"</string> - <string name="invalid_charger_text" msgid="2339310107232691577">"Izmantojiet ierīces komplektācijā iekļauto uzlādes ierīci"</string> + <string name="invalid_charger_text" msgid="2339310107232691577">"Izmantojiet ierīces komplektācijā iekļauto lādētāju"</string> <string name="battery_low_why" msgid="2056750982959359863">"Iestatījumi"</string> <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Vai ieslēgt akumulatora enerģijas taupīšanas režīmu?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Par akumulatora enerģijas taupīšanas režīmu"</string> @@ -425,8 +425,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ir atspējoti"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ir iespējoti"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Ekrāna ierakstīšana"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Sākt"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Apturēt"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vai vēlaties atbloķēt ierīces mikrofonu?"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 8b83e61315a9..6a092d6de9b7 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC е оневозможено"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC е овозможено"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Снимање екран"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Започни"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Сопри"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Да се одблокира пристапот до микрофонот на уредот?"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 5b953880a21d..292e1e19a482 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC പ്രവർത്തനരഹിതമാക്കി"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC പ്രവർത്തനക്ഷമമാക്കി"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"സ്ക്രീൻ റെക്കോർഡ്"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"ആരംഭിക്കുക"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"നിര്ത്തുക"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"ഉപകരണ മൈക്രോഫോൺ അൺബ്ലോക്ക് ചെയ്യണോ?"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 0e9a5cbe94cc..2bcca675924b 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC-г цуцалсан"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC-г идэвхжүүлсэн"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Дэлгэцийн үйлдэл бичих"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Эхлүүлэх"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Зогсоох"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Төхөөрөмжийн микрофоныг блокоос гаргах уу?"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 8b9f5c17f914..c69992b1199d 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC अक्षम केले आहे"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC सक्षम केले आहे"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"स्क्रीन रेकॉर्ड"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"सुरू"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"थांबा"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"डिव्हाइसचा मायक्रोफोन अनब्लॉक करायचा आहे का?"</string> @@ -1113,16 +1112,11 @@ <string name="priority_conversations" msgid="3967482288896653039">"प्राधान्य दिलेली संभाषणे"</string> <string name="recent_conversations" msgid="8531874684782574622">"अलीकडील संभाषणे"</string> <string name="okay" msgid="6490552955618608554">"ओके"</string> - <!-- no translation found for days_timestamp (5821854736213214331) --> - <skip /> - <!-- no translation found for one_week_timestamp (4925600765473875590) --> - <skip /> - <!-- no translation found for two_weeks_timestamp (9111801081871962155) --> - <skip /> - <!-- no translation found for over_one_week_timestamp (3770560704420807142) --> - <skip /> - <!-- no translation found for over_two_weeks_timestamp (6300507859007874050) --> - <skip /> + <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> दिवसांपूर्वी"</string> + <string name="one_week_timestamp" msgid="4925600765473875590">"१ आठवड्यापूर्वी"</string> + <string name="two_weeks_timestamp" msgid="9111801081871962155">"२ आठवड्यांपूर्वी"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"१ आठवड्यापेक्षा जास्त आधी"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"२ आठवड्यांपेक्षा जास्त आधी"</string> <string name="birthday_status" msgid="2596961629465396761">"वाढदिवस"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"आज <xliff:g id="NAME">%1$s</xliff:g> यांचा वाढदिवस आहे"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"वाढदिवस लवकरच आहे"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 0ec67d50de48..d2780b9870f3 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC dilumpuhkan"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC didayakan"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Rakam skrin"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Mula"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Berhenti"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Nyahsekat mikrofon peranti?"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index beaad24bc401..a8b5f0809d90 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ကို ပိတ်ထားသည်"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ကို ဖွင့်ထားသည်"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"ဖန်သားပြင် ရိုက်ကူးရန်"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"စတင်ရန်"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"ရပ်ရန်"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"စက်၏မိုက်ခရိုဖုန်းကို ပြန်ဖွင့်မလား။"</string> @@ -751,7 +750,7 @@ <string name="notification_multichannel_desc" msgid="7414593090056236179">"ဤအကြောင်းကြားချက်အုပ်စုကို ဤနေရာတွင် စီစဉ်သတ်မှတ်၍ မရပါ"</string> <string name="notification_delegate_header" msgid="1264510071031479920">"ပရောက်စီထည့်ထားသော အကြောင်းကြားချက်"</string> <string name="notification_channel_dialog_title" msgid="6856514143093200019">"<xliff:g id="APP_NAME">%1$s</xliff:g> အကြောင်းကြားချက်များ အားလုံး"</string> - <string name="see_more_title" msgid="7409317011708185729">"ပိုပြရန်"</string> + <string name="see_more_title" msgid="7409317011708185729">"ပိုကြည့်ရန်"</string> <string name="appops_camera" msgid="5215967620896725715">"ဤအက်ပ်က ကင်မရာကို အသုံးပြုနေသည်။"</string> <string name="appops_microphone" msgid="8805468338613070149">"ဤအက်ပ်က မိုက်ခရိုဖုန်းကို အသုံးပြုနေသည်။"</string> <string name="appops_overlay" msgid="4822261562576558490">"ဤအက်ပ်က ဖန်သားမျက်နှာပြင်ပေါ်ရှိ အခြားအက်ပ်များ အပေါ်မှ ထပ်ပြီး ပြသနေပါသည်။"</string> @@ -1040,7 +1039,7 @@ <string name="accessibility_floating_button_action_move_bottom_right" msgid="6196904373227440500">"ညာဘက်အောက်ခြေသို့ ရွှေ့ရန်"</string> <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"အစွန်းသို့ရွှေ့ပြီး ဝှက်ရန်"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"အစွန်းမှရွှေ့ပြီး ပြရန်"</string> - <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ခလုတ်"</string> + <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"ပြောင်းရန်"</string> <string name="quick_controls_title" msgid="7095074621086860062">"ပင်မ ထိန်းချုပ်မှုများ"</string> <string name="controls_providers_title" msgid="6879775889857085056">"ထိန်းချုပ်မှုများထည့်ရန် အက်ပ်ရွေးခြင်း"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> @@ -1076,7 +1075,7 @@ <string name="controls_pin_instructions_retry" msgid="1566667581012131046">"နောက်ပင်နံပါတ်တစ်ခု စမ်းကြည့်ရန်"</string> <string name="controls_confirmation_confirming" msgid="2596071302617310665">"အတည်ပြုနေသည်…"</string> <string name="controls_confirmation_message" msgid="7744104992609594859">"<xliff:g id="DEVICE">%s</xliff:g> အတွက် အပြောင်းအလဲကို အတည်ပြုပါ"</string> - <string name="controls_structure_tooltip" msgid="4355922222944447867">"ပိုမိုကြည့်ရှုရန် ပွတ်ဆွဲပါ"</string> + <string name="controls_structure_tooltip" msgid="4355922222944447867">"ပိုကြည့်ရန် ပွတ်ဆွဲပါ"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"အကြံပြုချက်များ ဖွင့်နေသည်"</string> <string name="controls_media_title" msgid="1746947284862928133">"မီဒီယာ"</string> <string name="controls_media_close_session" msgid="1193000643003066508">"ဤမီဒီယာစက်ရှင်ကို ဝှက်မလား။"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index e99c18dbd35d..c7507c9db654 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC er slått av"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC er slått på"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Skjermopptak"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Start"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stopp"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vil du oppheve blokkeringen av enhetsmikrofonen?"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 05f0f10bf5c2..b649ebae5eba 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -136,8 +136,7 @@ <string name="accessibility_camera_button" msgid="2938898391716647247">"क्यामेरा"</string> <string name="accessibility_phone_button" msgid="4256353121703100427">"फोन"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"आवाज सहायता"</string> - <!-- no translation found for accessibility_wallet_button (1458258783460555507) --> - <skip /> + <string name="accessibility_wallet_button" msgid="1458258783460555507">"वालेट"</string> <string name="accessibility_unlock_button" msgid="122785427241471085">"खोल्नुहोस्"</string> <string name="accessibility_lock_icon" msgid="661492842417875775">"यन्त्र लक गरिएको छ"</string> <string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"फिंगरप्रिन्ट कुर्दै"</string> @@ -409,8 +408,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="6798849610647988987">"<xliff:g id="DATA_USED">%s</xliff:g> प्रयोग गरियो"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"<xliff:g id="DATA_LIMIT">%s</xliff:g> सीमा"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"<xliff:g id="DATA_LIMIT">%s</xliff:g> चेतावनी दिँदै"</string> - <!-- no translation found for quick_settings_work_mode_label (6440531507319809121) --> - <skip /> + <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"कामसम्बन्धी एपहरू"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Night Light"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"सूर्यास्तमा सक्रिय"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"सूर्योदयसम्म"</string> @@ -1043,8 +1041,7 @@ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"किनारामा सार्नुहोस् र नदेखिने पार्नु…"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"किनाराबाट सार्नुहोस् र देखिने पार्नु…"</string> <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"टगल गर्नुहोस्"</string> - <!-- no translation found for quick_controls_title (7095074621086860062) --> - <skip /> + <string name="quick_controls_title" msgid="7095074621086860062">"घरायसी उपकरणका नियन्त्रणहरू"</string> <string name="controls_providers_title" msgid="6879775889857085056">"नियन्त्रणहरू थप्नु पर्ने एप छान्नुहोस्"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> वटा नियन्त्र थपियो।</item> @@ -1058,8 +1055,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"मन पर्ने कुराहरूको सूचीमा नराख्नुहोस्"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"<xliff:g id="NUMBER">%d</xliff:g>ले निर्देश गर्ने ठाउँमा सार्नुहोस्"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"नियन्त्रणहरू"</string> - <!-- no translation found for controls_favorite_subtitle (6481675111056961083) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="6481675111056961083">"आफूले द्रुत सेटिङबाट प्रयोग गर्न चाहेका नियन्त्रणहरू छान्नुहोस्"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"नियन्त्रणहरूको क्रम मिलाउन तिनलाई थिचेर ड्र्याग गर्नुहोस्"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"सबै नियन्त्रणहरू हटाइए"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"परिवर्तनहरू सुरक्षित गरिएका छैनन्"</string> @@ -1098,8 +1094,7 @@ <string name="controls_error_generic" msgid="352500456918362905">"वस्तुस्थिति लोड गर्न सकिएन"</string> <string name="controls_error_failed" msgid="960228639198558525">"त्रुटि भयो, फेरि प्रयास गर्नु…"</string> <string name="controls_in_progress" msgid="4421080500238215939">"कार्य हुँदै छ"</string> - <!-- no translation found for controls_added_tooltip (5866098408470111984) --> - <skip /> + <string name="controls_added_tooltip" msgid="5866098408470111984">"नयाँ नियन्त्रणहरू हेर्न द्रुत सेटिङ खोल्नुहोस्"</string> <string name="controls_menu_add" msgid="4447246119229920050">"नियन्त्रण सुविधाहरू थप्नुहोस्"</string> <string name="controls_menu_edit" msgid="890623986951347062">"नियन्त्रण सुविधाहरू सम्पादन गर्नु…"</string> <string name="media_output_dialog_add_output" msgid="5642703238877329518">"आउटपुट यन्त्रहरू थप्नुहोस्"</string> @@ -1118,16 +1113,11 @@ <string name="priority_conversations" msgid="3967482288896653039">"महत्त्वपूर्ण वार्तालापहरू"</string> <string name="recent_conversations" msgid="8531874684782574622">"हालसालैका वार्तालापहरू"</string> <string name="okay" msgid="6490552955618608554">"ठिक छ"</string> - <!-- no translation found for days_timestamp (5821854736213214331) --> - <skip /> - <!-- no translation found for one_week_timestamp (4925600765473875590) --> - <skip /> - <!-- no translation found for two_weeks_timestamp (9111801081871962155) --> - <skip /> - <!-- no translation found for over_one_week_timestamp (3770560704420807142) --> - <skip /> - <!-- no translation found for over_two_weeks_timestamp (6300507859007874050) --> - <skip /> + <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> दिनअघि"</string> + <string name="one_week_timestamp" msgid="4925600765473875590">"१ हप्ताअघि"</string> + <string name="two_weeks_timestamp" msgid="9111801081871962155">"२ हप्ताअघि"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"१ हप्ताभन्दा पहिले"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"२ हप्ताभन्दा पहिले"</string> <string name="birthday_status" msgid="2596961629465396761">"जन्मदिन"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"आज <xliff:g id="NAME">%1$s</xliff:g> को जन्मदिन हो"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"आगामी जन्मदिन"</string> @@ -1158,8 +1148,6 @@ <string name="accessibility_authenticate_hint" msgid="798914151813205721">"प्रमाणित गर्नुहोस्"</string> <string name="accessibility_enter_hint" msgid="2617864063504824834">"डिभाइस हाल्नुहोस्"</string> <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"फिंगरप्रिन्ट प्रयोग गरी खोल्नुहोस्"</string> - <!-- no translation found for accessibility_fingerprint_bouncer (7189102492498735519) --> - <skip /> - <!-- no translation found for ongoing_phone_call_content_description (5332334388483099947) --> - <skip /> + <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"पुष्टि गर्नु पर्ने हुन्छ। पुष्टि गर्न फिंगरप्रिन्ट सेन्सर छुनुहोस्।"</string> + <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"जारी फोन कल"</string> </resources> diff --git a/packages/SystemUI/res/values-night/styles.xml b/packages/SystemUI/res/values-night/styles.xml index f10a5648973b..e6165ee50076 100644 --- a/packages/SystemUI/res/values-night/styles.xml +++ b/packages/SystemUI/res/values-night/styles.xml @@ -35,7 +35,7 @@ <item name="android:windowLightStatusBar">false</item> <item name="android:windowLightNavigationBar">false</item> <item name="android:navigationBarColor">?android:attr/colorBackgroundFloating</item> - <item name="android:textColorPrimary">?android:attr/textColorPrimaryInverse</item> + <item name="android:textColorSecondary">?android:attr/textColorPrimaryInverse</item> </style> <style name="Screenshot" parent="@android:style/Theme.DeviceDefault.DayNight"> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 5eb67001a6b4..b0df16e59963 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC staat uit"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC staat aan"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Schermopname"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Starten"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stoppen"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Blokkeren van apparaatmicrofoon opheffen?"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index a15efe24f8ee..9b0350686dbc 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -1113,16 +1113,11 @@ <string name="priority_conversations" msgid="3967482288896653039">"ପ୍ରାଥମିକତା ଦିଆଯାଇଥିବା ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ"</string> <string name="recent_conversations" msgid="8531874684782574622">"ବର୍ତ୍ତମାନର ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ"</string> <string name="okay" msgid="6490552955618608554">"ଠିକ୍ ଅଛି"</string> - <!-- no translation found for days_timestamp (5821854736213214331) --> - <skip /> - <!-- no translation found for one_week_timestamp (4925600765473875590) --> - <skip /> - <!-- no translation found for two_weeks_timestamp (9111801081871962155) --> - <skip /> - <!-- no translation found for over_one_week_timestamp (3770560704420807142) --> - <skip /> - <!-- no translation found for over_two_weeks_timestamp (6300507859007874050) --> - <skip /> + <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> ଦିନ ପୂର୍ବେ"</string> + <string name="one_week_timestamp" msgid="4925600765473875590">"1 ସପ୍ତାହ ପୂର୍ବେ"</string> + <string name="two_weeks_timestamp" msgid="9111801081871962155">"2 ସପ୍ତାହ ପୂର୍ବେ"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"1 ସପ୍ତାହରୁ ଅଧିକ ଦିନ ଆଗରୁ"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"2 ସପ୍ତାହରୁ ଅଧିକ ଦିନ ଆଗରୁ"</string> <string name="birthday_status" msgid="2596961629465396761">"ଜନ୍ମଦିନ"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"ଆଜି <xliff:g id="NAME">%1$s</xliff:g>ଙ୍କର ଜନ୍ମଦିନ"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"ଜନ୍ମଦିନ ଶୀଘ୍ର ଆସୁଛି"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index b6a9c86dddbd..d9f4f9667420 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -1113,16 +1113,11 @@ <string name="priority_conversations" msgid="3967482288896653039">"ਤਰਜੀਹੀ ਗੱਲਾਂਬਾਤਾਂ"</string> <string name="recent_conversations" msgid="8531874684782574622">"ਹਾਲੀਆ ਗੱਲਾਂਬਾਤਾਂ"</string> <string name="okay" msgid="6490552955618608554">"ਠੀਕ ਹੈ"</string> - <!-- no translation found for days_timestamp (5821854736213214331) --> - <skip /> - <!-- no translation found for one_week_timestamp (4925600765473875590) --> - <skip /> - <!-- no translation found for two_weeks_timestamp (9111801081871962155) --> - <skip /> - <!-- no translation found for over_one_week_timestamp (3770560704420807142) --> - <skip /> - <!-- no translation found for over_two_weeks_timestamp (6300507859007874050) --> - <skip /> + <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> ਦਿਨ ਪਹਿਲਾਂ"</string> + <string name="one_week_timestamp" msgid="4925600765473875590">"1 ਹਫ਼ਤਾ ਪਹਿਲਾਂ"</string> + <string name="two_weeks_timestamp" msgid="9111801081871962155">"2 ਹਫ਼ਤੇ ਪਹਿਲਾਂ"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"1 ਹਫ਼ਤੇ ਤੋਂ ਵੀ ਪਹਿਲਾਂ"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"2 ਹਫ਼ਤੇ ਤੋਂ ਵੀ ਪਹਿਲਾਂ"</string> <string name="birthday_status" msgid="2596961629465396761">"ਜਨਮਦਿਨ"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"ਅੱਜ <xliff:g id="NAME">%1$s</xliff:g> ਦਾ ਜਨਮਦਿਨ ਹੈ"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"ਜਨਮਦਿਨ ਜਲਦ ਆ ਰਿਹਾ ਹੈ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 47abb55b9f14..458bf0a142db 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -412,8 +412,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="6798849610647988987">"Wykorzyst.: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"Limit <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"Ostrzeżenie: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_label (6440531507319809121) --> - <skip /> + <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Aplikacje służbowe"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Podświetlenie nocne"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Włącz o zachodzie"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Do wschodu słońca"</string> @@ -428,8 +427,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"Komunikacja NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"Komunikacja NFC jest wyłączona"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"Komunikacja NFC jest włączona"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Nagrywanie ekranu"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Rozpocznij"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Zatrzymaj"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Odblokować mikrofon urządzenia?"</string> @@ -543,7 +541,7 @@ <string name="quick_settings_disclosure_named_management_vpns" msgid="4046375645500668555">"To urządzenie należy do organizacji <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> i jest połączone z sieciami VPN"</string> <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"Twoja organizacja może monitorować ruch w sieci w Twoim profilu służbowym"</string> <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"Organizacja <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> może monitorować ruch w sieci w Twoim profilu służbowym"</string> - <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktywność w sieci w profilu służbowym widoczna dla administratora IT"</string> + <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Aktywność w sieci w profilu służbowym jest widoczna dla administratora IT"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Sieć może być monitorowana"</string> <string name="quick_settings_disclosure_vpns" msgid="7213546797022280246">"To urządzenie jest połączone z sieciami VPN"</string> <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="8117568745060010789">"Twój profil służbowy jest połączony z siecią <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> @@ -1052,8 +1050,7 @@ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Przenieś do krawędzi i ukryj"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Przenieś poza krawędź i pokaż"</string> <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"przełącz"</string> - <!-- no translation found for quick_controls_title (7095074621086860062) --> - <skip /> + <string name="quick_controls_title" msgid="7095074621086860062">"Sterowanie domem"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Wybierz aplikację, do której chcesz dodać elementy sterujące"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="few">Dodano <xliff:g id="NUMBER_1">%s</xliff:g> elementy sterujące</item> @@ -1069,8 +1066,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"usunąć z ulubionych"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"Przenieś w położenie <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Elementy sterujące"</string> - <!-- no translation found for controls_favorite_subtitle (6481675111056961083) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="6481675111056961083">"Wybierz elementy sterujące dostępne w Szybkich ustawieniach"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Przytrzymaj i przeciągnij, aby przestawić elementy sterujące"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Usunięto wszystkie elementy sterujące"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Zmiany nie zostały zapisane"</string> @@ -1109,8 +1105,7 @@ <string name="controls_error_generic" msgid="352500456918362905">"Nie udało się wczytać stanu"</string> <string name="controls_error_failed" msgid="960228639198558525">"Błąd, spróbuj ponownie"</string> <string name="controls_in_progress" msgid="4421080500238215939">"W toku"</string> - <!-- no translation found for controls_added_tooltip (5866098408470111984) --> - <skip /> + <string name="controls_added_tooltip" msgid="5866098408470111984">"Otwórz Szybkie ustawienia, by zobaczyć nowe elementy sterujące"</string> <string name="controls_menu_add" msgid="4447246119229920050">"Dodaj elementy sterujące"</string> <string name="controls_menu_edit" msgid="890623986951347062">"Edytuj elementy sterujące"</string> <string name="media_output_dialog_add_output" msgid="5642703238877329518">"Dodaj urządzenia wyjściowe"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index a61a2bef400c..bbe3cc01b2a6 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -425,8 +425,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"Serviciul NFC este dezactivat"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"Serviciul NFC este activat"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Înregistrarea ecranului"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Începeți"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Opriți"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Deblocați microfonul dispozitivului?"</string> @@ -1046,7 +1045,7 @@ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Mutați în afară și ascundeți"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Mutați în afară și afișați"</string> <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"Activați / dezactivați"</string> - <string name="quick_controls_title" msgid="7095074621086860062">"Controalele locuinței"</string> + <string name="quick_controls_title" msgid="7095074621086860062">"Comenzi pentru locuință"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Alegeți aplicația pentru a adăuga comenzi"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="few">S-au adăugat <xliff:g id="NUMBER_1">%s</xliff:g> comenzi.</item> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index a1b8919cd215..80bf12aaede7 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -427,8 +427,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"Модуль NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"Модуль NFC отключен"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"Модуль NFC включен"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Запись видео с экрана"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Начать"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Остановить"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Разблокировать микрофон устройства?"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 2312f157eb04..89127274b84c 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC අබලයි"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC සබලයි"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"තිර පටිගත කිරීම"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"ආරම්භ කරන්න"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"නතර කරන්න"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"උපාංග මයික්රෆෝනය අවහිර කිරීම ඉවත් කරන්නද?"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index b5683d42277d..dd36b29ff569 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -427,8 +427,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC je deaktivované"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC je aktivované"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Rekordér obrazovky"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Začať"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Ukončiť"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Chcete odblokovať mikrofón zariadenia?"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 94ed73343479..8ba5d797b6aa 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -427,8 +427,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"Tehnologija NFC je onemogočena"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"Tehnologija NFC je omogočena"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Snemanje zaslona"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Začni"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Ustavi"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Želite odblokirati mikrofon v napravi?"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 746091d96a85..e17d51779653 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -408,8 +408,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="6798849610647988987">"Të përdorura: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"Kufiri: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"Paralajmërim për kufirin prej <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_label (6440531507319809121) --> - <skip /> + <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Aplikacionet e punës"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Drita e natës"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Në perëndim të diellit"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Deri në lindje të diellit"</string> @@ -424,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC është çaktivizuar"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC është aktivizuar"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Regjistrimi i ekranit"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Nis"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Ndalo"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Të zhbllokohet mikrofoni i pajisjes?"</string> @@ -1042,8 +1040,7 @@ <string name="accessibility_floating_button_action_move_to_edge_and_hide_to_half" msgid="662401168245782658">"Zhvendose te skaji dhe fshihe"</string> <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Zhvendose jashtë skajit dhe shfaqe"</string> <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"aktivizo/çaktivizo"</string> - <!-- no translation found for quick_controls_title (7095074621086860062) --> - <skip /> + <string name="quick_controls_title" msgid="7095074621086860062">"Kontrollet e shtëpisë"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Zgjidh aplikacionin për të shtuar kontrollet"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="other">U shtuan <xliff:g id="NUMBER_1">%s</xliff:g> kontrolle.</item> @@ -1057,8 +1054,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"ta heqësh nga të preferuarat"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"Zhvendose te pozicioni <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontrollet"</string> - <!-- no translation found for controls_favorite_subtitle (6481675111056961083) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="6481675111056961083">"Zgjidh kontrollet për t\'u qasur nga \"Cilësimet e shpejta\""</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Mbaje të shtypur dhe zvarrit për të risistemuar kontrollet"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Të gjitha kontrollet u hoqën"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Ndryshimet nuk u ruajtën"</string> @@ -1097,8 +1093,7 @@ <string name="controls_error_generic" msgid="352500456918362905">"Statusi nuk mund të ngarkohet"</string> <string name="controls_error_failed" msgid="960228639198558525">"Gabim, provo sërish"</string> <string name="controls_in_progress" msgid="4421080500238215939">"Në vazhdim"</string> - <!-- no translation found for controls_added_tooltip (5866098408470111984) --> - <skip /> + <string name="controls_added_tooltip" msgid="5866098408470111984">"Hap \"Cilësimet e shpejta\" për të shikuar kontrollet e reja"</string> <string name="controls_menu_add" msgid="4447246119229920050">"Shto kontrollet"</string> <string name="controls_menu_edit" msgid="890623986951347062">"Modifiko kontrollet"</string> <string name="media_output_dialog_add_output" msgid="5642703238877329518">"Shto daljet"</string> @@ -1117,16 +1112,11 @@ <string name="priority_conversations" msgid="3967482288896653039">"Bisedat me përparësi"</string> <string name="recent_conversations" msgid="8531874684782574622">"Bisedat e fundit"</string> <string name="okay" msgid="6490552955618608554">"Në rregull"</string> - <!-- no translation found for days_timestamp (5821854736213214331) --> - <skip /> - <!-- no translation found for one_week_timestamp (4925600765473875590) --> - <skip /> - <!-- no translation found for two_weeks_timestamp (9111801081871962155) --> - <skip /> - <!-- no translation found for over_one_week_timestamp (3770560704420807142) --> - <skip /> - <!-- no translation found for over_two_weeks_timestamp (6300507859007874050) --> - <skip /> + <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> ditë më parë"</string> + <string name="one_week_timestamp" msgid="4925600765473875590">"1 javë më parë"</string> + <string name="two_weeks_timestamp" msgid="9111801081871962155">"2 javë më parë"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"Mbi 1 javë më parë"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"Mbi 2 javë më parë"</string> <string name="birthday_status" msgid="2596961629465396761">"Ditëlindja"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"<xliff:g id="NAME">%1$s</xliff:g> ka ditëlindjen"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"Ditëlindje së shpejti"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 0c3bae4ea300..7ed0cd189ea1 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -425,8 +425,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC је онемогућен"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC је омогућен"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Снимање екрана"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Почните"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Зауставите"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Желите да одблокирате микрофон уређаја?"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 6f49e049ac77..e7f6fe54f404 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -378,7 +378,7 @@ <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"Namnlös enhet"</string> <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"Redo att casta"</string> <string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"Inga tillgängliga enheter"</string> - <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Inte ansluten till wifi"</string> + <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Ej ansluten till wifi"</string> <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ljusstyrka"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"AUTO"</string> <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Invertera färger"</string> @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC är inaktiverat"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC är aktiverat"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Skärminspelning"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Starta"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Stoppa"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Vill du återaktivera enhetens mikrofon?"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 9b2025028ced..bbc7a75ec172 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC imezimwa"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC imewashwa"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Rekodi ya skrini"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Anza kurekodi"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Acha kurekodi"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Ungependa kuondoa kizuizi kwenye maikrofoni ya kifaa?"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 3c14595fe052..8c2649ef5a04 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC முடக்கப்பட்டது"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC இயக்கப்பட்டது"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"ஸ்கிரீன் ரெக்கார்டு"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"தொடங்கு"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"நிறுத்து"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"சாதனத்தின் மைக்ரோஃபோனுக்கான தடுப்பை நீக்கவா?"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 076a24bce142..407ab00d994b 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC నిలిపివేయబడింది"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ప్రారంభించబడింది"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"స్క్రీన్ రికార్డ్"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"ప్రారంభించు"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"ఆపు"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"పరికరం మైక్రోఫోన్ను అన్బ్లాక్ చేయమంటారా?"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 9e88d34a3073..1536d9a78a21 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ถูกปิดใช้งาน"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"เปิดใช้งาน NFC แล้ว"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"บันทึกหน้าจอ"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"เริ่ม"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"หยุด"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"เลิกบล็อกไมโครโฟนของอุปกรณ์ใช่ไหม"</string> @@ -860,7 +859,7 @@ <string name="accessibility_data_saver_off" msgid="58339669022107171">"โปรแกรมประหยัดอินเทอร์เน็ตปิดอยู่"</string> <string name="switch_bar_on" msgid="1770868129120096114">"เปิด"</string> <string name="switch_bar_off" msgid="5669805115416379556">"ปิด"</string> - <string name="tile_unavailable" msgid="3095879009136616920">"ไม่มี"</string> + <string name="tile_unavailable" msgid="3095879009136616920">"ไม่พร้อมใช้งาน"</string> <string name="tile_disabled" msgid="373212051546573069">"ปิดใช้"</string> <string name="nav_bar" msgid="4642708685386136807">"แถบนำทาง"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"การจัดวาง"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index f6ac329d54f9..0ece0cb44788 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"Naka-disable ang NFC"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"Naka-enable ang NFC"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Pag-record ng screen"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Magsimula"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Ihinto"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"I-unblock ang mikropono ng device?"</string> @@ -1114,10 +1113,10 @@ <string name="recent_conversations" msgid="8531874684782574622">"Mga kamakailang pag-uusap"</string> <string name="okay" msgid="6490552955618608554">"Okay"</string> <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> (na) araw ang nakalipas"</string> - <string name="one_week_timestamp" msgid="4925600765473875590">"1 linggo ang nakalipas"</string> - <string name="two_weeks_timestamp" msgid="9111801081871962155">"2 linggo ang nakalipas"</string> - <string name="over_one_week_timestamp" msgid="3770560704420807142">"Mahigit 1 linggo ang nakalipas"</string> - <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"Mahigit 2 linggo ang nakalipas"</string> + <string name="one_week_timestamp" msgid="4925600765473875590">"1 linggo na"</string> + <string name="two_weeks_timestamp" msgid="9111801081871962155">"2 linggo na"</string> + <string name="over_one_week_timestamp" msgid="3770560704420807142">"Mahigit 1 linggo na"</string> + <string name="over_two_weeks_timestamp" msgid="6300507859007874050">"Mahigit 2 linggo na"</string> <string name="birthday_status" msgid="2596961629465396761">"Kaarawan"</string> <string name="birthday_status_content_description" msgid="682836371128282925">"Kaarawan ni <xliff:g id="NAME">%1$s</xliff:g> ngayon"</string> <string name="upcoming_birthday_status" msgid="2005452239256870351">"Kaarawang paparating"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index ddadcc81c865..c0702e9523cd 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC devre dışı"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC etkin"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Ekran kaydı"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Başlat"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Durdur"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Cihaz mikrofonunun engellemesi kaldırılsın mı?"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 36b96cf4d8fa..2b6183d5b25c 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -427,8 +427,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC вимкнено"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ввімкнено"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Запис відео з екрана"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Почати"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Зупинити"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Надати доступ до мікрофона?"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index e198d996a60b..f27f81317c7e 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC غیر فعال ہے"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC فعال ہے"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"اسکرین ریکارڈ"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"شروع کریں"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"روکیں"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"آلے کا مائیکروفون غیر مسدود کریں؟"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index fc31ebc82d29..6a9d46f69e40 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC o‘chiq"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC yoniq"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Ekranni yozib olish"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Boshlash"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Toʻxtatish"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Qurilma mikrofoni blokdan chiqarilsinmi?"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index d6844e866cb4..86ee67a82818 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC đã được tắt"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC đã được bật"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"Ghi màn hình"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Bắt đầu"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Dừng"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Bỏ chặn micrô của thiết bị?"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index ccaec6495b79..928510bebbb8 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 已停用"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC 已启用"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"屏幕录制"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"开始"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"停止"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"要取消禁用设备麦克风吗?"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 03bc62995f7e..a80896f3cc73 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 已停用"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC 已啟用"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"螢幕錄影"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"開始"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"停"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"要解除封鎖裝置麥克風嗎?"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 47cc4c384a43..7584d230a774 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -423,8 +423,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC 已停用"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC 已啟用"</string> - <!-- no translation found for quick_settings_screen_record_label (8650355346742003694) --> - <skip /> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"螢幕錄影"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"開始"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"停止"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"要將裝置麥克風解除封鎖嗎?"</string> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index d4dbcf969a73..be9065b2c13b 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -352,7 +352,7 @@ <!-- Nav bar button default ordering/layout --> <string name="config_navBarLayout" translatable="false">left[.5W],back[1WC];home;recent[1WC],right[.5W]</string> <string name="config_navBarLayoutQuickstep" translatable="false">back[1.7WC];home;contextual[1.7WC]</string> - <string name="config_navBarLayoutHandle" translatable="false">back[40AC];home_handle;ime_switcher[40AC]</string> + <string name="config_navBarLayoutHandle" translatable="false">back[70AC];home_handle;ime_switcher[70AC]</string> <bool name="quick_settings_show_full_alarm">false</bool> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 24eac1593195..5c1e9355b650 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -472,6 +472,8 @@ <dimen name="volume_dialog_panel_transparent_padding">20dp</dimen> + <dimen name="volume_dialog_ringer_rows_padding">7dp</dimen> + <dimen name="volume_dialog_stream_padding">12dp</dimen> <dimen name="volume_dialog_panel_width">56dp</dimen> @@ -1416,10 +1418,6 @@ <dimen name="media_output_dialog_icon_corner_radius">16dp</dimen> <dimen name="media_output_dialog_title_anim_y_delta">12.5dp</dimen> - <!-- Delay after which the media will start transitioning to the full shade on - the lockscreen --> - <dimen name="lockscreen_shade_media_transition_start_delay">40dp</dimen> - <!-- Distance that the full shade transition takes in order for qs to fully transition to the shade --> <dimen name="lockscreen_shade_qs_transition_distance">200dp</dimen> @@ -1428,13 +1426,16 @@ the shade (in alpha) --> <dimen name="lockscreen_shade_scrim_transition_distance">80dp</dimen> - <!-- Extra inset for the notifications when accounting for media during the lockscreen to - shade transition to compensate for the disappearing media --> - <dimen name="lockscreen_shade_transition_extra_media_inset">-48dp</dimen> + <!-- Distance that the full shade transition takes in order for media to fully transition to + the shade --> + <dimen name="lockscreen_shade_media_transition_distance">140dp</dimen> <!-- Maximum overshoot for the topPadding of notifications when transitioning to the full shade --> - <dimen name="lockscreen_shade_max_top_overshoot">32dp</dimen> + <dimen name="lockscreen_shade_notification_movement">24dp</dimen> + + <!-- Maximum overshoot for the pulse expansion --> + <dimen name="pulse_expansion_max_top_overshoot">16dp</dimen> <dimen name="people_space_widget_radius">28dp</dimen> <dimen name="people_space_image_radius">20dp</dimen> diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml index 6393147f8b0b..f4086edf627d 100644 --- a/packages/SystemUI/res/values/flags.xml +++ b/packages/SystemUI/res/values/flags.xml @@ -38,8 +38,6 @@ <!-- The new animations to/from lockscreen and AOD! --> <bool name="flag_lockscreen_animations">false</bool> - <bool name="flag_toast_style">false</bool> - <bool name="flag_pm_lite">false</bool> <bool name="flag_alarm_tile">false</bool> diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index bdc7bdb2d2f7..f4f881f1ffa5 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -100,6 +100,7 @@ <!-- For notification icons for which targetSdk < L, this caches whether the icon is grayscale --> <item type="id" name="icon_is_grayscale" /> <item type="id" name="image_icon_tag" /> + <item type="id" name="align_transform_end_tag" /> <item type="id" name="contains_transformed_view" /> <item type="id" name="is_clicked_heads_up_tag" /> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 01d0dde6da5e..db3fae6fa491 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1062,6 +1062,9 @@ <!-- Shows to explain the double tap interaction with notifications: After tapping a notification on Keyguard, this will explain users to tap again to launch a notification. [CHAR LIMIT=60] --> <string name="notification_tap_again">Tap again to open</string> + <!-- Asks for a second tap as confirmation on an item that normally requires one tap. [CHAR LIMIT=60] --> + <string name="tap_again">Tap again</string> + <!-- Message shown when lock screen is tapped or face authentication fails. [CHAR LIMIT=60] --> <string name="keyguard_unlock">Swipe up to open</string> diff --git a/packages/SystemUI/shared/Android.bp b/packages/SystemUI/shared/Android.bp index f98a959346d3..b2ae2a0ca8ad 100644 --- a/packages/SystemUI/shared/Android.bp +++ b/packages/SystemUI/shared/Android.bp @@ -40,7 +40,8 @@ android_library { name: "SystemUISharedLib", srcs: [ "src/**/*.java", - "src/**/I*.aidl", + "src/**/*.kt", + "src/**/*.aidl", ":wm_shell-aidls", ], diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java index 2cf3ad2dcd49..c468e416f8a5 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java @@ -36,6 +36,9 @@ import java.util.StringJoiner; * Various shared constants between Launcher and SysUI as part of quickstep */ public class QuickStepContract { + // Fully qualified name of the Launcher activity. + public static final String LAUNCHER_ACTIVITY_CLASS_NAME = + "com.google.android.apps.nexuslauncher.NexusLauncherActivity"; public static final String KEY_EXTRA_SYSUI_PROXY = "extra_sysui_proxy"; public static final String KEY_EXTRA_WINDOW_CORNER_RADIUS = "extra_window_corner_radius"; @@ -52,6 +55,8 @@ public class QuickStepContract { // See IStartingWindow.aidl public static final String KEY_EXTRA_SHELL_STARTING_WINDOW = "extra_shell_starting_window"; + // See ISmartspaceTransitionController.aidl + public static final String KEY_EXTRA_SMARTSPACE_TRANSITION_CONTROLLER = "smartspace_transition"; public static final String NAV_BAR_MODE_2BUTTON_OVERLAY = WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON_OVERLAY; diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/ISmartspaceCallback.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/ISmartspaceCallback.aidl new file mode 100644 index 000000000000..511df4c285b4 --- /dev/null +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/ISmartspaceCallback.aidl @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2021 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.shared.system.smartspace; + +import com.android.systemui.shared.system.smartspace.SmartspaceState; + +// Methods for getting and setting the state of a SmartSpace. This is used to allow a remote process +// (such as System UI) to sync with and control a SmartSpace view hosted in another process (such as +// Launcher). +interface ISmartspaceCallback { + + // Return information about the state of the SmartSpace, including location on-screen and + // currently selected page. + SmartspaceState getSmartspaceState(); + + // Set the currently selected page of this SmartSpace. + oneway void setSelectedPage(int selectedPage); + + oneway void setVisibility(int visibility); +}
\ No newline at end of file diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/ISmartspaceTransitionController.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/ISmartspaceTransitionController.aidl new file mode 100644 index 000000000000..2b3e961ab3b2 --- /dev/null +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/ISmartspaceTransitionController.aidl @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2021 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.shared.system.smartspace; + +import com.android.systemui.shared.system.smartspace.ISmartspaceCallback; + +// Controller that keeps track of SmartSpace instances in remote processes (such as Launcher). +interface ISmartspaceTransitionController { + oneway void setSmartspace(ISmartspaceCallback callback); +}
\ No newline at end of file diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/SmartspaceState.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/SmartspaceState.aidl new file mode 100644 index 000000000000..2d01d6af63c5 --- /dev/null +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/SmartspaceState.aidl @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2021 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.shared.system.smartspace; + +import com.android.systemui.shared.system.smartspace.SmartspaceState; + +parcelable SmartspaceState;
\ No newline at end of file diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/SmartspaceState.kt b/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/SmartspaceState.kt new file mode 100644 index 000000000000..2d51c4d13611 --- /dev/null +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/SmartspaceState.kt @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2021 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.shared.system.smartspace + +import android.graphics.Rect +import android.os.Parcel +import android.os.Parcelable + +/** + * Represents the state of a SmartSpace, including its location on screen and the index of the + * currently selected page. This object contains all of the information needed to synchronize two + * SmartSpace instances so that we can perform shared-element transitions between them. + */ +class SmartspaceState() : Parcelable { + var boundsOnScreen: Rect = Rect() + var selectedPage = 0 + + constructor(parcel: Parcel) : this() { + this.boundsOnScreen = parcel.readParcelable(Rect::javaClass.javaClass.classLoader) + this.selectedPage = parcel.readInt() + } + + override fun writeToParcel(dest: Parcel?, flags: Int) { + dest?.writeParcelable(boundsOnScreen, 0) + dest?.writeInt(selectedPage) + } + + override fun describeContents(): Int { + return 0 + } + + override fun toString(): String { + return "boundsOnScreen: $boundsOnScreen, selectedPage: $selectedPage" + } + + companion object CREATOR : Parcelable.Creator<SmartspaceState> { + override fun createFromParcel(parcel: Parcel): SmartspaceState { + return SmartspaceState(parcel) + } + + override fun newArray(size: Int): Array<SmartspaceState?> { + return arrayOfNulls(size) + } + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java index aa7f9a24b54a..28534d380c1f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java @@ -32,8 +32,10 @@ import com.android.keyguard.clock.ClockManager; import com.android.systemui.R; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.colorextraction.SysuiColorExtractor; +import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.shared.system.smartspace.SmartspaceTransitionController; import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.PropertyAnimator; @@ -44,7 +46,9 @@ import com.android.systemui.statusbar.phone.NotificationIconContainer; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.util.ViewController; +import java.util.HashSet; import java.util.Locale; +import java.util.Set; import java.util.TimeZone; import javax.inject.Inject; @@ -92,6 +96,9 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS // If set, will replace keyguard_status_area private View mSmartspaceView; + private final KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; + private SmartspaceTransitionController mSmartspaceTransitionController; + @Inject public KeyguardClockSwitchController( KeyguardClockSwitch keyguardClockSwitch, @@ -104,7 +111,9 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS BatteryController batteryController, KeyguardUpdateMonitor keyguardUpdateMonitor, KeyguardBypassController bypassController, - LockscreenSmartspaceController smartspaceController) { + LockscreenSmartspaceController smartspaceController, + KeyguardUnlockAnimationController keyguardUnlockAnimationController, + SmartspaceTransitionController smartspaceTransitionController) { super(keyguardClockSwitch); mStatusBarStateController = statusBarStateController; mColorExtractor = colorExtractor; @@ -116,6 +125,9 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mKeyguardUpdateMonitor = keyguardUpdateMonitor; mBypassController = bypassController; mSmartspaceController = smartspaceController; + + mKeyguardUnlockAnimationController = keyguardUnlockAnimationController; + mSmartspaceTransitionController = smartspaceTransitionController; } /** @@ -187,6 +199,7 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS nic.setLayoutParams(lp); mView.setSmartspaceView(mSmartspaceView); + mSmartspaceTransitionController.setLockscreenSmartspace(mSmartspaceView); } } @@ -285,12 +298,44 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS if (mSmartspaceView != null) { PropertyAnimator.setProperty(mSmartspaceView, AnimatableProperty.TRANSLATION_X, x, props, animate); + + // If we're unlocking with the SmartSpace shared element transition, let the controller + // know that it should re-position our SmartSpace. + if (mKeyguardUnlockAnimationController.isUnlockingWithSmartSpaceTransition()) { + mKeyguardUnlockAnimationController.updateLockscreenSmartSpacePosition(); + } else { + // Otherwise, reset Y translation in case it's still offset from a previous shared + // element transition. + ((View) mSmartspaceView).setTranslationY(0f); + } } mKeyguardSliceViewController.updatePosition(x, props, animate); mNotificationIconAreaController.updatePosition(x, props, animate); } + /** Sets an alpha value on every child view except for the smartspace. */ + public void setChildrenAlphaExcludingSmartspace(float alpha) { + final Set<View> excludedViews = new HashSet<>(); + + if (mSmartspaceView != null) { + excludedViews.add(mSmartspaceView); + } + + setChildrenAlphaExcluding(alpha, excludedViews); + } + + /** Sets an alpha value on every child view except for the views in the provided set. */ + public void setChildrenAlphaExcluding(float alpha, Set<View> excludedViews) { + for (int i = 0; i < mView.getChildCount(); i++) { + final View child = mView.getChildAt(i); + + if (!excludedViews.contains(child)) { + child.setAlpha(alpha); + } + } + } + void updateTimeZone(TimeZone timeZone) { mView.onTimeZoneChanged(timeZone); if (mClockViewController != null) { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java index 3ab2cca09a29..96eda3d95603 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java @@ -28,6 +28,7 @@ import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.View; +import android.view.ViewGroup; import android.widget.GridLayout; import android.widget.TextView; @@ -39,6 +40,7 @@ import com.android.systemui.statusbar.CrossFadeHelper; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.Set; /** * View consisting of: @@ -55,6 +57,7 @@ public class KeyguardStatusView extends GridLayout { private final LockPatternUtils mLockPatternUtils; private final IActivityManager mIActivityManager; + private ViewGroup mStatusViewContainer; private TextView mLogoutView; private KeyguardClockSwitch mClockView; private TextView mOwnerInfo; @@ -66,6 +69,7 @@ public class KeyguardStatusView extends GridLayout { private float mDarkAmount = 0; private int mTextColor; + private float mChildrenAlphaExcludingSmartSpace = 1f; /** * Bottom margin that defines the margin between bottom of smart space and top of notification @@ -132,6 +136,7 @@ public class KeyguardStatusView extends GridLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); + mStatusViewContainer = findViewById(R.id.status_view_container); mLogoutView = findViewById(R.id.logout); if (mLogoutView != null) { mLogoutView.setOnClickListener(this::onLogoutClicked); @@ -228,9 +233,7 @@ public class KeyguardStatusView extends GridLayout { } mDarkAmount = darkAmount; mClockView.setDarkAmount(darkAmount); - if (mMediaHostContainer.getVisibility() != View.GONE) { - CrossFadeHelper.fadeOut(mMediaHostContainer, darkAmount); - } + CrossFadeHelper.fadeOut(mMediaHostContainer, darkAmount); updateDark(); } @@ -251,6 +254,27 @@ public class KeyguardStatusView extends GridLayout { mClockView.setTextColor(blendedTextColor); } + public void setChildrenAlphaExcludingClockView(float alpha) { + setChildrenAlphaExcluding(alpha, Set.of(mClockView)); + } + + /** Sets an alpha value on every view except for the views in the provided set. */ + public void setChildrenAlphaExcluding(float alpha, Set<View> excludedViews) { + mChildrenAlphaExcludingSmartSpace = alpha; + + for (int i = 0; i < mStatusViewContainer.getChildCount(); i++) { + final View child = mStatusViewContainer.getChildAt(i); + + if (!excludedViews.contains(child)) { + child.setAlpha(alpha); + } + } + } + + public float getChildrenAlphaExcludingSmartSpace() { + return mChildrenAlphaExcludingSmartSpace; + } + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("KeyguardStatusView:"); pw.println(" mOwnerInfo: " + (mOwnerInfo == null diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java index 388c085fd1a0..7b6514a63195 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java @@ -20,6 +20,8 @@ import android.graphics.Rect; import android.os.UserHandle; import android.util.Slog; +import com.android.systemui.keyguard.KeyguardUnlockAnimationController; +import com.android.systemui.shared.system.smartspace.SmartspaceTransitionController; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.PropertyAnimator; import com.android.systemui.statusbar.notification.stack.AnimationProperties; @@ -49,6 +51,9 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV private final ConfigurationController mConfigurationController; private final DozeParameters mDozeParameters; private final KeyguardVisibilityHelper mKeyguardVisibilityHelper; + private final KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; + private final KeyguardStateController mKeyguardStateController; + private SmartspaceTransitionController mSmartspaceTransitionController; private final Rect mClipBounds = new Rect(); @Inject @@ -59,15 +64,33 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV KeyguardStateController keyguardStateController, KeyguardUpdateMonitor keyguardUpdateMonitor, ConfigurationController configurationController, - DozeParameters dozeParameters) { + DozeParameters dozeParameters, + KeyguardUnlockAnimationController keyguardUnlockAnimationController, + SmartspaceTransitionController smartspaceTransitionController) { super(keyguardStatusView); mKeyguardSliceViewController = keyguardSliceViewController; mKeyguardClockSwitchController = keyguardClockSwitchController; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mConfigurationController = configurationController; mDozeParameters = dozeParameters; + mKeyguardStateController = keyguardStateController; mKeyguardVisibilityHelper = new KeyguardVisibilityHelper(mView, keyguardStateController, dozeParameters); + mKeyguardUnlockAnimationController = keyguardUnlockAnimationController; + mSmartspaceTransitionController = smartspaceTransitionController; + + mKeyguardStateController.addCallback(new KeyguardStateController.Callback() { + @Override + public void onKeyguardShowingChanged() { + // If we explicitly re-show the keyguard, make sure that all the child views are + // visible. They might have been animating out as part of the SmartSpace shared + // element transition. + if (keyguardStateController.isShowing()) { + mView.setChildrenAlphaExcludingClockView(1f); + mKeyguardClockSwitchController.setChildrenAlphaExcludingSmartspace(1f); + } + } + }); } @Override @@ -137,7 +160,24 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV */ public void setAlpha(float alpha) { if (!mKeyguardVisibilityHelper.isVisibilityAnimating()) { - mView.setAlpha(alpha); + // If we're capable of performing the SmartSpace shared element transition, and we are + // going to (we're swiping to dismiss vs. bringing up the PIN screen), then fade out + // everything except for the SmartSpace. + if (mKeyguardUnlockAnimationController.isUnlockingWithSmartSpaceTransition()) { + mView.setChildrenAlphaExcludingClockView(alpha); + mKeyguardClockSwitchController.setChildrenAlphaExcludingSmartspace(alpha); + } else if (!mKeyguardVisibilityHelper.isVisibilityAnimating()) { + // Otherwise, we can just set the alpha for the entire container. + mView.setAlpha(alpha); + + // If we previously unlocked with the shared element transition, some child views + // might still have alpha = 0f. Set them back to 1f since we're just using the + // parent container's alpha. + if (mView.getChildrenAlphaExcludingSmartSpace() < 1f) { + mView.setChildrenAlphaExcludingClockView(1f); + mKeyguardClockSwitchController.setChildrenAlphaExcludingSmartspace(1f); + } + } } } diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java index 096597afa889..0d31906d2f80 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java @@ -16,22 +16,36 @@ package com.android.keyguard; import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.drawable.Drawable; import android.graphics.drawable.RippleDrawable; +import android.graphics.drawable.VectorDrawable; import android.util.AttributeSet; import android.view.MotionEvent; +import androidx.annotation.Nullable; + +import com.android.settingslib.Utils; +import com.android.systemui.R; + /** * Similar to the {@link NumPadKey}, but displays an image. */ public class NumPadButton extends AlphaOptimizedImageButton { + @Nullable private NumPadAnimator mAnimator; public NumPadButton(Context context, AttributeSet attrs) { super(context, attrs); - mAnimator = new NumPadAnimator(context, (RippleDrawable) getBackground(), - attrs.getStyleAttribute()); + Drawable background = getBackground(); + if (background instanceof RippleDrawable) { + mAnimator = new NumPadAnimator(context, (RippleDrawable) getBackground(), + attrs.getStyleAttribute()); + } else { + mAnimator = null; + } } @Override @@ -41,7 +55,7 @@ public class NumPadButton extends AlphaOptimizedImageButton { // Set width/height to the same value to ensure a smooth circle for the bg, but shrink // the height to match the old pin bouncer int width = getMeasuredWidth(); - int height = width; + int height = mAnimator == null ? (int) (width * .75f) : width; setMeasuredDimension(getMeasuredWidth(), height); } @@ -50,12 +64,12 @@ public class NumPadButton extends AlphaOptimizedImageButton { protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); - mAnimator.onLayout(b - t); + if (mAnimator != null) mAnimator.onLayout(b - t); } @Override public boolean onTouchEvent(MotionEvent event) { - if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { + if (event.getActionMasked() == MotionEvent.ACTION_DOWN && mAnimator != null) { mAnimator.start(); } return super.onTouchEvent(event); @@ -65,6 +79,13 @@ public class NumPadButton extends AlphaOptimizedImageButton { * Reload colors from resources. **/ public void reloadColors() { - mAnimator.reloadColors(getContext()); + if (mAnimator != null) { + mAnimator.reloadColors(getContext()); + } else { + // Needed for old style pin + int textColor = Utils.getColorAttr(getContext(), android.R.attr.textColorPrimary) + .getDefaultColor(); + ((VectorDrawable) getDrawable()).setTintList(ColorStateList.valueOf(textColor)); + } } } diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java index 35ace0d1a404..cffa630c6ec8 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java @@ -18,6 +18,7 @@ package com.android.keyguard; import android.content.Context; import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; import android.graphics.drawable.RippleDrawable; import android.os.PowerManager; import android.os.SystemClock; @@ -30,6 +31,8 @@ import android.view.ViewGroup; import android.view.accessibility.AccessibilityManager; import android.widget.TextView; +import androidx.annotation.Nullable; + import com.android.internal.widget.LockPatternUtils; import com.android.settingslib.Utils; import com.android.systemui.R; @@ -47,6 +50,7 @@ public class NumPadKey extends ViewGroup { private int mTextViewResId; private PasswordTextView mTextView; + @Nullable private NumPadAnimator mAnimator; private View.OnClickListener mListener = new View.OnClickListener() { @@ -126,8 +130,13 @@ public class NumPadKey extends ViewGroup { setContentDescription(mDigitText.getText().toString()); - mAnimator = new NumPadAnimator(context, (RippleDrawable) getBackground(), - R.style.NumPadKey); + Drawable background = getBackground(); + if (background instanceof RippleDrawable) { + mAnimator = new NumPadAnimator(context, (RippleDrawable) background, + R.style.NumPadKey); + } else { + mAnimator = null; + } } /** @@ -141,14 +150,14 @@ public class NumPadKey extends ViewGroup { mDigitText.setTextColor(textColor); mKlondikeText.setTextColor(klondikeColor); - mAnimator.reloadColors(getContext()); + if (mAnimator != null) mAnimator.reloadColors(getContext()); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { doHapticKeyClick(); - mAnimator.start(); + if (mAnimator != null) mAnimator.start(); } return super.onTouchEvent(event); @@ -162,7 +171,7 @@ public class NumPadKey extends ViewGroup { // Set width/height to the same value to ensure a smooth circle for the bg, but shrink // the height to match the old pin bouncer int width = getMeasuredWidth(); - int height = width; + int height = mAnimator == null ? (int) (width * .75f) : width; setMeasuredDimension(getMeasuredWidth(), height); } @@ -183,7 +192,7 @@ public class NumPadKey extends ViewGroup { left = centerX - mKlondikeText.getMeasuredWidth() / 2; mKlondikeText.layout(left, top, left + mKlondikeText.getMeasuredWidth(), bottom); - mAnimator.onLayout(b - t); + if (mAnimator != null) mAnimator.onLayout(b - t); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index afda2a406e00..e9c565377530 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -236,7 +236,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { Log.i(TAG, "ScreenDecorations is disabled"); return; } - mHandler = mThreadFactory.builderHandlerOnNewThread("ScreenDecorations"); + mHandler = mThreadFactory.buildHandlerOnNewThread("ScreenDecorations"); mExecutor = mThreadFactory.buildDelayableExecutorOnHandler(mHandler); mExecutor.execute(this::startOnScreenDecorationsThread); mDotViewController.setUiExecutor(mExecutor); diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index cc167b928c3c..e6fe0600b9b8 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -133,6 +133,7 @@ public class SystemUIFactory { .setTaskViewFactory(Optional.ofNullable(null)) .setTransitions(Transitions.createEmptyForTesting()) .setStartingSurface(Optional.ofNullable(null)); + } mSysUIComponent = builder.build(); if (mInitializeComponents) { diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java index ee7eb4b50bcb..964b135d7b50 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java @@ -16,6 +16,7 @@ package com.android.systemui.accessibility; +import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_NONE; import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; import android.annotation.NonNull; @@ -70,7 +71,7 @@ class MagnificationModeSwitch implements MagnificationGestureDetector.OnGestureL private final ImageView mImageView; private final Runnable mWindowInsetChangeRunnable; private final SfVsyncFrameCallbackProvider mSfVsyncFrameProvider; - private int mMagnificationMode = Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; + private int mMagnificationMode = ACCESSIBILITY_MAGNIFICATION_MODE_NONE; private final LayoutParams mParams; @VisibleForTesting final Rect mDraggableWindowBounds = new Rect(); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index 9871b4efa3d8..146f430c88a1 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -54,14 +54,16 @@ import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.SomeArgs; import com.android.systemui.SystemUI; +import com.android.systemui.assist.ui.DisplayUtils; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.doze.DozeReceiver; -import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.CommandQueue; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.inject.Inject; import javax.inject.Provider; @@ -79,13 +81,14 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, private final Handler mHandler = new Handler(Looper.getMainLooper()); private final CommandQueue mCommandQueue; - private final StatusBarStateController mStatusBarStateController; private final ActivityTaskManager mActivityTaskManager; @Nullable private final FingerprintManager mFingerprintManager; @Nullable private final FaceManager mFaceManager; private final Provider<UdfpsController> mUdfpsControllerFactory; private final Provider<SidefpsController> mSidefpsControllerFactory; @Nullable private final PointF mFaceAuthSensorLocation; + @Nullable private final PointF mFingerprintLocation; + private final Set<Callback> mCallbacks = new HashSet<>(); // TODO: These should just be saved from onSaveState private SomeArgs mCurrentDialogArgs; @@ -142,6 +145,10 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, if (mSidefpsProps != null) { mSidefpsController = mSidefpsControllerFactory.get(); } + + for (Callback cb : mCallbacks) { + cb.onAllAuthenticatorsRegistered(); + } } }; @@ -195,6 +202,20 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } } + /** + * Adds a callback. See {@link Callback}. + */ + public void addCallback(@NonNull Callback callback) { + mCallbacks.add(callback); + } + + /** + * Removes a callback. See {@link Callback}. + */ + public void removeCallback(@NonNull Callback callback) { + mCallbacks.remove(callback); + } + @Override public void dozeTimeTick() { if (mUdfpsController != null) { @@ -335,6 +356,17 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } /** + * @return where the fingerprint sensor exists in pixels in portrait mode. devices without an + * overridden value will use the default value even if they don't have a fingerprint sensor + */ + @Nullable public PointF getFingerprintSensorLocation() { + if (getUdfpsSensorLocation() != null) { + return getUdfpsSensorLocation(); + } + return mFingerprintLocation; + } + + /** * @return where the face authentication sensor exists relative to the screen in pixels in * portrait mode. */ @@ -387,7 +419,6 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, @Inject public AuthController(Context context, CommandQueue commandQueue, - StatusBarStateController statusBarStateController, ActivityTaskManager activityTaskManager, @Nullable FingerprintManager fingerprintManager, @Nullable FaceManager faceManager, @@ -395,7 +426,6 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, Provider<SidefpsController> sidefpsControllerFactory) { super(context); mCommandQueue = commandQueue; - mStatusBarStateController = statusBarStateController; mActivityTaskManager = activityTaskManager; mFingerprintManager = fingerprintManager; mFaceManager = faceManager; @@ -414,6 +444,10 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, (float) faceAuthLocation[1]); } + mFingerprintLocation = new PointF(DisplayUtils.getWidth(mContext) / 2, + mContext.getResources().getDimensionPixelSize( + com.android.systemui.R.dimen.physical_fingerprint_sensor_center_screen_location_y)); + IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); @@ -481,14 +515,24 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, */ @Override public void onBiometricAuthenticated() { - mCurrentDialog.onAuthenticationSucceeded(); + if (DEBUG) Log.d(TAG, "onBiometricAuthenticated: "); + + if (mCurrentDialog != null) { + mCurrentDialog.onAuthenticationSucceeded(); + } else { + Log.w(TAG, "onBiometricAuthenticated callback but dialog gone"); + } } @Override public void onBiometricHelp(String message) { if (DEBUG) Log.d(TAG, "onBiometricHelp: " + message); - mCurrentDialog.onHelp(message); + if (mCurrentDialog != null) { + mCurrentDialog.onHelp(message); + } else { + Log.w(TAG, "onBiometricHelp callback but dialog gone"); + } } @Nullable @@ -527,19 +571,23 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, final boolean isSoftError = (error == BiometricConstants.BIOMETRIC_PAUSED_REJECTED || error == BiometricConstants.BIOMETRIC_ERROR_TIMEOUT); - if (mCurrentDialog.isAllowDeviceCredentials() && isLockout) { - if (DEBUG) Log.d(TAG, "onBiometricError, lockout"); - mCurrentDialog.animateToCredentialUI(); - } else if (isSoftError) { - final String errorMessage = (error == BiometricConstants.BIOMETRIC_PAUSED_REJECTED) - ? mContext.getString(R.string.biometric_not_recognized) - : getErrorString(modality, error, vendorCode); - if (DEBUG) Log.d(TAG, "onBiometricError, soft error: " + errorMessage); - mCurrentDialog.onAuthenticationFailed(errorMessage); + if (mCurrentDialog != null) { + if (mCurrentDialog.isAllowDeviceCredentials() && isLockout) { + if (DEBUG) Log.d(TAG, "onBiometricError, lockout"); + mCurrentDialog.animateToCredentialUI(); + } else if (isSoftError) { + final String errorMessage = (error == BiometricConstants.BIOMETRIC_PAUSED_REJECTED) + ? mContext.getString(R.string.biometric_not_recognized) + : getErrorString(modality, error, vendorCode); + if (DEBUG) Log.d(TAG, "onBiometricError, soft error: " + errorMessage); + mCurrentDialog.onAuthenticationFailed(errorMessage); + } else { + final String errorMessage = getErrorString(modality, error, vendorCode); + if (DEBUG) Log.d(TAG, "onBiometricError, hard error: " + errorMessage); + mCurrentDialog.onError(errorMessage); + } } else { - final String errorMessage = getErrorString(modality, error, vendorCode); - if (DEBUG) Log.d(TAG, "onBiometricError, hard error: " + errorMessage); - mCurrentDialog.onError(errorMessage); + Log.w(TAG, "onBiometricError callback but dialog is gone"); } onCancelUdfps(); @@ -697,4 +745,12 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, .setMultiSensorConfig(multiSensorConfig) .build(sensorIds, credentialAllowed, mFpProps, mFaceProps); } + + interface Callback { + /** + * Called when authenticators are registered. If authenticators are already + * registered before this call, this callback will never be triggered. + */ + void onAllAuthenticatorsRegistered(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt index 257bd25f4afe..cf577a37d625 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt @@ -28,6 +28,7 @@ import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.commandline.Command import com.android.systemui.statusbar.commandline.CommandRegistry import com.android.systemui.statusbar.phone.KeyguardBypassController +import com.android.systemui.statusbar.phone.StatusBar import com.android.systemui.statusbar.phone.dagger.StatusBarComponent.StatusBarScope import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.ViewController @@ -40,6 +41,7 @@ import javax.inject.Inject */ @StatusBarScope class AuthRippleController @Inject constructor( + private val statusBar: StatusBar, private val sysuiContext: Context, private val authController: AuthController, private val configurationController: ConfigurationController, @@ -49,13 +51,14 @@ class AuthRippleController @Inject constructor( private val bypassController: KeyguardBypassController, rippleView: AuthRippleView? ) : ViewController<AuthRippleView>(rippleView) { - private var fingerprintSensorLocation: PointF? = null + var fingerprintSensorLocation: PointF? = null private var faceSensorLocation: PointF? = null @VisibleForTesting public override fun onViewAttached() { updateRippleColor() updateSensorLocation() + authController.addCallback(authControllerCallback) configurationController.addCallback(configurationChangedListener) keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback) commandRegistry.registerCommand("auth-ripple") { AuthRippleCommand() } @@ -63,6 +66,7 @@ class AuthRippleController @Inject constructor( @VisibleForTesting public override fun onViewDetached() { + authController.removeCallback(authControllerCallback) keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback) configurationController.removeCallback(configurationChangedListener) commandRegistry.unregisterCommand("auth-ripple") @@ -97,9 +101,10 @@ class AuthRippleController @Inject constructor( }) } - private fun updateSensorLocation() { - fingerprintSensorLocation = authController.udfpsSensorLocation + fun updateSensorLocation() { + fingerprintSensorLocation = authController.fingerprintSensorLocation faceSensorLocation = authController.faceAuthSensorLocation + statusBar.updateCircleReveal() } private fun updateRippleColor() { @@ -134,6 +139,8 @@ class AuthRippleController @Inject constructor( } } + private val authControllerCallback = AuthController.Callback { updateSensorLocation() } + inner class AuthRippleCommand : Command { override fun execute(pw: PrintWriter, args: List<String>) { if (args.isEmpty()) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt index 374ddaedb405..01fbe398f8b6 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt @@ -23,7 +23,11 @@ import android.content.Context import android.graphics.Canvas import android.graphics.Paint import android.graphics.PointF +import android.media.AudioAttributes +import android.os.VibrationEffect +import android.os.Vibrator import android.util.AttributeSet +import android.util.MathUtils import android.view.View import android.view.animation.PathInterpolator import com.android.internal.graphics.ColorUtils @@ -31,15 +35,26 @@ import com.android.systemui.statusbar.charging.RippleShader private const val RIPPLE_ANIMATION_DURATION: Long = 1533 private const val RIPPLE_SPARKLE_STRENGTH: Float = 0.4f +private const val RIPPLE_VIBRATION_PRIMITIVE: Int = VibrationEffect.Composition.PRIMITIVE_LOW_TICK +private const val RIPPLE_VIBRATION_SIZE: Int = 60 +private const val RIPPLE_VIBRATION_SCALE_START: Float = 0.6f +private const val RIPPLE_VIBRATION_SCALE_DECAY: Float = -0.1f /** * Expanding ripple effect on the transition from biometric authentication success to showing * launcher. */ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, attrs) { + private val vibrator: Vibrator? = context?.getSystemService(Vibrator::class.java) private var rippleInProgress: Boolean = false private val rippleShader = RippleShader() private val ripplePaint = Paint() + private val rippleVibrationEffect = createVibrationEffect(vibrator) + private val rippleVibrationAttrs = + AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) + .build() init { rippleShader.color = 0xffffffff.toInt() // default color @@ -95,6 +110,7 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at visibility = GONE } }) + vibrate() animatorSet.start() visibility = VISIBLE rippleInProgress = true @@ -108,4 +124,23 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at // draw over the entire screen canvas?.drawRect(0f, 0f, width.toFloat(), height.toFloat(), ripplePaint) } + + private fun vibrate() { + if (rippleVibrationEffect != null) { + vibrator?.vibrate(rippleVibrationEffect, rippleVibrationAttrs) + } + } + + private fun createVibrationEffect(vibrator: Vibrator?): VibrationEffect? { + if (vibrator?.areAllPrimitivesSupported(RIPPLE_VIBRATION_PRIMITIVE) == false) { + return null + } + val composition = VibrationEffect.startComposition() + for (i in 0 until RIPPLE_VIBRATION_SIZE) { + val scale = + RIPPLE_VIBRATION_SCALE_START * MathUtils.exp(RIPPLE_VIBRATION_SCALE_DECAY * i) + composition.addPrimitive(RIPPLE_VIBRATION_PRIMITIVE, scale, 0 /* delay */) + } + return composition.compose() + } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 3075617cafdf..5c360a649af0 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -496,7 +496,6 @@ public class UdfpsController implements DozeReceiver { mSensorProps = findFirstUdfps(); // At least one UDFPS sensor exists checkArgument(mSensorProps != null); - mStatusBar.setSensorRect(getSensorLocation()); mCoreLayoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG, diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java index ee69e277cc46..dba530edc27f 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerFake.java @@ -40,6 +40,7 @@ public class FalsingManagerFake implements FalsingManager { private boolean mIsFalseRobustTap; private final List<FalsingBeliefListener> mFalsingBeliefListeners = new ArrayList<>(); + private final List<FalsingTapListener> mTapListeners = new ArrayList<>(); @Override public void onSuccessfulUnlock() { @@ -148,11 +149,15 @@ public class FalsingManagerFake implements FalsingManager { @Override public void addTapListener(FalsingTapListener falsingTapListener) { - + mTapListeners.add(falsingTapListener); } @Override public void removeTapListener(FalsingTapListener falsingTapListener) { + mTapListeners.remove(falsingTapListener); + } + public List<FalsingTapListener> getTapListeners() { + return mTapListeners; } } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java index 26db33d6dea8..053d75d96720 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java @@ -46,6 +46,7 @@ import android.hardware.display.DisplayManager; import android.hardware.face.FaceManager; import android.hardware.fingerprint.FingerprintManager; import android.media.AudioManager; +import android.media.IAudioService; import android.media.MediaRouter2Manager; import android.media.session.MediaSessionManager; import android.net.ConnectivityManager; @@ -77,6 +78,8 @@ import com.android.systemui.dagger.qualifiers.DisplayId; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.shared.system.PackageManagerWrapper; +import java.util.Optional; + import javax.inject.Singleton; import dagger.Module; @@ -167,6 +170,13 @@ public class FrameworkServicesModule { @Provides @Singleton + static IAudioService provideIAudioService() { + return IAudioService.Stub.asInterface(ServiceManager.getService(Context.AUDIO_SERVICE)); + } + + + @Provides + @Singleton static IBatteryStats provideIBatteryStats() { return IBatteryStats.Stub.asInterface( ServiceManager.getService(BatteryStats.SERVICE_NAME)); @@ -362,6 +372,12 @@ public class FrameworkServicesModule { @Provides @Singleton + static Optional<Vibrator> provideOptionalVibrator(Context context) { + return Optional.ofNullable(context.getSystemService(Vibrator.class)); + } + + @Provides + @Singleton static ViewConfiguration provideViewConfiguration(Context context) { return ViewConfiguration.get(context); } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index 1396099db948..f422e9e40d33 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -45,6 +45,7 @@ import com.android.systemui.power.dagger.PowerModule; import com.android.systemui.recents.Recents; import com.android.systemui.screenshot.dagger.ScreenshotModule; import com.android.systemui.settings.dagger.SettingsModule; +import com.android.systemui.shared.system.smartspace.SmartspaceTransitionController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.NotificationLockscreenUserManager; @@ -173,6 +174,12 @@ public abstract class SystemUIModule { return SystemUIFactory.getInstance(); } + @SysUISingleton + @Provides + static SmartspaceTransitionController provideSmartspaceTransitionController() { + return new SmartspaceTransitionController(); + } + // TODO: This should provided by the WM component /** Provides Optional of BubbleManager */ @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt index 411c328cd310..665376ac4569 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt @@ -23,11 +23,14 @@ import android.content.Context import android.graphics.Matrix import android.view.RemoteAnimationTarget import android.view.SyncRtSurfaceTransactionApplier +import android.view.View import androidx.core.math.MathUtils import com.android.internal.R +import com.android.keyguard.KeyguardClockSwitchController import com.android.keyguard.KeyguardViewController import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.shared.system.smartspace.SmartspaceTransitionController import com.android.systemui.statusbar.policy.KeyguardStateController import dagger.Lazy import javax.inject.Inject @@ -85,7 +88,8 @@ class KeyguardUnlockAnimationController @Inject constructor( context: Context, private val keyguardStateController: KeyguardStateController, private val keyguardViewMediator: Lazy<KeyguardViewMediator>, - private val keyguardViewController: KeyguardViewController + private val keyguardViewController: KeyguardViewController, + private val smartspaceTransitionController: SmartspaceTransitionController ) : KeyguardStateController.Callback { /** @@ -131,6 +135,21 @@ class KeyguardUnlockAnimationController @Inject constructor( /** Rounded corner radius to apply to the surface behind the keyguard. */ private var roundedCornerRadius = 0f + /** The SmartSpace view on the lockscreen, provided by [KeyguardClockSwitchController]. */ + public var lockscreenSmartSpace: View? = null + + /** + * Whether we are currently in the process of unlocking the keyguard, and we are performing the + * shared element SmartSpace transition. + */ + private var unlockingWithSmartSpaceTransition: Boolean = false + + /** + * Whether we tried to start the SmartSpace shared element transition for this unlock swipe. + * It's possible we're unable to do so (if the Launcher SmartSpace is not available). + */ + private var attemptedSmartSpaceTransitionForThisSwipe = false + init { surfaceBehindAlphaAnimator.duration = 150 surfaceBehindAlphaAnimator.interpolator = Interpolators.ALPHA_IN @@ -214,6 +233,24 @@ class KeyguardUnlockAnimationController @Inject constructor( } /** + * Whether we are currently in the process of unlocking the keyguard, and we are performing the + * shared element SmartSpace transition. + */ + fun isUnlockingWithSmartSpaceTransition(): Boolean { + return unlockingWithSmartSpaceTransition + } + + /** + * Update the lockscreen SmartSpace to be positioned according to the current dismiss amount. As + * the dismiss amount increases, we will increase our SmartSpace's progress to the destination + * bounds (the location of the Launcher SmartSpace). + */ + fun updateLockscreenSmartSpacePosition() { + smartspaceTransitionController.setProgressToDestinationBounds( + keyguardStateController.dismissAmount / DISMISS_AMOUNT_EXIT_KEYGUARD_THRESHOLD) + } + + /** * Scales in and translates up the surface behind the keyguard. This is used during unlock * animations and swipe gestures to animate the surface's entry (and exit, if the swipe is * cancelled). @@ -284,36 +321,85 @@ class KeyguardUnlockAnimationController @Inject constructor( return } + if (keyguardViewController.isShowing) { + updateKeyguardViewMediatorIfThresholdsReached() + + // If the surface is visible or it's about to be, start updating its appearance to + // reflect the new dismiss amount. + if (keyguardViewMediator.get().requestedShowSurfaceBehindKeyguard() || + keyguardViewMediator.get().isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe) { + updateSurfaceBehindAppearAmount() + } + } + + // The end of the SmartSpace transition can occur after the keyguard is hidden (when we tell + // Launcher's SmartSpace to become visible again), so update it even if the keyguard view is + // no longer showing. + updateSmartSpaceTransition() + } + + /** + * Lets the KeyguardViewMediator know if the dismiss amount has crossed a threshold of interest, + * such as reaching the point in the dismiss swipe where we need to make the surface behind the + * keyguard visible. + */ + private fun updateKeyguardViewMediatorIfThresholdsReached() { val dismissAmount = keyguardStateController.dismissAmount // Hide the keyguard if we're fully dismissed, or if we're swiping to dismiss and have // crossed the threshold to finish the dismissal. val reachedHideKeyguardThreshold = (dismissAmount >= 1f || (keyguardStateController.isDismissingFromSwipe && - // Don't hide if we're flinging during a swipe, since we need to finish - // animating it out. This will be called again after the fling ends. - !keyguardStateController.isFlingingToDismissKeyguardDuringSwipeGesture && - dismissAmount >= DISMISS_AMOUNT_EXIT_KEYGUARD_THRESHOLD)) + // Don't hide if we're flinging during a swipe, since we need to finish + // animating it out. This will be called again after the fling ends. + !keyguardStateController.isFlingingToDismissKeyguardDuringSwipeGesture && + dismissAmount >= DISMISS_AMOUNT_EXIT_KEYGUARD_THRESHOLD)) if (dismissAmount >= DISMISS_AMOUNT_SHOW_SURFACE_THRESHOLD && !keyguardViewMediator.get().requestedShowSurfaceBehindKeyguard()) { - // We passed the threshold, and we're not yet showing the surface behind the keyguard. - // Animate it in. + // We passed the threshold, and we're not yet showing the surface behind the + // keyguard. Animate it in. keyguardViewMediator.get().showSurfaceBehindKeyguard() fadeInSurfaceBehind() } else if (dismissAmount < DISMISS_AMOUNT_SHOW_SURFACE_THRESHOLD && keyguardViewMediator.get().requestedShowSurfaceBehindKeyguard()) { - // We're no longer past the threshold but we are showing the surface. Animate it out. + // We're no longer past the threshold but we are showing the surface. Animate it + // out. keyguardViewMediator.get().hideSurfaceBehindKeyguard() fadeOutSurfaceBehind() - } else if (keyguardViewMediator.get().isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe && + } else if (keyguardViewMediator.get() + .isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe && reachedHideKeyguardThreshold) { keyguardViewMediator.get().onKeyguardExitRemoteAnimationFinished() } + } - if (keyguardViewMediator.get().requestedShowSurfaceBehindKeyguard() || - keyguardViewMediator.get().isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe) { - updateSurfaceBehindAppearAmount() + /** + * Updates flags related to the SmartSpace transition in response to a change in keyguard + * dismiss amount, and also updates the SmartSpaceTransitionController, which will let Launcher + * know if it needs to do something as a result. + */ + private fun updateSmartSpaceTransition() { + val dismissAmount = keyguardStateController.dismissAmount + + // If we've begun a swipe, and are capable of doing the SmartSpace transition, start it! + if (!attemptedSmartSpaceTransitionForThisSwipe && + dismissAmount > 0f && + dismissAmount < 1f && + keyguardViewController.isShowing) { + attemptedSmartSpaceTransitionForThisSwipe = true + + smartspaceTransitionController.prepareForUnlockTransition() + if (keyguardStateController.canPerformSmartSpaceTransition()) { + unlockingWithSmartSpaceTransition = true + smartspaceTransitionController.launcherSmartspace?.setVisibility( + View.INVISIBLE) + } + } else if (attemptedSmartSpaceTransitionForThisSwipe && + (dismissAmount == 0f || dismissAmount == 1f)) { + attemptedSmartSpaceTransitionForThisSwipe = false + unlockingWithSmartSpaceTransition = false + smartspaceTransitionController.launcherSmartspace?.setVisibility(View.VISIBLE) } } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index 8532a46f0fc5..27a4e93db4ad 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -447,11 +447,8 @@ public class MediaControlPanel { if (mKey != null) { closeGuts(); - mKeyguardDismissUtil.executeWhenUnlocked(() -> { - mMediaDataManagerLazy.get().dismissMediaData(mKey, - MediaViewController.GUTS_ANIMATION_DURATION + 100); - return true; - }, /* requiresShadeOpen */ true, false); + mMediaDataManagerLazy.get().dismissMediaData(mKey, + MediaViewController.GUTS_ANIMATION_DURATION + 100); } else { Log.w(TAG, "Dismiss media with null notification. Token uid=" + data.getToken().getUid()); @@ -576,11 +573,8 @@ public class MediaControlPanel { logSmartspaceCardReported(761, // SMARTSPACE_CARD_DISMISS /* isRecommendationCard */ true); closeGuts(); - mKeyguardDismissUtil.executeWhenUnlocked(() -> { - mMediaDataManagerLazy.get().dismissSmartspaceRecommendation( - MediaViewController.GUTS_ANIMATION_DURATION + 100L); - return true; - }, true /* requiresShadeOpen */, false); + mMediaDataManagerLazy.get().dismissSmartspaceRecommendation( + MediaViewController.GUTS_ANIMATION_DURATION + 100L); }); mController = null; diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt index 73dfe5e68d9a..075bc700cfa0 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt @@ -26,21 +26,23 @@ import android.util.MathUtils import android.view.View import android.view.ViewGroup import android.view.ViewGroupOverlay +import androidx.annotation.VisibleForTesting import com.android.systemui.R import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.statusbar.CrossFadeHelper import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.SysuiStatusBarStateController import com.android.systemui.statusbar.notification.stack.StackStateAnimator import com.android.systemui.statusbar.phone.KeyguardBypassController +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.animation.UniqueObjectHostView import javax.inject.Inject -import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager /** * Similarly to isShown but also excludes views that have 0 alpha @@ -80,6 +82,7 @@ class MediaHierarchyManager @Inject constructor( wakefulnessLifecycle: WakefulnessLifecycle, private val statusBarKeyguardViewManager: StatusBarKeyguardViewManager ) { + /** * The root overlay of the hierarchy. This is where the media notification is attached to * whenever the view is transitioning from one host to another. It also make sure that the @@ -90,6 +93,30 @@ class MediaHierarchyManager @Inject constructor( private var rootView: View? = null private var currentBounds = Rect() private var animationStartBounds: Rect = Rect() + + /** + * The cross fade progress at the start of the animation. 0.5f means it's just switching between + * the start and the end location and the content is fully faded, while 0.75f means that we're + * halfway faded in again in the target state. + */ + private var animationStartCrossFadeProgress = 0.0f + + /** + * The starting alpha of the animation + */ + private var animationStartAlpha = 0.0f + + /** + * The starting location of the cross fade if an animation is running right now. + */ + @MediaLocation + private var crossFadeAnimationStartLocation = -1 + + /** + * The end location of the cross fade if an animation is running right now. + */ + @MediaLocation + private var crossFadeAnimationEndLocation = -1 private var targetBounds: Rect = Rect() private val mediaFrame get() = mediaCarouselController.mediaFrame @@ -98,9 +125,22 @@ class MediaHierarchyManager @Inject constructor( interpolator = Interpolators.FAST_OUT_SLOW_IN addUpdateListener { updateTargetState() - interpolateBounds(animationStartBounds, targetBounds, animatedFraction, + val currentAlpha: Float + var boundsProgress = animatedFraction + if (isCrossFadeAnimatorRunning) { + animationCrossFadeProgress = MathUtils.lerp(animationStartCrossFadeProgress, 1.0f, + animatedFraction) + // When crossfading, let's keep the bounds at the right location during fading + boundsProgress = if (animationCrossFadeProgress < 0.5f) 0.0f else 1.0f + currentAlpha = calculateAlphaFromCrossFade(animationCrossFadeProgress, + instantlyShowAtEnd = false) + } else { + // If we're not crossfading, let's interpolate from the start alpha to 1.0f + currentAlpha = MathUtils.lerp(animationStartAlpha, 1.0f, animatedFraction) + } + interpolateBounds(animationStartBounds, targetBounds, boundsProgress, result = currentBounds) - applyState(currentBounds) + applyState(currentBounds, currentAlpha) } addListener(object : AnimatorListenerAdapter() { private var cancelled: Boolean = false @@ -112,6 +152,7 @@ class MediaHierarchyManager @Inject constructor( } override fun onAnimationEnd(animation: Animator?) { + isCrossFadeAnimatorRunning = false if (!cancelled) { applyTargetStateIfNotAnimating() } @@ -192,11 +233,6 @@ class MediaHierarchyManager @Inject constructor( private var distanceForFullShadeTransition = 0 /** - * Delay after which the media will start transitioning to the full shade on the lockscreen. - */ - private var fullShadeTransitionDelay = 0 - - /** * The amount of progress we are currently in if we're transitioning to the full shade. * 0.0f means we're not transitioning yet, while 1 means we're all the way in the full * shade. @@ -207,18 +243,33 @@ class MediaHierarchyManager @Inject constructor( return } field = value - if (bypassController.bypassEnabled) { + if (bypassController.bypassEnabled || statusbarState != StatusBarState.KEYGUARD) { + // No need to do all the calculations / updates below if we're not on the lockscreen + // or if we're bypassing. return } - updateDesiredLocation() + updateDesiredLocation(forceNoAnimation = isCurrentlyFading()) if (value >= 0) { updateTargetState() + // Setting the alpha directly, as the below call will use it to update the alpha + carouselAlpha = calculateAlphaFromCrossFade(field, instantlyShowAtEnd = true) applyTargetStateIfNotAnimating() } } + /** + * Is there currently a cross-fade animation running driven by an animator? + */ + private var isCrossFadeAnimatorRunning = false + + /** + * Are we currently transitionioning from the lockscreen to the full shade + * [StatusBarState.SHADE_LOCKED] or [StatusBarState.SHADE]. Once the user has dragged down and + * the transition starts, this will no longer return true. + */ private val isTransitioningToFullShade: Boolean - get() = fullShadeTransitionProgress != 0f && !bypassController.bypassEnabled + get() = fullShadeTransitionProgress != 0f && !bypassController.bypassEnabled && + statusbarState == StatusBarState.KEYGUARD /** * Set the amount of pixels we have currently dragged down if we're transitioning to the full @@ -227,14 +278,8 @@ class MediaHierarchyManager @Inject constructor( fun setTransitionToFullShadeAmount(value: Float) { // If we're transitioning starting on the shade_locked, we don't want any delay and rather // have it aligned with the rest of the animation - val delay = if (statusbarState == StatusBarState.KEYGUARD) { - fullShadeTransitionDelay - } else { - 0 - } - val progress = MathUtils.saturate((value - delay) / - (distanceForFullShadeTransition - delay)) - fullShadeTransitionProgress = Interpolators.FAST_OUT_SLOW_IN.getInterpolation(progress) + val progress = MathUtils.saturate(value / distanceForFullShadeTransition) + fullShadeTransitionProgress = progress } /** @@ -296,6 +341,49 @@ class MediaHierarchyManager @Inject constructor( } } + /** + * The current cross fade progress. 0.5f means it's just switching + * between the start and the end location and the content is fully faded, while 0.75f means + * that we're halfway faded in again in the target state. + * This is only valid while [isCrossFadeAnimatorRunning] is true. + */ + private var animationCrossFadeProgress = 1.0f + + /** + * The current carousel Alpha. + */ + private var carouselAlpha: Float = 1.0f + set(value) { + if (field == value) { + return + } + field = value + CrossFadeHelper.fadeIn(mediaFrame, value) + } + + /** + * Calculate the alpha of the view when given a cross-fade progress. + * + * @param crossFadeProgress The current cross fade progress. 0.5f means it's just switching + * between the start and the end location and the content is fully faded, while 0.75f means + * that we're halfway faded in again in the target state. + * + * @param instantlyShowAtEnd should the view be instantly shown at the end. This is needed + * to avoid fadinging in when the target was hidden anyway. + */ + private fun calculateAlphaFromCrossFade( + crossFadeProgress: Float, + instantlyShowAtEnd: Boolean + ): Float { + if (crossFadeProgress <= 0.5f) { + return 1.0f - crossFadeProgress / 0.5f + } else if (instantlyShowAtEnd) { + return 1.0f + } else { + return (crossFadeProgress - 0.5f) / 0.5f + } + } + init { updateConfiguration() configurationController.addCallback(object : ConfigurationController.ConfigurationListener { @@ -375,9 +463,7 @@ class MediaHierarchyManager @Inject constructor( private fun updateConfiguration() { distanceForFullShadeTransition = context.resources.getDimensionPixelSize( - R.dimen.lockscreen_shade_qs_transition_distance) - fullShadeTransitionDelay = context.resources.getDimensionPixelSize( - R.dimen.lockscreen_shade_media_transition_start_delay) + R.dimen.lockscreen_shade_media_transition_distance) } /** @@ -449,8 +535,13 @@ class MediaHierarchyManager @Inject constructor( shouldAnimateTransition(desiredLocation, previousLocation) val (animDuration, delay) = getAnimationParams(previousLocation, desiredLocation) val host = getHost(desiredLocation) - mediaCarouselController.onDesiredLocationChanged(desiredLocation, host, animate, - animDuration, delay) + val willFade = calculateTransformationType() == TRANSFORMATION_TYPE_FADE + if (!willFade || isCurrentlyInGuidedTransformation() || !animate) { + // if we're fading, we want the desired location / measurement only to change + // once fully faded. This is happening in the host attachment + mediaCarouselController.onDesiredLocationChanged(desiredLocation, host, + animate, animDuration, delay) + } performTransitionToNewLocation(isNewView, animate) } } @@ -470,6 +561,8 @@ class MediaHierarchyManager @Inject constructor( if (isCurrentlyInGuidedTransformation()) { applyTargetStateIfNotAnimating() } else if (animate) { + val wasCrossFading = isCrossFadeAnimatorRunning + val previewsCrossFadeProgress = animationCrossFadeProgress animator.cancel() if (currentAttachmentLocation != previousLocation || !previousHost.hostView.isAttachedToWindow) { @@ -482,6 +575,42 @@ class MediaHierarchyManager @Inject constructor( // be outdated animationStartBounds.set(previousHost.currentBounds) } + val transformationType = calculateTransformationType() + var needsCrossFade = transformationType == TRANSFORMATION_TYPE_FADE + var crossFadeStartProgress = 0.0f + // The alpha is only relevant when not cross fading + var newCrossFadeStartLocation = previousLocation + if (wasCrossFading) { + if (currentAttachmentLocation == crossFadeAnimationEndLocation) { + if (needsCrossFade) { + // We were previously crossFading and we've already reached + // the end view, Let's start crossfading from the same position there + crossFadeStartProgress = 1.0f - previewsCrossFadeProgress + } + // Otherwise let's fade in from the current alpha, but not cross fade + } else { + // We haven't reached the previous location yet, let's still cross fade from + // where we were. + newCrossFadeStartLocation = crossFadeAnimationStartLocation + if (newCrossFadeStartLocation == desiredLocation) { + // we're crossFading back to where we were, let's start at the end position + crossFadeStartProgress = 1.0f - previewsCrossFadeProgress + } else { + // Let's start from where we are right now + crossFadeStartProgress = previewsCrossFadeProgress + // We need to force cross fading as we haven't reached the end location yet + needsCrossFade = true + } + } + } else if (needsCrossFade) { + // let's not flicker and start with the same alpha + crossFadeStartProgress = (1.0f - carouselAlpha) / 2.0f + } + isCrossFadeAnimatorRunning = needsCrossFade + crossFadeAnimationStartLocation = newCrossFadeStartLocation + crossFadeAnimationEndLocation = desiredLocation + animationStartAlpha = carouselAlpha + animationStartCrossFadeProgress = crossFadeStartProgress adjustAnimatorForTransition(desiredLocation, previousLocation) if (!animationPending) { rootView?.let { @@ -518,6 +647,17 @@ class MediaHierarchyManager @Inject constructor( // non-trivial reattaching logic happening that will make the view not-shown earlier return true } + + if (statusbarState == StatusBarState.KEYGUARD) { + if (currentLocation == LOCATION_LOCKSCREEN && + previousLocation == LOCATION_QS || + (currentLocation == LOCATION_QS && + previousLocation == LOCATION_LOCKSCREEN)) { + // We're always fading from lockscreen to keyguard in situations where the player + // is already fully hidden + return false + } + } return mediaFrame.isShownNotFaded || animator.isRunning || animationPending } @@ -538,7 +678,7 @@ class MediaHierarchyManager @Inject constructor( keyguardStateController.isKeyguardFadingAway) { delay = keyguardStateController.keyguardFadingAwayDelay } - animDuration = StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE.toLong() + animDuration = (StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE / 2f).toLong() } else if (previousLocation == LOCATION_QQS && desiredLocation == LOCATION_LOCKSCREEN) { animDuration = StackStateAnimator.ANIMATION_DURATION_APPEAR_DISAPPEAR.toLong() } @@ -550,7 +690,7 @@ class MediaHierarchyManager @Inject constructor( // Let's immediately apply the target state (which is interpolated) if there is // no animation running. Otherwise the animation update will already update // the location - applyState(targetBounds) + applyState(targetBounds, carouselAlpha) } } @@ -558,7 +698,7 @@ class MediaHierarchyManager @Inject constructor( * Updates the bounds that the view wants to be in at the end of the animation. */ private fun updateTargetState() { - if (isCurrentlyInGuidedTransformation()) { + if (isCurrentlyInGuidedTransformation() && !isCurrentlyFading()) { val progress = getTransformationProgress() var endHost = getHost(desiredLocation)!! var starthost = getHost(previousLocation)!! @@ -606,12 +746,33 @@ class MediaHierarchyManager @Inject constructor( } /** + * Calculate the transformation type for the current animation + */ + @VisibleForTesting + @TransformationType + fun calculateTransformationType(): Int { + if (isTransitioningToFullShade) { + return TRANSFORMATION_TYPE_FADE + } + if (previousLocation == LOCATION_LOCKSCREEN && desiredLocation == LOCATION_QS || + previousLocation == LOCATION_QS && desiredLocation == LOCATION_LOCKSCREEN) { + // animating between ls and qs should fade, as QS is clipped. + return TRANSFORMATION_TYPE_FADE + } + if (previousLocation == LOCATION_LOCKSCREEN && desiredLocation == LOCATION_QQS) { + // animating between ls and qqs should fade when dragging down via e.g. expand button + return TRANSFORMATION_TYPE_FADE + } + return TRANSFORMATION_TYPE_TRANSITION + } + + /** * @return the current transformation progress if we're in a guided transformation and -1 * otherwise */ private fun getTransformationProgress(): Float { val progress = getQSTransformationProgress() - if (progress >= 0) { + if (statusbarState != StatusBarState.KEYGUARD && progress >= 0) { return progress } if (isTransitioningToFullShade) { @@ -643,19 +804,20 @@ class MediaHierarchyManager @Inject constructor( private fun cancelAnimationAndApplyDesiredState() { animator.cancel() getHost(desiredLocation)?.let { - applyState(it.currentBounds, immediately = true) + applyState(it.currentBounds, alpha = 1.0f, immediately = true) } } /** * Apply the current state to the view, updating it's bounds and desired state */ - private fun applyState(bounds: Rect, immediately: Boolean = false) { + private fun applyState(bounds: Rect, alpha: Float, immediately: Boolean = false) { currentBounds.set(bounds) - val currentlyInGuidedTransformation = isCurrentlyInGuidedTransformation() - val startLocation = if (currentlyInGuidedTransformation) previousLocation else -1 - val progress = if (currentlyInGuidedTransformation) getTransformationProgress() else 1.0f - val endLocation = desiredLocation + carouselAlpha = if (isCurrentlyFading()) alpha else 1.0f + val onlyUseEndState = !isCurrentlyInGuidedTransformation() || isCurrentlyFading() + val startLocation = if (onlyUseEndState) -1 else previousLocation + val progress = if (onlyUseEndState) 1.0f else getTransformationProgress() + val endLocation = resolveLocationForFading() mediaCarouselController.setCurrentState(startLocation, endLocation, progress, immediately) updateHostAttachment() if (currentAttachmentLocation == IN_OVERLAY) { @@ -668,8 +830,19 @@ class MediaHierarchyManager @Inject constructor( } private fun updateHostAttachment() { - val inOverlay = isTransitionRunning() && rootOverlay != null - val newLocation = if (inOverlay) IN_OVERLAY else desiredLocation + var newLocation = resolveLocationForFading() + var canUseOverlay = !isCurrentlyFading() + if (isCrossFadeAnimatorRunning) { + if (getHost(newLocation)?.visible == true && + getHost(newLocation)?.hostView?.isShown == false && + newLocation != desiredLocation) { + // We're crossfading but the view is already hidden. Let's move to the overlay + // instead. This happens when animating to the full shade using a button click. + canUseOverlay = true + } + } + val inOverlay = isTransitionRunning() && rootOverlay != null && canUseOverlay + newLocation = if (inOverlay) IN_OVERLAY else newLocation if (currentAttachmentLocation != newLocation) { currentAttachmentLocation = newLocation @@ -677,10 +850,10 @@ class MediaHierarchyManager @Inject constructor( (mediaFrame.parent as ViewGroup?)?.removeView(mediaFrame) // Add it to the new one - val targetHost = getHost(desiredLocation)!!.hostView if (inOverlay) { rootOverlay!!.add(mediaFrame) } else { + val targetHost = getHost(newLocation)!!.hostView // When adding back to the host, let's make sure to reset the bounds. // Usually adding the view will trigger a layout that does this automatically, // but we sometimes suppress this. @@ -693,7 +866,37 @@ class MediaHierarchyManager @Inject constructor( left + currentBounds.width(), top + currentBounds.height()) } + if (isCrossFadeAnimatorRunning) { + // When cross-fading with an animation, we only notify the media carousel of the + // location change, once the view is reattached to the new place and not immediately + // when the desired location changes. This callback will update the measurement + // of the carousel, only once we've faded out at the old location and then reattach + // to fade it in at the new location. + mediaCarouselController.onDesiredLocationChanged( + newLocation, + getHost(newLocation), + animate = false + ) + } + } + } + + /** + * Calculate the location when cross fading between locations. While fading out, + * the content should remain in the previous location, while after the switch it should + * be at the desired location. + */ + private fun resolveLocationForFading(): Int { + if (isCrossFadeAnimatorRunning) { + // When animating between two hosts with a fade, let's keep ourselves in the old + // location for the first half, and then switch over to the end location + if (animationCrossFadeProgress > 0.5 || previousLocation == -1) { + return crossFadeAnimationEndLocation + } else { + return crossFadeAnimationStartLocation + } } + return desiredLocation } private fun isTransitionRunning(): Boolean { @@ -708,29 +911,29 @@ class MediaHierarchyManager @Inject constructor( return desiredLocation } val onLockscreen = (!bypassController.bypassEnabled && - (statusbarState == StatusBarState.KEYGUARD || - statusbarState == StatusBarState.FULLSCREEN_USER_SWITCHER)) + (statusbarState == StatusBarState.KEYGUARD || + statusbarState == StatusBarState.FULLSCREEN_USER_SWITCHER)) val allowedOnLockscreen = notifLockscreenUserManager.shouldShowLockscreenNotifications() val location = when { qsExpansion > 0.0f && !onLockscreen -> LOCATION_QS qsExpansion > 0.4f && onLockscreen -> LOCATION_QS - onLockscreen && isTransitioningToFullShade -> LOCATION_QQS + onLockscreen && isTransformingToFullShadeAndInQQS() -> LOCATION_QQS onLockscreen && allowedOnLockscreen -> LOCATION_LOCKSCREEN else -> LOCATION_QQS } // When we're on lock screen and the player is not active, we should keep it in QS. // Otherwise it will try to animate a transition that doesn't make sense. if (location == LOCATION_LOCKSCREEN && getHost(location)?.visible != true && - !statusBarStateController.isDozing) { + !statusBarStateController.isDozing) { return LOCATION_QS } if (location == LOCATION_LOCKSCREEN && desiredLocation == LOCATION_QS && - collapsingShadeFromQS) { + collapsingShadeFromQS) { // When collapsing on the lockscreen, we want to remain in QS return LOCATION_QS } if (location != LOCATION_LOCKSCREEN && desiredLocation == LOCATION_LOCKSCREEN && - !fullyAwake) { + !fullyAwake) { // When unlocking from dozing / while waking up, the media shouldn't be transitioning // in an animated way. Let's keep it in the lockscreen until we're fully awake and // reattach it without an animation @@ -740,6 +943,26 @@ class MediaHierarchyManager @Inject constructor( } /** + * Are we currently transforming to the full shade and already in QQS + */ + private fun isTransformingToFullShadeAndInQQS(): Boolean { + if (!isTransitioningToFullShade) { + return false + } + return fullShadeTransitionProgress > 0.5f + } + + /** + * Is the current transformationType fading + */ + private fun isCurrentlyFading(): Boolean { + if (isTransitioningToFullShade) { + return true + } + return isCrossFadeAnimatorRunning + } + + /** * Returns true when the media card could be visible to the user if existed. */ private fun isVisibleToUser(): Boolean { @@ -789,9 +1012,27 @@ class MediaHierarchyManager @Inject constructor( * Attached at the root of the hierarchy in an overlay */ const val IN_OVERLAY = -1000 + + /** + * The default transformation type where the hosts transform into each other using a direct + * transition + */ + const val TRANSFORMATION_TYPE_TRANSITION = 0 + + /** + * A transformation type where content fades from one place to another instead of + * transitioning + */ + const val TRANSFORMATION_TYPE_FADE = 1 } } +@IntDef(prefix = ["TRANSFORMATION_TYPE_"], value = [ + MediaHierarchyManager.TRANSFORMATION_TYPE_TRANSITION, + MediaHierarchyManager.TRANSFORMATION_TYPE_FADE]) +@Retention(AnnotationRetention.SOURCE) +private annotation class TransformationType + @IntDef(prefix = ["LOCATION_"], value = [MediaHierarchyManager.LOCATION_QS, MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN]) @Retention(AnnotationRetention.SOURCE) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt b/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt index b0be57668d08..3bf7fb07f8eb 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt @@ -23,7 +23,6 @@ import android.content.Intent import android.content.IntentFilter import android.content.pm.PackageManager import android.media.MediaDescription -import android.media.session.MediaController import android.os.UserHandle import android.provider.Settings import android.service.media.MediaBrowserService @@ -171,6 +170,7 @@ class MediaResumeListener @Inject constructor( if (useMediaResumption) { // If this had been started from a resume state, disconnect now that it's live mediaBrowser?.disconnect() + mediaBrowser = null // If we don't have a resume action, check if we haven't already if (data.resumeAction == null && !data.hasCheckedForResume && !blockedApps.contains(data.packageName) && data.isLocalSession) { @@ -201,7 +201,6 @@ class MediaResumeListener @Inject constructor( */ private fun tryUpdateResumptionList(key: String, componentName: ComponentName) { Log.d(TAG, "Testing if we can connect to $componentName") - mediaBrowser?.disconnect() mediaBrowser = mediaBrowserFactory.create( object : ResumeMediaBrowser.Callback() { override fun onConnected() { @@ -211,7 +210,6 @@ class MediaResumeListener @Inject constructor( override fun onError() { Log.e(TAG, "Cannot resume with $componentName") mediaDataManager.setResumeAction(key, null) - mediaBrowser?.disconnect() mediaBrowser = null } @@ -224,7 +222,6 @@ class MediaResumeListener @Inject constructor( Log.d(TAG, "Can get resumable media from $componentName") mediaDataManager.setResumeAction(key, getResumeAction(componentName)) updateResumptionList(componentName) - mediaBrowser?.disconnect() mediaBrowser = null } }, @@ -262,30 +259,7 @@ class MediaResumeListener @Inject constructor( */ private fun getResumeAction(componentName: ComponentName): Runnable { return Runnable { - mediaBrowser?.disconnect() - mediaBrowser = mediaBrowserFactory.create( - object : ResumeMediaBrowser.Callback() { - override fun onConnected() { - if (mediaBrowser?.token == null) { - Log.e(TAG, "Error after connect") - mediaBrowser?.disconnect() - mediaBrowser = null - return - } - Log.d(TAG, "Connected for restart $componentName") - val controller = MediaController(context, mediaBrowser!!.token) - val controls = controller.transportControls - controls.prepare() - controls.play() - } - - override fun onError() { - Log.e(TAG, "Resume failed for $componentName") - mediaBrowser?.disconnect() - mediaBrowser = null - } - }, - componentName) + mediaBrowser = mediaBrowserFactory.create(null, componentName) mediaBrowser?.restart() } } diff --git a/packages/SystemUI/src/com/android/systemui/media/ResumeMediaBrowser.java b/packages/SystemUI/src/com/android/systemui/media/ResumeMediaBrowser.java index e453653cf7b5..fecc903326f5 100644 --- a/packages/SystemUI/src/com/android/systemui/media/ResumeMediaBrowser.java +++ b/packages/SystemUI/src/com/android/systemui/media/ResumeMediaBrowser.java @@ -16,6 +16,7 @@ package com.android.systemui.media; +import android.annotation.Nullable; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; @@ -47,7 +48,7 @@ public class ResumeMediaBrowser { private static final String TAG = "ResumeMediaBrowser"; private final Context mContext; - private final Callback mCallback; + @Nullable private final Callback mCallback; private MediaBrowserFactory mBrowserFactory; private MediaBrowser mMediaBrowser; private ComponentName mComponentName; @@ -58,8 +59,8 @@ public class ResumeMediaBrowser { * @param callback used to report media items found * @param componentName Component name of the MediaBrowserService this browser will connect to */ - public ResumeMediaBrowser(Context context, Callback callback, ComponentName componentName, - MediaBrowserFactory browserFactory) { + public ResumeMediaBrowser(Context context, @Nullable Callback callback, + ComponentName componentName, MediaBrowserFactory browserFactory) { mContext = context; mCallback = callback; mComponentName = componentName; @@ -93,18 +94,24 @@ public class ResumeMediaBrowser { List<MediaBrowser.MediaItem> children) { if (children.size() == 0) { Log.d(TAG, "No children found for " + mComponentName); - mCallback.onError(); + if (mCallback != null) { + mCallback.onError(); + } } else { // We ask apps to return a playable item as the first child when sending // a request with EXTRA_RECENT; if they don't, no resume controls MediaBrowser.MediaItem child = children.get(0); MediaDescription desc = child.getDescription(); if (child.isPlayable() && mMediaBrowser != null) { - mCallback.addTrack(desc, mMediaBrowser.getServiceComponent(), - ResumeMediaBrowser.this); + if (mCallback != null) { + mCallback.addTrack(desc, mMediaBrowser.getServiceComponent(), + ResumeMediaBrowser.this); + } } else { Log.d(TAG, "Child found but not playable for " + mComponentName); - mCallback.onError(); + if (mCallback != null) { + mCallback.onError(); + } } } disconnect(); @@ -113,7 +120,9 @@ public class ResumeMediaBrowser { @Override public void onError(String parentId) { Log.d(TAG, "Subscribe error for " + mComponentName + ": " + parentId); - mCallback.onError(); + if (mCallback != null) { + mCallback.onError(); + } disconnect(); } @@ -121,7 +130,9 @@ public class ResumeMediaBrowser { public void onError(String parentId, Bundle options) { Log.d(TAG, "Subscribe error for " + mComponentName + ": " + parentId + ", options: " + options); - mCallback.onError(); + if (mCallback != null) { + mCallback.onError(); + } disconnect(); } }; @@ -138,13 +149,20 @@ public class ResumeMediaBrowser { Log.d(TAG, "Service connected for " + mComponentName); if (mMediaBrowser != null && mMediaBrowser.isConnected()) { String root = mMediaBrowser.getRoot(); - if (!TextUtils.isEmpty(root) && mMediaBrowser != null) { - mCallback.onConnected(); - mMediaBrowser.subscribe(root, mSubscriptionCallback); + if (!TextUtils.isEmpty(root)) { + if (mCallback != null) { + mCallback.onConnected(); + } + if (mMediaBrowser != null) { + mMediaBrowser.subscribe(root, mSubscriptionCallback); + } return; } } - mCallback.onError(); + if (mCallback != null) { + mCallback.onError(); + } + disconnect(); } /** @@ -153,7 +171,9 @@ public class ResumeMediaBrowser { @Override public void onConnectionSuspended() { Log.d(TAG, "Connection suspended for " + mComponentName); - mCallback.onError(); + if (mCallback != null) { + mCallback.onError(); + } disconnect(); } @@ -163,16 +183,18 @@ public class ResumeMediaBrowser { @Override public void onConnectionFailed() { Log.d(TAG, "Connection failed for " + mComponentName); - mCallback.onError(); + if (mCallback != null) { + mCallback.onError(); + } disconnect(); } }; /** - * Disconnect the media browser. This should be called after restart or testConnection have - * completed to close the connection. + * Disconnect the media browser. This should be done after callbacks have completed to + * disconnect from the media browser service. */ - public void disconnect() { + protected void disconnect() { if (mMediaBrowser != null) { mMediaBrowser.disconnect(); } @@ -183,7 +205,8 @@ public class ResumeMediaBrowser { * Connects to the MediaBrowserService and starts playback. * ResumeMediaBrowser.Callback#onError or ResumeMediaBrowser.Callback#onConnected will be called * depending on whether it was successful. - * ResumeMediaBrowser#disconnect should be called after this to ensure the connection is closed. + * If the connection is successful, the listener should call ResumeMediaBrowser#disconnect after + * getting a media update from the app */ public void restart() { disconnect(); @@ -195,7 +218,10 @@ public class ResumeMediaBrowser { public void onConnected() { Log.d(TAG, "Connected for restart " + mMediaBrowser.isConnected()); if (mMediaBrowser == null || !mMediaBrowser.isConnected()) { - mCallback.onError(); + if (mCallback != null) { + mCallback.onError(); + } + disconnect(); return; } MediaSession.Token token = mMediaBrowser.getSessionToken(); @@ -203,17 +229,26 @@ public class ResumeMediaBrowser { controller.getTransportControls(); controller.getTransportControls().prepare(); controller.getTransportControls().play(); - mCallback.onConnected(); + if (mCallback != null) { + mCallback.onConnected(); + } + // listener should disconnect after media player update } @Override public void onConnectionFailed() { - mCallback.onError(); + if (mCallback != null) { + mCallback.onError(); + } + disconnect(); } @Override public void onConnectionSuspended() { - mCallback.onError(); + if (mCallback != null) { + mCallback.onError(); + } + disconnect(); } }, rootHints); mMediaBrowser.connect(); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 9e77b60036a2..d8b342a6a8d8 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -31,6 +31,7 @@ import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_NAVIGATION_BARS; import static android.view.WindowInsetsController.APPEARANCE_SEMI_TRANSPARENT_NAVIGATION_BARS; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; +import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; @@ -200,7 +201,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, private final UiEventLogger mUiEventLogger; private Bundle mSavedState; - private NavigationBarView mNavigationBarView = null; + private NavigationBarView mNavigationBarView; private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING; @@ -392,7 +393,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, }; private final Runnable mAutoDim = () -> getBarTransitions().setAutoDim(true); - + private final Runnable mEnableLayoutTransitions = () -> + mNavigationBarView.setLayoutTransitionsEnabled(true); private final Runnable mOnVariableDurationHomeLongClick = () -> { if (onHomeLongClick(mNavigationBarView.getHomeButton().getCurrentView())) { mNavigationBarView.getHomeButton().getCurrentView().performHapticFeedback( @@ -488,7 +490,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mA11yBtnMode = mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode(); } - public View getView() { + public NavigationBarView getView() { return mNavigationBarView; } @@ -504,16 +506,19 @@ public class NavigationBar implements View.OnAttachStateChangeListener, | WindowManager.LayoutParams.FLAG_SLIPPERY, PixelFormat.TRANSLUCENT); lp.token = new Binder(); - lp.setTitle("NavigationBar" + mContext.getDisplayId()); lp.accessibilityTitle = mContext.getString(R.string.nav_bar); - lp.windowAnimations = 0; lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC; + lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + lp.windowAnimations = 0; + lp.setTitle("NavigationBar" + mContext.getDisplayId()); + lp.setFitInsetsTypes(0 /* types */); NavigationBarFrame frame = (NavigationBarFrame) LayoutInflater.from(mContext).inflate( R.layout.navigation_bar_window, null); View barView = LayoutInflater.from(frame.getContext()).inflate( R.layout.navigation_bar, frame); barView.addOnAttachStateChangeListener(this); + mNavigationBarView = barView.findViewById(R.id.navigation_bar_view); if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + barView); mContext.getSystemService(WindowManager.class).addView(frame, lp); @@ -533,6 +538,19 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mContentResolver.registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED), false, mAssistContentObserver, UserHandle.USER_ALL); + mAllowForceNavBarHandleOpaque = mContext.getResources().getBoolean( + R.bool.allow_force_nav_bar_handle_opaque); + mForceNavBarHandleOpaque = DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_SYSTEMUI, + NAV_BAR_HANDLE_FORCE_OPAQUE, + /* defaultValue = */ true); + mHomeButtonLongPressDurationMs = Optional.of(DeviceConfig.getLong( + DeviceConfig.NAMESPACE_SYSTEMUI, + HOME_BUTTON_LONG_PRESS_DURATION_MS, + /* defaultValue = */ 0 + )).filter(duration -> duration != 0); + DeviceConfig.addOnPropertiesChangedListener( + DeviceConfig.NAMESPACE_SYSTEMUI, mHandler::post, mOnPropertiesChangedListener); updateAssistantEntrypoints(); if (savedState != null) { @@ -543,25 +561,10 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mTransientShown = savedState.getBoolean(EXTRA_TRANSIENT_STATE, false); } mSavedState = savedState; - mAccessibilityManagerWrapper.addCallback(mAccessibilityListener); // Respect the latest disabled-flags. mCommandQueue.recomputeDisableFlags(mDisplayId, false); - mAllowForceNavBarHandleOpaque = mContext.getResources().getBoolean( - R.bool.allow_force_nav_bar_handle_opaque); - mForceNavBarHandleOpaque = DeviceConfig.getBoolean( - DeviceConfig.NAMESPACE_SYSTEMUI, - NAV_BAR_HANDLE_FORCE_OPAQUE, - /* defaultValue = */ true); - mHomeButtonLongPressDurationMs = Optional.of(DeviceConfig.getLong( - DeviceConfig.NAMESPACE_SYSTEMUI, - HOME_BUTTON_LONG_PRESS_DURATION_MS, - /* defaultValue = */ 0 - )).filter(duration -> duration != 0); - DeviceConfig.addOnPropertiesChangedListener( - DeviceConfig.NAMESPACE_SYSTEMUI, mHandler::post, mOnPropertiesChangedListener); - mIsCurrentUserSetup = mDeviceProvisionedController.isCurrentUserSetup(); mDeviceProvisionedController.addCallback(mUserSetupListener); @@ -587,7 +590,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener, @Override public void onViewAttachedToWindow(View v) { final Display display = v.getDisplay(); - mNavigationBarView = v.findViewById(R.id.navigation_bar_view); mNavigationBarView.setComponents(mStatusBarLazy.get().getPanelController()); mNavigationBarView.setDisabledFlags(mDisabledFlags1); mNavigationBarView.setOnVerticalChangedListener(this::onVerticalChanged); @@ -598,6 +600,9 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mNavigationBarView.setNavigationIconHints(mNavigationIconHints); mNavigationBarView.setWindowVisible(isNavBarWindowVisible()); mNavigationBarView.setBehavior(mBehavior); + + mAccessibilityManagerWrapper.addCallback(mAccessibilityListener); + mSplitScreenOptional.ifPresent(mNavigationBarView::registerDockedListener); mPipOptional.ifPresent(mNavigationBarView::registerPipExclusionBoundsChangeListener); @@ -657,10 +662,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, @Override public void onViewDetachedFromWindow(View v) { - if (mNavigationBarView != null) { - mNavigationBarView.getBarTransitions().destroy(); - mNavigationBarView.getLightTransitionsController().destroy(mContext); - } + mNavigationBarView.getBarTransitions().destroy(); + mNavigationBarView.getLightTransitionsController().destroy(mContext); mOverviewProxyService.removeCallback(mOverviewProxyListener); mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver); if (mOrientationHandle != null) { @@ -671,6 +674,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mOrientationHandleGlobalLayoutListener); } mHandler.removeCallbacks(mAutoDim); + mHandler.removeCallbacks(mOnVariableDurationHomeLongClick); + mHandler.removeCallbacks(mEnableLayoutTransitions); mNavigationBarView = null; mOrientationHandle = null; } @@ -682,9 +687,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, outState.putInt(EXTRA_APPEARANCE, mAppearance); outState.putInt(EXTRA_BEHAVIOR, mBehavior); outState.putBoolean(EXTRA_TRANSIENT_STATE, mTransientShown); - if (mNavigationBarView != null) { - mNavigationBarView.getLightTransitionsController().saveState(outState); - } + mNavigationBarView.getLightTransitionsController().saveState(outState); } /** @@ -809,15 +812,12 @@ public class NavigationBar implements View.OnAttachStateChangeListener, // mOrientedHandle is initialized lazily mOrientationHandle.setVisibility(View.GONE); } - if (mNavigationBarView != null) { - mNavigationBarView.setVisibility(View.VISIBLE); - mNavigationBarView.setOrientedHandleSamplingRegion(null); - } + mNavigationBarView.setVisibility(View.VISIBLE); + mNavigationBarView.setOrientedHandleSamplingRegion(null); } private void reconfigureHomeLongClick() { - if (mNavigationBarView == null - || mNavigationBarView.getHomeButton().getCurrentView() == null) { + if (mNavigationBarView.getHomeButton().getCurrentView() == null) { return; } if (mHomeButtonLongPressDurationMs.isPresent() || !mLongPressHomeEnabled) { @@ -844,17 +844,12 @@ public class NavigationBar implements View.OnAttachStateChangeListener, pw.println(" mHomeButtonLongPressDurationMs=" + mHomeButtonLongPressDurationMs); pw.println(" mLongPressHomeEnabled=" + mLongPressHomeEnabled); pw.println(" mAssistantTouchGestureEnabled=" + mAssistantTouchGestureEnabled); - - if (mNavigationBarView != null) { - pw.println(" mNavigationBarWindowState=" - + windowStateToString(mNavigationBarWindowState)); - pw.println(" mNavigationBarMode=" - + BarTransitions.modeToString(mNavigationBarMode)); - dumpBarTransitions(pw, "mNavigationBarView", mNavigationBarView.getBarTransitions()); - mNavigationBarView.dump(pw); - } else { - pw.print(" mNavigationBarView=null"); - } + pw.println(" mNavigationBarWindowState=" + + windowStateToString(mNavigationBarWindowState)); + pw.println(" mNavigationBarMode=" + + BarTransitions.modeToString(mNavigationBarMode)); + dumpBarTransitions(pw, "mNavigationBarView", mNavigationBarView.getBarTransitions()); + mNavigationBarView.dump(pw); } // ----- CommandQueue Callbacks ----- @@ -889,10 +884,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, if (hints == mNavigationIconHints) return; mNavigationIconHints = hints; - - if (mNavigationBarView != null) { - mNavigationBarView.setNavigationIconHints(hints); - } + mNavigationBarView.setNavigationIconHints(hints); checkBarModes(); updateSystemUiStateFlags(-1); } @@ -911,23 +903,12 @@ public class NavigationBar implements View.OnAttachStateChangeListener, orientSecondaryHomeHandle(); } if (DEBUG_WINDOW_STATE) Log.d(TAG, "Navigation bar " + windowStateToString(state)); - - if (mNavigationBarView != null) { - mNavigationBarView.setWindowVisible(isNavBarWindowVisible()); - } + mNavigationBarView.setWindowVisible(isNavBarWindowVisible()); } } @Override public void onRotationProposal(final int rotation, boolean isValid) { - if (mNavigationBarView == null) { - if (RotationContextButton.DEBUG_ROTATION) { - Log.v(TAG, "onRotationProposal proposedRotation=" + - Surface.rotationToString(rotation) + ", mNavigationBarView is null"); - } - return; - } - final int winRotation = mNavigationBarView.getDisplay().getRotation(); final boolean rotateSuggestionsDisabled = RotationButtonController .hasDisable2RotateSuggestionFlag(mDisabledFlags2); @@ -941,8 +922,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, + ", isValid=" + isValid + ", mNavBarWindowState=" + StatusBarManager.windowStateToString(mNavigationBarWindowState) + ", rotateSuggestionsDisabled=" + rotateSuggestionsDisabled - + ", isRotateButtonVisible=" + (mNavigationBarView == null ? "null" - : rotationButton.isVisible())); + + ", isRotateButtonVisible=" + rotationButton.isVisible()); } // Respect the disabled flag, no need for action as flag change callback will handle hiding @@ -983,9 +963,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener, boolean nbModeChanged = false; if (mAppearance != appearance) { mAppearance = appearance; - if (getView() == null) { - return; - } nbModeChanged = updateBarMode(barMode(mTransientShown, appearance)); } if (mLightBarController != null) { @@ -994,9 +971,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } if (mBehavior != behavior) { mBehavior = behavior; - if (mNavigationBarView != null) { - mNavigationBarView.setBehavior(behavior); - } + mNavigationBarView.setBehavior(behavior); updateSystemUiStateFlags(-1); } } @@ -1034,12 +1009,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } private void handleTransientChanged() { - if (getView() == null) { - return; - } - if (mNavigationBarView != null) { - mNavigationBarView.onTransientStateChanged(mTransientShown); - } + mNavigationBarView.onTransientStateChanged(mTransientShown); final int barMode = barMode(mTransientShown, mAppearance); if (updateBarMode(barMode) && mLightBarController != null) { mLightBarController.onNavigationBarModeChanged(barMode); @@ -1092,9 +1062,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, | StatusBarManager.DISABLE_SEARCH); if (masked != mDisabledFlags1) { mDisabledFlags1 = masked; - if (mNavigationBarView != null) { - mNavigationBarView.setDisabledFlags(state1); - } + mNavigationBarView.setDisabledFlags(state1); updateScreenPinningGestures(); } @@ -1110,17 +1078,13 @@ public class NavigationBar implements View.OnAttachStateChangeListener, private void setDisabled2Flags(int state2) { // Method only called on change of disable2 flags - if (mNavigationBarView != null) { - mNavigationBarView.getRotationButtonController().onDisable2FlagChanged(state2); - } + mNavigationBarView.getRotationButtonController().onDisable2FlagChanged(state2); } // ----- Internal stuff ----- private void refreshLayout(int layoutDirection) { - if (mNavigationBarView != null) { - mNavigationBarView.setLayoutDirection(layoutDirection); - } + mNavigationBarView.setLayoutDirection(layoutDirection); } private boolean shouldDisableNavbarGestures() { @@ -1129,7 +1093,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } private void repositionNavigationBar() { - if (mNavigationBarView == null || !mNavigationBarView.isAttachedToWindow()) return; + if (!mNavigationBarView.isAttachedToWindow()) return; prepareNavigationBarView(); @@ -1138,10 +1102,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } private void updateScreenPinningGestures() { - if (mNavigationBarView == null) { - return; - } - // Change the cancel pin gesture to home and back if recents button is invisible boolean pinningActive = ActivityManagerWrapper.getInstance().isScreenPinningActive(); ButtonDispatcher backButton = mNavigationBarView.getBackButton(); @@ -1252,10 +1212,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, AssistManager.INVOCATION_TYPE_HOME_BUTTON_LONG_PRESS); mAssistManagerLazy.get().startAssist(args); mStatusBarLazy.get().awakenDreams(); - - if (mNavigationBarView != null) { - mNavigationBarView.abortCurrentGesture(); - } + mNavigationBarView.abortCurrentGesture(); return true; } @@ -1405,9 +1362,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } void updateAccessibilityServicesState(AccessibilityManager accessibilityManager) { - if (mNavigationBarView == null) { - return; - } boolean[] feedbackEnabled = new boolean[1]; int a11yFlags = getA11yButtonState(feedbackEnabled); @@ -1593,7 +1547,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, public void disableAnimationsDuringHide(long delay) { mNavigationBarView.setLayoutTransitionsEnabled(false); - mNavigationBarView.postDelayed(() -> mNavigationBarView.setLayoutTransitionsEnabled(true), + mHandler.postDelayed(mEnableLayoutTransitions, delay + StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE); } @@ -1608,10 +1562,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } public NavigationBarTransitions getBarTransitions() { - if (mNavigationBarView != null) { - return mNavigationBarView.getBarTransitions(); - } - return null; + return mNavigationBarView.getBarTransitions(); } public void finishBarAnimations() { @@ -1626,8 +1577,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } private final Consumer<Integer> mRotationWatcher = rotation -> { - if (mNavigationBarView != null - && mNavigationBarView.needsReorient(rotation)) { + if (mNavigationBarView.needsReorient(rotation)) { repositionNavigationBar(); } }; @@ -1635,9 +1585,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener, private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (mNavigationBarView == null) { - return; - } String action = intent.getAction(); if (Intent.ACTION_SCREEN_OFF.equals(action) || Intent.ACTION_SCREEN_ON.equals(action)) { diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java index ae9b5987bac5..8b5a537ba242 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java @@ -123,8 +123,7 @@ public class NavigationBarController implements Callbacks, // Tracks config changes that will actually recreate the nav bar private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges( - ActivityInfo.CONFIG_FONT_SCALE | ActivityInfo.CONFIG_LOCALE - | ActivityInfo.CONFIG_SCREEN_LAYOUT + ActivityInfo.CONFIG_FONT_SCALE | ActivityInfo.CONFIG_SCREEN_LAYOUT | ActivityInfo.CONFIG_UI_MODE); @Inject @@ -225,10 +224,7 @@ public class NavigationBarController implements Callbacks, if (navBar == null) { continue; } - NavigationBarView view = (NavigationBarView) navBar.getView(); - if (view != null) { - view.updateStates(); - } + navBar.getView().updateStates(); } }); } @@ -366,13 +362,12 @@ public class NavigationBarController implements Callbacks, mHandler, mNavBarOverlayController, mUiEventLogger); + mNavigationBars.put(displayId, navBar); View navigationBarView = navBar.createView(savedState); navigationBarView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { @Override public void onViewAttachedToWindow(View v) { - mNavigationBars.put(displayId, navBar); - if (result != null) { navBar.setImeWindowStatus(display.getDisplayId(), result.mImeToken, result.mImeWindowVis, result.mImeBackDisposition, @@ -448,7 +443,7 @@ public class NavigationBarController implements Callbacks, */ public @Nullable NavigationBarView getNavigationBarView(int displayId) { NavigationBar navBar = mNavigationBars.get(displayId); - return (navBar == null) ? null : (NavigationBarView) navBar.getView(); + return (navBar == null) ? null : navBar.getView(); } /** @return {@link NavigationBar} on the default display. */ diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java index 4d250797f944..02180160fc11 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java @@ -40,7 +40,6 @@ public class ButtonDispatcher { private final ArrayList<View> mViews = new ArrayList<>(); private final int mId; - private final AssistManager mAssistManager; private View.OnClickListener mClickListener; private View.OnTouchListener mTouchListener; @@ -73,7 +72,6 @@ public class ButtonDispatcher { public ButtonDispatcher(int id) { mId = id; - mAssistManager = Dependency.get(AssistManager.class); } public void clear() { diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java index 98d886661cea..6a025a750baa 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java @@ -184,10 +184,4 @@ public class PeopleSpaceActivity extends Activity { // Refresh tile views to sync new conversations. buildActivity(); } - - @Override - protected void onPause() { - super.onPause(); - finish(); - } } diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java b/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java index f3cb35959ed4..96aeb60ae93c 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java @@ -29,6 +29,8 @@ import android.graphics.drawable.Drawable; import android.util.IconDrawableFactory; import android.util.Log; +import androidx.core.graphics.drawable.RoundedBitmapDrawable; + import com.android.settingslib.Utils; import com.android.systemui.R; @@ -58,7 +60,7 @@ class PeopleStoryIconFactory implements AutoCloseable { mIconDrawableFactory = iconDrawableFactory; mImportantConversationColor = context.getColor(R.color.important_conversation); mAccentColor = Utils.getColorAttr(context, - com.android.internal.R.attr.colorAccentPrimary).getDefaultColor(); + com.android.internal.R.attr.colorAccentPrimaryVariant).getDefaultColor(); mContext = context; } @@ -83,7 +85,8 @@ class PeopleStoryIconFactory implements AutoCloseable { * Returns a {@link Drawable} for the entire conversation. The shortcut icon will be badged * with the launcher icon of the app specified by packageName. */ - public Drawable getPeopleTileDrawable(Drawable headDrawable, String packageName, int userId, + public Drawable getPeopleTileDrawable(RoundedBitmapDrawable headDrawable, String packageName, + int userId, boolean important, boolean newStory) { return new PeopleStoryIconDrawable(headDrawable, getAppBadge(packageName, userId), mIconBitmapSize, mImportantConversationColor, important, mIconSize, mDensity, @@ -96,7 +99,7 @@ class PeopleStoryIconFactory implements AutoCloseable { */ public static class PeopleStoryIconDrawable extends Drawable { private float mFullIconSize; - private Drawable mAvatar; + private RoundedBitmapDrawable mAvatar; private Drawable mBadgeIcon; private int mIconSize; private Paint mPriorityRingPaint; @@ -105,12 +108,13 @@ class PeopleStoryIconFactory implements AutoCloseable { private Paint mStoryPaint; private float mDensity; - PeopleStoryIconDrawable(Drawable avatar, + PeopleStoryIconDrawable(RoundedBitmapDrawable avatar, Drawable badgeIcon, int iconSize, @ColorInt int ringColor, boolean showImportantRing, float fullIconSize, float density, @ColorInt int accentColor, boolean showStoryRing) { + avatar.setCircular(true); mAvatar = avatar; mBadgeIcon = badgeIcon; mIconSize = iconSize; diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java index 59c7fd197c8b..72d382ac0799 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java @@ -45,9 +45,6 @@ import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; -import android.icu.text.MeasureFormat; -import android.icu.util.Measure; -import android.icu.util.MeasureUnit; import android.net.Uri; import android.os.Bundle; import android.os.UserHandle; @@ -61,6 +58,9 @@ import android.view.View; import android.widget.RemoteViews; import android.widget.TextView; +import androidx.core.graphics.drawable.RoundedBitmapDrawable; +import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory; + import com.android.internal.annotations.VisibleForTesting; import com.android.launcher3.icons.FastBitmapDrawable; import com.android.systemui.R; @@ -72,6 +72,7 @@ import java.text.NumberFormat; import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.Objects; @@ -94,6 +95,8 @@ public class PeopleTileViewHelper { public static final int LAYOUT_LARGE = 2; private static final int MIN_CONTENT_MAX_LINES = 2; + private static final int NAME_MAX_LINES_WITHOUT_LAST_INTERACTION = 3; + private static final int NAME_MAX_LINES_WITH_LAST_INTERACTION = 1; private static final int FIXED_HEIGHT_DIMENS_FOR_LARGE_NOTIF_CONTENT = 16 + 22 + 8 + 16; private static final int FIXED_HEIGHT_DIMENS_FOR_LARGE_STATUS_CONTENT = 16 + 16 + 24 + 4 + 16; @@ -225,7 +228,9 @@ public class PeopleTileViewHelper { Log.d(TAG, "Create status view for: " + statusesForEntireView.get(0).getActivity()); } - return createStatusRemoteViews(statusesForEntireView.get(0)); + ConversationStatus mostRecentlyStartedStatus = statusesForEntireView.stream().max( + Comparator.comparing(s -> s.getStartTimeMillis())).get(); + return createStatusRemoteViews(mostRecentlyStartedStatus); } return createLastInteractionRemoteViews(); @@ -579,11 +584,33 @@ public class PeopleTileViewHelper { setMaxLines(views, false); } setAvailabilityDotPadding(views, R.dimen.availability_dot_status_padding); - // TODO: Set status pre-defined icons - views.setImageViewResource(R.id.predefined_icon, R.drawable.ic_person); + views.setImageViewResource(R.id.predefined_icon, getDrawableForStatus(status)); return views; } + private int getDrawableForStatus(ConversationStatus status) { + switch (status.getActivity()) { + case ACTIVITY_NEW_STORY: + return R.drawable.ic_pages; + case ACTIVITY_ANNIVERSARY: + return R.drawable.ic_celebration; + case ACTIVITY_UPCOMING_BIRTHDAY: + return R.drawable.ic_gift; + case ACTIVITY_BIRTHDAY: + return R.drawable.ic_cake; + case ACTIVITY_LOCATION: + return R.drawable.ic_location; + case ACTIVITY_GAME: + return R.drawable.ic_play_games; + case ACTIVITY_VIDEO: + return R.drawable.ic_video; + case ACTIVITY_AUDIO: + return R.drawable.ic_music_note; + default: + return R.drawable.ic_person; + } + } + /** * Update the padding of the availability dot. The padding on the availability dot decreases * on the status layouts compared to all other layouts. @@ -658,7 +685,6 @@ public class PeopleTileViewHelper { } private RemoteViews decorateBackground(RemoteViews views, CharSequence content) { - int visibility = View.GONE; CharSequence emoji = getDoubleEmoji(content); if (!TextUtils.isEmpty(emoji)) { setEmojiBackground(views, emoji); @@ -768,6 +794,7 @@ public class PeopleTileViewHelper { } private RemoteViews setViewForContentLayout(RemoteViews views) { + views = decorateBackground(views, ""); if (mLayoutSize == LAYOUT_SMALL) { views.setViewVisibility(R.id.predefined_icon, View.VISIBLE); views.setViewVisibility(R.id.name, View.GONE); @@ -819,6 +846,7 @@ public class PeopleTileViewHelper { private RemoteViews createLastInteractionRemoteViews() { RemoteViews views = new RemoteViews(mContext.getPackageName(), getEmptyLayout()); + views.setInt(R.id.name, "setMaxLines", NAME_MAX_LINES_WITH_LAST_INTERACTION); if (mLayoutSize == LAYOUT_SMALL) { views.setViewVisibility(R.id.name, View.VISIBLE); views.setViewVisibility(R.id.predefined_icon, View.GONE); @@ -836,6 +864,9 @@ public class PeopleTileViewHelper { } else { if (DEBUG) Log.d(TAG, "Hide last interaction"); views.setViewVisibility(R.id.last_interaction, View.GONE); + if (mLayoutSize == LAYOUT_MEDIUM) { + views.setInt(R.id.name, "setMaxLines", NAME_MAX_LINES_WITHOUT_LAST_INTERACTION); + } } return views; } @@ -891,8 +922,9 @@ public class PeopleTileViewHelper { context.getPackageManager(), IconDrawableFactory.newInstance(context, false), maxAvatarSize); - Drawable drawable = icon.loadDrawable(context); - Drawable personDrawable = storyIcon.getPeopleTileDrawable(drawable, + RoundedBitmapDrawable roundedDrawable = RoundedBitmapDrawableFactory.create( + context.getResources(), icon.getBitmap()); + Drawable personDrawable = storyIcon.getPeopleTileDrawable(roundedDrawable, tile.getPackageName(), getUserId(tile), tile.isImportantConversation(), hasNewStory); return convertDrawableToBitmap(personDrawable); @@ -907,14 +939,11 @@ public class PeopleTileViewHelper { } long now = System.currentTimeMillis(); Duration durationSinceLastInteraction = Duration.ofMillis(now - lastInteraction); - MeasureFormat formatter = MeasureFormat.getInstance(Locale.getDefault(), - MeasureFormat.FormatWidth.WIDE); if (durationSinceLastInteraction.toDays() <= ONE_DAY) { return null; } else if (durationSinceLastInteraction.toDays() < DAYS_IN_A_WEEK) { - return context.getString(R.string.days_timestamp, formatter.formatMeasures( - new Measure(durationSinceLastInteraction.toDays(), - MeasureUnit.DAY))); + return context.getString(R.string.days_timestamp, + durationSinceLastInteraction.toDays()); } else if (durationSinceLastInteraction.toDays() == DAYS_IN_A_WEEK) { return context.getString(R.string.one_week_timestamp); } else if (durationSinceLastInteraction.toDays() < DAYS_IN_A_WEEK * 2) { diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java index 9e0dd72e77f5..2602d7a3e369 100644 --- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java +++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java @@ -667,12 +667,16 @@ public class PeopleSpaceWidgetManager { if (icon != null) { updatedTile.setUserIcon(icon); } + if (DEBUG) Log.d(TAG, "Statuses: " + conversation.getStatuses().toString()); + NotificationChannel channel = conversation.getParentNotificationChannel(); + if (channel != null) { + if (DEBUG) Log.d(TAG, "Important:" + channel.isImportantConversation()); + updatedTile.setIsImportantConversation(channel.isImportantConversation()); + } updatedTile .setContactUri(uri) .setStatuses(conversation.getStatuses()) - .setLastInteractionTimestamp(conversation.getLastEventTimestamp()) - .setIsImportantConversation(conversation.getParentNotificationChannel() != null - && conversation.getParentNotificationChannel().isImportantConversation()); + .setLastInteractionTimestamp(conversation.getLastEventTimestamp()); updateAppWidgetOptionsAndView(appWidgetId, updatedTile.build()); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index 34c654c9135d..1c5fa439d0ee 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -95,7 +95,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private boolean mLastKeyguardAndExpanded; /** * The last received state from the controller. This should not be used directly to check if - * we're on keyguard but use {@link #isKeyguardShowing()} instead since that is more accurate + * we're on keyguard but use {@link #isKeyguardState()} instead since that is more accurate * during state transitions which often call into us. */ private int mState; @@ -326,7 +326,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca || mHeaderAnimating; mQSPanelController.setExpanded(mQsExpanded); mQSDetail.setExpanded(mQsExpanded); - boolean keyguardShowing = isKeyguardShowing(); + boolean keyguardShowing = isKeyguardState(); mHeader.setVisibility((mQsExpanded || !keyguardShowing || mHeaderAnimating || mShowCollapsedOnKeyguard) ? View.VISIBLE @@ -344,7 +344,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca !mQsDisabled && expandVisually ? View.VISIBLE : View.INVISIBLE); } - private boolean isKeyguardShowing() { + private boolean isKeyguardState() { // We want the freshest state here since otherwise we'll have some weirdness if earlier // listeners trigger updates return mStatusBarStateController.getState() == StatusBarState.KEYGUARD; @@ -366,7 +366,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca if (mQSAnimator != null) { mQSAnimator.setShowCollapsedOnKeyguard(showCollapsed); } - if (!showCollapsed && isKeyguardShowing()) { + if (!showCollapsed && isKeyguardState()) { setQsExpansion(mLastQSExpansion, 0); } } @@ -457,7 +457,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mContainer.setExpansion(expansion); final float translationScaleY = (mTranslateWhileExpanding ? 1 : QSAnimator.SHORT_PARALLAX_AMOUNT) * (expansion - 1); - boolean onKeyguardAndExpanded = isKeyguardShowing() && !mShowCollapsedOnKeyguard; + boolean onKeyguardAndExpanded = isKeyguardState() && !mShowCollapsedOnKeyguard; if (!mHeaderAnimating && !headerWillBeAnimating()) { getView().setTranslationY( onKeyguardAndExpanded @@ -531,7 +531,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca // The Media can be scrolled off screen by default, let's offset it float expandedMediaPosition = absoluteBottomPosition - mQSPanelScrollView.getScrollY() + mQSPanelScrollView.getScrollRange(); - // The expanded media host should never move below the laid out position pinToBottom(expandedMediaPosition, mQsMediaHost, true /* expanded */); // The expanded media host should never move above the laid out position pinToBottom(absoluteBottomPosition, mQqsMediaHost, false /* expanded */); @@ -540,7 +539,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private void pinToBottom(float absoluteBottomPosition, MediaHost mediaHost, boolean expanded) { View hostView = mediaHost.getHostView(); - if (mLastQSExpansion > 0) { + // on keyguard we cross-fade to expanded, so no need to pin it. + if (mLastQSExpansion > 0 && !isKeyguardState()) { float targetPosition = absoluteBottomPosition - getTotalBottomMargin(hostView) - hostView.getHeight(); float currentPosition = mediaHost.getCurrentBounds().top @@ -573,7 +573,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private boolean headerWillBeAnimating() { return mState == StatusBarState.KEYGUARD && mShowCollapsedOnKeyguard - && !isKeyguardShowing(); + && !isKeyguardState(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java index b7f2cd0da642..74d3425edd22 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java @@ -416,10 +416,10 @@ public class InternetTile extends QSTileImpl<SignalState> { if (cb.mAirplaneModeEnabled) { if (!state.value) { state.state = Tile.STATE_INACTIVE; - state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_airplane); + state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_unavailable); state.secondaryLabel = r.getString(R.string.status_bar_airplane); } else if (!wifiConnected) { - state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_airplane); + state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_unavailable); if (cb.mNoNetworksAvailable) { state.secondaryLabel = r.getString(R.string.quick_settings_networks_unavailable); @@ -430,12 +430,14 @@ public class InternetTile extends QSTileImpl<SignalState> { } else { state.icon = ResourceIcon.get(cb.mWifiSignalIconId); } - } else if (cb.mNoDefaultNetwork && cb.mNoNetworksAvailable) { - state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_unavailable); - state.secondaryLabel = r.getString(R.string.quick_settings_networks_unavailable); - } else if (cb.mNoValidatedNetwork && !cb.mNoNetworksAvailable) { - state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_available); - state.secondaryLabel = r.getString(R.string.quick_settings_networks_available); + } else if (cb.mNoDefaultNetwork) { + if (cb.mNoNetworksAvailable) { + state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_unavailable); + state.secondaryLabel = r.getString(R.string.quick_settings_networks_unavailable); + } else { + state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_available); + state.secondaryLabel = r.getString(R.string.quick_settings_networks_available); + } } else if (cb.mIsTransient) { state.icon = ResourceIcon.get( com.android.internal.R.drawable.ic_signal_wifi_transient_animation); @@ -486,14 +488,16 @@ public class InternetTile extends QSTileImpl<SignalState> { if (cb.mAirplaneModeEnabled && cb.mQsTypeIcon != TelephonyIcons.ICON_CWF) { state.state = Tile.STATE_INACTIVE; - state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_airplane); - state.secondaryLabel = r.getString(R.string.status_bar_airplane); - } else if (cb.mNoDefaultNetwork && cb.mNoNetworksAvailable) { state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_unavailable); - state.secondaryLabel = r.getString(R.string.quick_settings_networks_unavailable); - } else if (cb.mNoValidatedNetwork && !cb.mNoNetworksAvailable) { - state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_available); - state.secondaryLabel = r.getString(R.string.quick_settings_networks_available); + state.secondaryLabel = r.getString(R.string.status_bar_airplane); + } else if (cb.mNoDefaultNetwork) { + if (cb.mNoNetworksAvailable) { + state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_unavailable); + state.secondaryLabel = r.getString(R.string.quick_settings_networks_unavailable); + } else { + state.icon = ResourceIcon.get(R.drawable.ic_qs_no_internet_available); + state.secondaryLabel = r.getString(R.string.quick_settings_networks_available); + } } else { state.icon = new SignalIcon(cb.mMobileSignalIconId); state.secondaryLabel = appendMobileDataType(cb.mDataSubscriptionName, diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java index e46792555101..64aec5e0b32b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java @@ -18,13 +18,14 @@ package com.android.systemui.qs.tiles; import static android.provider.Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT; +import static com.android.systemui.wallet.controller.QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE; + import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Looper; import android.service.quickaccesswallet.GetWalletCardsError; -import android.service.quickaccesswallet.GetWalletCardsRequest; import android.service.quickaccesswallet.GetWalletCardsResponse; import android.service.quickaccesswallet.QuickAccessWalletClient; import android.service.quickaccesswallet.WalletCard; @@ -51,6 +52,7 @@ import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.settings.SecureSettings; +import com.android.systemui.wallet.controller.QuickAccessWalletController; import com.android.systemui.wallet.ui.WalletActivity; import java.util.List; @@ -66,16 +68,15 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> { private final CharSequence mLabel = mContext.getString(R.string.wallet_title); private final WalletCardRetriever mCardRetriever = new WalletCardRetriever(); - // TODO(b/180959290): Re-create the QAW Client when the default NFC payment app changes. - private final QuickAccessWalletClient mQuickAccessWalletClient; private final KeyguardStateController mKeyguardStateController; private final PackageManager mPackageManager; private final SecureSettings mSecureSettings; private final Executor mExecutor; + private final QuickAccessWalletController mController; private final FeatureFlags mFeatureFlags; - @VisibleForTesting Drawable mCardViewDrawable; private WalletCard mSelectedCard; + @VisibleForTesting Drawable mCardViewDrawable; @Inject public QuickAccessWalletTile( @@ -87,15 +88,15 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> { StatusBarStateController statusBarStateController, ActivityStarter activityStarter, QSLogger qsLogger, - QuickAccessWalletClient quickAccessWalletClient, KeyguardStateController keyguardStateController, PackageManager packageManager, SecureSettings secureSettings, - @Background Executor executor, + @Main Executor executor, + QuickAccessWalletController quickAccessWalletController, FeatureFlags featureFlags) { super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger, statusBarStateController, activityStarter, qsLogger); - mQuickAccessWalletClient = quickAccessWalletClient; + mController = quickAccessWalletController; mKeyguardStateController = keyguardStateController; mPackageManager = packageManager; mSecureSettings = secureSettings; @@ -115,7 +116,11 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> { protected void handleSetListening(boolean listening) { super.handleSetListening(listening); if (listening) { - queryWalletCards(); + mController.setupWalletChangeObservers(mCardRetriever, DEFAULT_PAYMENT_APP_CHANGE); + if (!mController.getWalletClient().isWalletServiceAvailable()) { + mController.reCreateWalletClient(); + } + mController.queryWalletCards(mCardRetriever); } } @@ -139,12 +144,13 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> { mContext.startActivity(intent); } } else { - if (mQuickAccessWalletClient.createWalletIntent() == null) { + if (mController.getWalletClient().createWalletIntent() == null) { Log.w(TAG, "Could not get intent of the wallet app."); return; } mActivityStarter.postStartActivityDismissingKeyguard( - mQuickAccessWalletClient.createWalletIntent(), /* delay= */ 0, + mController.getWalletClient().createWalletIntent(), + /* delay= */ 0, animationController); } }); @@ -152,30 +158,34 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> { @Override protected void handleUpdateState(State state, Object arg) { - CharSequence label = mQuickAccessWalletClient.getServiceLabel(); + CharSequence label = mController.getWalletClient().getServiceLabel(); state.label = label == null ? mLabel : label; state.contentDescription = state.label; state.icon = ResourceIcon.get(R.drawable.ic_wallet_lockscreen); boolean isDeviceLocked = !mKeyguardStateController.isUnlocked(); - if (mQuickAccessWalletClient.isWalletServiceAvailable()) { + if (mController.getWalletClient().isWalletServiceAvailable()) { if (mSelectedCard != null) { if (isDeviceLocked) { state.state = Tile.STATE_INACTIVE; state.secondaryLabel = mContext.getString(R.string.wallet_secondary_label_device_locked); + state.sideViewCustomDrawable = null; } else { state.state = Tile.STATE_ACTIVE; state.secondaryLabel = mSelectedCard.getContentDescription(); + state.sideViewCustomDrawable = mCardViewDrawable; } } else { state.state = Tile.STATE_INACTIVE; state.secondaryLabel = mContext.getString(R.string.wallet_secondary_label_no_card); + state.sideViewCustomDrawable = null; } state.stateDescription = state.secondaryLabel; } else { state.state = Tile.STATE_UNAVAILABLE; + state.secondaryLabel = null; + state.sideViewCustomDrawable = null; } - state.sideViewCustomDrawable = isDeviceLocked ? null : mCardViewDrawable; } @Override @@ -198,19 +208,14 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> { @Override public CharSequence getTileLabel() { - CharSequence label = mQuickAccessWalletClient.getServiceLabel(); + CharSequence label = mController.getWalletClient().getServiceLabel(); return label == null ? mLabel : label; } - private void queryWalletCards() { - int cardWidth = - mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width); - int cardHeight = - mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_height); - int iconSizePx = mContext.getResources().getDimensionPixelSize(R.dimen.wallet_icon_size); - GetWalletCardsRequest request = - new GetWalletCardsRequest(cardWidth, cardHeight, iconSizePx, /* maxCards= */ 1); - mQuickAccessWalletClient.getWalletCards(mExecutor, request, mCardRetriever); + @Override + protected void handleDestroy() { + super.handleDestroy(); + mController.unregisterWalletChangeObservers(DEFAULT_PAYMENT_APP_CHANGE); } private class WalletCardRetriever implements diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 89cb5af58928..f4c15fbf90b8 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -29,6 +29,7 @@ import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHE import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_SHELL_TRANSITIONS; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_SPLIT_SCREEN; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SHELL_STARTING_WINDOW; +import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SMARTSPACE_TRANSITION_CONTROLLER; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SUPPORTS_WINDOW_CORNERS; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_WINDOW_CORNER_RADIUS; @@ -88,6 +89,7 @@ import com.android.systemui.shared.recents.ISystemUiProxy; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; +import com.android.systemui.shared.system.smartspace.SmartspaceTransitionController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBar; @@ -148,6 +150,7 @@ public class OverviewProxyService extends CurrentUserTracker implements private final CommandQueue mCommandQueue; private final ShellTransitions mShellTransitions; private final Optional<StartingSurface> mStartingSurface; + private final SmartspaceTransitionController mSmartspaceTransitionController; private Region mActiveNavBarRegion; @@ -552,6 +555,9 @@ public class OverviewProxyService extends CurrentUserTracker implements mStartingSurface.ifPresent((startingwindow) -> params.putBinder( KEY_EXTRA_SHELL_STARTING_WINDOW, startingwindow.createExternalInterface().asBinder())); + params.putBinder( + KEY_EXTRA_SMARTSPACE_TRANSITION_CONTROLLER, + mSmartspaceTransitionController.createExternalInterface().asBinder()); try { Log.d(TAG_OPS + " b/182478748", "OverviewProxyService.onInitialize: curUser=" @@ -613,7 +619,8 @@ public class OverviewProxyService extends CurrentUserTracker implements Optional<OneHanded> oneHandedOptional, BroadcastDispatcher broadcastDispatcher, ShellTransitions shellTransitions, - Optional<StartingSurface> startingSurface) { + Optional<StartingSurface> startingSurface, + SmartspaceTransitionController smartspaceTransitionController) { super(broadcastDispatcher); mContext = context; mPipOptional = pipOptional; @@ -675,6 +682,7 @@ public class OverviewProxyService extends CurrentUserTracker implements updateEnabledState(); startConnectionToCurrentUser(); mStartingSurface = startingSurface; + mSmartspaceTransitionController = smartspaceTransitionController; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java index af4836d997fa..facebee52943 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java @@ -861,11 +861,15 @@ public class ScreenshotView extends FrameLayout implements class SwipeDismissHandler implements OnTouchListener { // distance needed to register a dismissal - private static final float DISMISS_DISTANCE_THRESHOLD_DP = 30; + private static final float DISMISS_DISTANCE_THRESHOLD_DP = 20; private final GestureDetector mGestureDetector; private float mStartX; + // Keeps track of the most recent direction (between the last two move events). + // -1 for left; +1 for right. + private int mDirectionX; + private float mPreviousX; SwipeDismissHandler() { GestureDetector.OnGestureListener gestureListener = new SwipeDismissGestureListener(); @@ -878,6 +882,7 @@ public class ScreenshotView extends FrameLayout implements mCallbacks.onUserInteraction(); if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { mStartX = event.getRawX(); + mPreviousX = mStartX; return true; } else if (event.getActionMasked() == MotionEvent.ACTION_UP) { if (isPastDismissThreshold() @@ -906,16 +911,42 @@ public class ScreenshotView extends FrameLayout implements public boolean onScroll( MotionEvent ev1, MotionEvent ev2, float distanceX, float distanceY) { mScreenshotStatic.setTranslationX(ev2.getRawX() - mStartX); + mDirectionX = (ev2.getRawX() < mPreviousX) ? -1 : 1; + mPreviousX = ev2.getRawX(); return true; } + + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, + float velocityY) { + if (mScreenshotStatic.getTranslationX() * velocityX > 0 + && (mDismissAnimation == null || !mDismissAnimation.isRunning())) { + animateDismissal(createSwipeDismissAnimation(velocityX / (float) 1000)); + return true; + } + return false; + } } private boolean isPastDismissThreshold() { - float distance = Math.abs(mScreenshotStatic.getTranslationX()); - return distance >= dpToPx(DISMISS_DISTANCE_THRESHOLD_DP); + float translationX = mScreenshotStatic.getTranslationX(); + // Determines whether the absolute translation from the start is in the same direction + // as the current movement. For example, if the user moves most of the way to the right, + // but then starts dragging back left, we do not dismiss even though the absolute + // distance is greater than the threshold. + if (translationX * mDirectionX > 0) { + return Math.abs(translationX) >= dpToPx(DISMISS_DISTANCE_THRESHOLD_DP); + } + return false; } private ValueAnimator createSwipeDismissAnimation() { + return createSwipeDismissAnimation(1); + } + + private ValueAnimator createSwipeDismissAnimation(float velocity) { + // velocity is measured in pixels per millisecond + velocity = Math.min(3, Math.max(1, velocity)); ValueAnimator anim = ValueAnimator.ofFloat(0, 1); float startX = mScreenshotStatic.getTranslationX(); // make sure the UI gets all the way off the screen in the direction of movement @@ -924,13 +955,14 @@ public class ScreenshotView extends FrameLayout implements float finalX = startX < 0 ? -1 * mActionsContainerBackground.getRight() : mDisplayMetrics.widthPixels; + float distance = Math.abs(finalX - startX); anim.addUpdateListener(animation -> { float translation = MathUtils.lerp(startX, finalX, animation.getAnimatedFraction()); mScreenshotStatic.setTranslationX(translation); setAlpha(1 - animation.getAnimatedFraction()); }); - anim.setDuration(400); + anim.setDuration((long) (distance / Math.abs(velocity))); return anim; } diff --git a/packages/SystemUI/src/com/android/systemui/shared/system/smartspace/SmartspaceTransitionController.kt b/packages/SystemUI/src/com/android/systemui/shared/system/smartspace/SmartspaceTransitionController.kt new file mode 100644 index 000000000000..89b3df0f495f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/shared/system/smartspace/SmartspaceTransitionController.kt @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2021 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.shared.system.smartspace + +import android.graphics.Rect +import android.view.View +import com.android.systemui.shared.system.ActivityManagerWrapper +import com.android.systemui.shared.system.QuickStepContract +import kotlin.math.min + +/** + * Controller that keeps track of SmartSpace instances in remote processes (such as Launcher), + * allowing System UI to query or update their state during shared-element transitions. + */ +class SmartspaceTransitionController { + + /** + * Implementation of [ISmartspaceTransitionController] that we provide to Launcher, allowing it + * to provide us with a callback to query and update the state of its Smartspace. + */ + private val ISmartspaceTransitionController = object : ISmartspaceTransitionController.Stub() { + override fun setSmartspace(callback: ISmartspaceCallback?) { + this@SmartspaceTransitionController.launcherSmartspace = callback + updateLauncherSmartSpaceState() + } + } + + /** + * Callback provided by Launcher to allow us to query and update the state of its SmartSpace. + */ + public var launcherSmartspace: ISmartspaceCallback? = null + + public var lockscreenSmartspace: View? = null + + /** + * Cached state of the Launcher SmartSpace. Retrieving the state is an IPC, so we should avoid + * unnecessary + */ + public var mLauncherSmartspaceState: SmartspaceState? = null + + /** + * The bounds of our SmartSpace when the shared element transition began. We'll interpolate + * between this and [smartspaceDestinationBounds] as the dismiss amount changes. + */ + private val smartspaceOriginBounds = Rect() + + /** The bounds of the Launcher's SmartSpace, which is where we are animating our SmartSpace. */ + + private val smartspaceDestinationBounds = Rect() + + fun createExternalInterface(): ISmartspaceTransitionController { + return ISmartspaceTransitionController + } + + /** + * Updates [mLauncherSmartspaceState] and returns it. This will trigger a binder call, so use the + * cached [mLauncherSmartspaceState] if possible. + */ + fun updateLauncherSmartSpaceState(): SmartspaceState? { + return launcherSmartspace?.smartspaceState.also { + mLauncherSmartspaceState = it + } + } + + fun prepareForUnlockTransition() { + updateLauncherSmartSpaceState().also { state -> + if (state?.boundsOnScreen != null && lockscreenSmartspace != null) { + lockscreenSmartspace!!.getBoundsOnScreen(smartspaceOriginBounds) + with(smartspaceDestinationBounds) { + set(state.boundsOnScreen) + offset(-lockscreenSmartspace!!.paddingLeft, + -lockscreenSmartspace!!.paddingTop) + } + } + } + } + + fun setProgressToDestinationBounds(progress: Float) { + if (!isSmartspaceTransitionPossible()) { + return + } + + val progressClamped = min(1f, progress) + + // Calculate the distance (relative to the origin) that we need to be for the current + // progress value. + val progressX = + (smartspaceDestinationBounds.left - smartspaceOriginBounds.left) * progressClamped + val progressY = + (smartspaceDestinationBounds.top - smartspaceOriginBounds.top) * progressClamped + + val lockscreenSmartspaceCurrentBounds = Rect().also { + lockscreenSmartspace!!.getBoundsOnScreen(it) + } + + // Figure out how far that is from our present location on the screen. This approach + // compensates for the fact that our parent container is also translating to animate out. + val dx = smartspaceOriginBounds.left + progressX - + lockscreenSmartspaceCurrentBounds.left + var dy = smartspaceOriginBounds.top + progressY - + lockscreenSmartspaceCurrentBounds.top + + with(lockscreenSmartspace!!) { + translationX = translationX + dx + translationY = translationY + dy + } + } + + /** + * Whether we're capable of performing the Smartspace shared element transition when we unlock. + * This is true if: + * + * - The Launcher registered a Smartspace with us, it's reporting non-empty bounds on screen. + * - Launcher is behind the keyguard, and the Smartspace is visible on the currently selected + * page. + */ + public fun isSmartspaceTransitionPossible(): Boolean { + val smartSpaceNullOrBoundsEmpty = mLauncherSmartspaceState?.boundsOnScreen?.isEmpty ?: true + return isLauncherUnderneath() && !smartSpaceNullOrBoundsEmpty + } + + companion object { + fun isLauncherUnderneath(): Boolean { + return ActivityManagerWrapper.getInstance() + .runningTask?.topActivity?.className?.equals( + QuickStepContract.LAUNCHER_ACTIVITY_CLASS_NAME) ?: false + } + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java index ac6d9e8820ad..c7b6e67cf96d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/FeatureFlags.java @@ -61,10 +61,6 @@ public class FeatureFlags { return mFlagReader.isEnabled(R.bool.flag_conversations); } - public boolean isToastStyleEnabled() { - return mFlagReader.isEnabled(R.bool.flag_toast_style); - } - public boolean isMonetEnabled() { return mFlagReader.isEnabled(R.bool.flag_monet); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java index b33424c563a3..acfd998ff6e4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java @@ -35,7 +35,6 @@ import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry.OnSensitivityChangedListener; -import java.util.List; /** * The view in the statusBar that contains part of the heads-up information @@ -55,10 +54,8 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { private int[] mTmpPosition = new int[2]; private boolean mFirstLayout = true; private int mMaxWidth; - private View mRootView; private int mSysWinInset; private int mCutOutInset; - private List<Rect> mCutOutBounds; private Rect mIconDrawingRect = new Rect(); private Point mDisplaySize; private Runnable mOnDrawingRectChangedListener; @@ -197,19 +194,7 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { int targetPadding = mAbsoluteStartPadding + mSysWinInset + mCutOutInset; boolean isRtl = isLayoutRtl(); int start = isRtl ? (mDisplaySize.x - right) : left; - if (start != targetPadding) { - if (mCutOutBounds != null) { - for (Rect cutOutRect : mCutOutBounds) { - int cutOutStart = (isRtl) - ? (mDisplaySize.x - cutOutRect.right) : cutOutRect.left; - if (start > cutOutStart) { - start -= cutOutRect.width(); - break; - } - } - } - int newPadding = targetPadding - start + getPaddingStart(); setPaddingRelative(newPadding, 0, mEndMargin, 0); } @@ -252,12 +237,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { getDisplaySize(); - mCutOutBounds = null; - if (displayCutout != null && displayCutout.getSafeInsetRight() == 0 - && displayCutout.getSafeInsetLeft() == 0) { - mCutOutBounds = displayCutout.getBoundingRects(); - } - // For Double Cut Out mode, the System window navigation bar is at the right // side of the left cut out. In this condition, mSysWinInset include the left cut // out width so we set mCutOutInset to be 0. For RTL, the condition is the same. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeWindowController.java index b6357b8dbd8d..045a1976d502 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeWindowController.java @@ -36,6 +36,12 @@ public interface NotificationShadeWindowController extends RemoteInputController */ default void registerCallback(StatusBarWindowCallback callback) {} + /** + * Unregisters a {@link StatusBarWindowCallback previous registered with + * {@link #registerCallback(StatusBarWindowCallback)}} + */ + default void unregisterCallback(StatusBarWindowCallback callback) {} + /** Notifies the registered {@link StatusBarWindowCallback} instances. */ default void notifyStateChangedCallbacks() {} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 1ea772a7d433..9dc4ac952b1d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -31,8 +31,8 @@ import android.view.WindowInsets; import android.view.accessibility.AccessibilityNodeInfo; import com.android.internal.annotations.VisibleForTesting; -import com.android.systemui.animation.Interpolators; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; @@ -53,37 +53,26 @@ import com.android.systemui.statusbar.phone.NotificationIconContainer; public class NotificationShelf extends ActivatableNotificationView implements View.OnLayoutChangeListener, StateListener { - private static final boolean ICON_ANMATIONS_WHILE_SCROLLING - = SystemProperties.getBoolean("debug.icon_scroll_animations", true); private static final int TAG_CONTINUOUS_CLIPPING = R.id.continuous_clipping_tag; private static final String TAG = "NotificationShelf"; private NotificationIconContainer mShelfIcons; private int[] mTmp = new int[2]; private boolean mHideBackground; - private int mIconAppearTopPadding; - private float mHiddenShelfIconSize; private int mStatusBarHeight; private AmbientState mAmbientState; private NotificationStackScrollLayoutController mHostLayoutController; - private int mMaxLayoutHeight; private int mPaddingBetweenElements; private int mNotGoneIndex; private boolean mHasItemsInStableShelf; private NotificationIconContainer mCollapsedIcons; private int mScrollFastThreshold; - private int mIconSize; private int mStatusBarState; - private int mRelativeOffset; private boolean mInteractive; - private float mOpenedAmount; - private boolean mNoAnimationsInThisFrame; private boolean mAnimationsEnabled = true; private boolean mShowNotificationShelf; private float mFirstElementRoundness; private Rect mClipRect = new Rect(); - private int mCutoutHeight; - private int mGapHeight; private int mIndexOfFirstViewInShelf = -1; private float mCornerAnimationDistance; private NotificationShelfController mController; @@ -121,7 +110,6 @@ public class NotificationShelf extends ActivatableNotificationView implements private void initDimens() { Resources res = getResources(); - mIconAppearTopPadding = res.getDimensionPixelSize(R.dimen.notification_icon_appear_padding); mStatusBarHeight = res.getDimensionPixelOffset(R.dimen.status_bar_height); mPaddingBetweenElements = res.getDimensionPixelSize(R.dimen.notification_divider_height); @@ -133,9 +121,6 @@ public class NotificationShelf extends ActivatableNotificationView implements mShelfIcons.setPadding(padding, 0, padding, 0); 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); - mHiddenShelfIconSize = res.getDimensionPixelOffset(R.dimen.hidden_shelf_icon_size); - mGapHeight = res.getDimensionPixelSize(R.dimen.qs_notification_padding); mCornerAnimationDistance = res.getDimensionPixelSize( R.dimen.notification_corner_animation_distance); @@ -180,7 +165,7 @@ public class NotificationShelf extends ActivatableNotificationView implements if (ambientState.isExpansionChanging() && !ambientState.isOnKeyguard()) { viewState.alpha = Interpolators.getNotificationScrimAlpha( - ambientState.getExpansionFraction()); + ambientState.getExpansionFraction(), true /* notification */); } else { viewState.alpha = 1f - ambientState.getHideAmount(); } @@ -373,9 +358,13 @@ public class NotificationShelf extends ActivatableNotificationView implements && anv instanceof ExpandableNotificationRow && ((ExpandableNotificationRow) anv).isHeadsUp(); + final boolean isHunGoingToShade = mAmbientState.isShadeExpanded() + && anv == mAmbientState.getTrackedHeadsUpRow(); + final boolean shouldUpdateCornerRoundness = viewStart < shelfStart && !mHostLayoutController.isViewAffectedBySwipe(anv) && !isUnlockedHeadsUp + && !isHunGoingToShade && !mAmbientState.isPulsing() && !mAmbientState.isDozing(); @@ -641,8 +630,7 @@ public class NotificationShelf extends ActivatableNotificationView implements transitionAmount = mAmbientState.isFullyHidden() ? 1 : 0; } else { transitionAmount = iconTransitionAmount; - iconState.needsCannedAnimation = iconState.clampedAppearAmount != clampedAmount - && !mNoAnimationsInThisFrame; + iconState.needsCannedAnimation = iconState.clampedAppearAmount != clampedAmount; } iconState.clampedAppearAmount = clampedAmount; setIconTransformationAmount(view, transitionAmount); @@ -743,29 +731,7 @@ public class NotificationShelf extends ActivatableNotificationView implements private void updateRelativeOffset() { mCollapsedIcons.getLocationOnScreen(mTmp); - mRelativeOffset = mTmp[0]; getLocationOnScreen(mTmp); - mRelativeOffset -= mTmp[0]; - } - - @Override - public WindowInsets onApplyWindowInsets(WindowInsets insets) { - WindowInsets ret = super.onApplyWindowInsets(insets); - - // NotificationShelf drag from the status bar and the status bar dock on the top - // of the display for current design so just focus on the top of ScreenDecorations. - // In landscape or multiple window split mode, the NotificationShelf still drag from - // the top and the physical notch/cutout goes to the right, left, or both side of the - // display so it doesn't matter for the NotificationSelf in landscape. - DisplayCutout displayCutout = insets.getDisplayCutout(); - mCutoutHeight = displayCutout == null || displayCutout.getSafeInsetTop() < 0 - ? 0 : displayCutout.getSafeInsetTop(); - - return ret; - } - - public void setMaxLayoutHeight(int maxLayoutHeight) { - mMaxLayoutHeight = maxLayoutHeight; } /** @@ -862,7 +828,6 @@ public class NotificationShelf extends ActivatableNotificationView implements private class ShelfState extends ExpandableViewState { private boolean hasItemsInStableShelf; private ExpandableView firstViewInShelf; - private ExpandableView firstViewInOverflowSection; @Override public void applyToView(View view) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt index 91415f2788a4..05afc57fbb59 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/WiredChargingRippleController.kt @@ -83,6 +83,7 @@ class WiredChargingRippleController @Inject constructor( var rippleView: ChargingRippleView = ChargingRippleView(context, attrs = null) init { + pluggedIn = batteryController.isPluggedIn val batteryStateChangeCallback = object : BatteryController.BatteryStateChangeCallback { override fun onBatteryLevelChanged( level: Int, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt index 655ed4132726..33aa7c720b22 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt @@ -26,14 +26,18 @@ import android.os.Process import android.provider.DeviceConfig import android.util.Log import android.view.View +import com.android.systemui.Dumpable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.dump.DumpManager import com.android.systemui.statusbar.phone.StatusBarWindowController import com.android.systemui.statusbar.policy.CallbackController import com.android.systemui.util.Assert import com.android.systemui.util.concurrency.DelayableExecutor import com.android.systemui.util.time.SystemClock +import java.io.FileDescriptor +import java.io.PrintWriter import javax.inject.Inject @@ -59,9 +63,10 @@ class SystemStatusAnimationScheduler @Inject constructor( private val coordinator: SystemEventCoordinator, private val chipAnimationController: SystemEventChipAnimationController, private val statusBarWindowController: StatusBarWindowController, + private val dumpManager: DumpManager, private val systemClock: SystemClock, @Main private val executor: DelayableExecutor -) : CallbackController<SystemStatusAnimationCallback> { +) : CallbackController<SystemStatusAnimationCallback>, Dumpable { companion object { private const val PROPERTY_ENABLE_IMMERSIVE_INDICATOR = "enable_immersive_indicator" @@ -71,10 +76,6 @@ class SystemStatusAnimationScheduler @Inject constructor( PROPERTY_ENABLE_IMMERSIVE_INDICATOR, true) } - /** True from the time a scheduled event starts until it's animation finishes */ - var isActive = false - private set - @SystemAnimationState var animationState: Int = IDLE private set @@ -88,6 +89,7 @@ class SystemStatusAnimationScheduler @Inject constructor( init { coordinator.attachScheduler(this) + dumpManager.registerDumpable(TAG, this) } fun onStatusEvent(event: StatusEvent) { @@ -293,6 +295,20 @@ class SystemStatusAnimationScheduler @Inject constructor( anim -> chipAnimationController.onChipAnimationUpdate(anim, animationState) } + override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) { + pw.println("Scheduled event: $scheduledEvent") + pw.println("Has persistent privacy dot: $hasPersistentDot") + pw.println("Animation state: $animationState") + pw.println("Listeners:") + if (listeners.isEmpty()) { + pw.println("(none)") + } else { + listeners.forEach { + pw.println(" $it") + } + } + } + inner class ChipAnimatorAdapter( @SystemAnimationState val endState: Int, val viewCreator: (context: Context) -> View diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index c0fbf68768cd..7afb0151aeda 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -393,6 +393,11 @@ class NotificationWakeUpCoordinator @Inject constructor( override fun onDozingChanged(isDozing: Boolean) { if (isDozing) { setNotificationsVisible(visible = false, animate = false, increaseSpeed = false) + } else { + // We only unset the flag once we fully went asleep. If the user interrupts the + // animation in the middle, we have to abort the animation as well to make sure + // the notifications are visible again. + animatingScreenOff = false } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TextViewTransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TextViewTransformState.java index c1ffc22637de..8b1efb54cb63 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TextViewTransformState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TextViewTransformState.java @@ -98,20 +98,20 @@ public class TextViewTransformState extends TransformState { int lineCount = mText.getLineCount(); return lineCount == 1 && lineCount == otherTvs.mText.getLineCount() && getEllipsisCount() == otherTvs.getEllipsisCount() - && getViewHeight() != otherTvs.getViewHeight(); + && getContentHeight() != otherTvs.getContentHeight(); } @Override - protected int getViewWidth() { + protected int getContentWidth() { Layout l = mText.getLayout(); if (l != null) { return (int) l.getLineWidth(0); } - return super.getViewWidth(); + return super.getContentWidth(); } @Override - protected int getViewHeight() { + protected int getContentHeight() { return mText.getLineHeight(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java index 74e62b6afc19..9f9fba437869 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java @@ -41,6 +41,7 @@ public class TransformState { public static final int TRANSFORM_X = 0x1; public static final int TRANSFORM_Y = 0x10; public static final int TRANSFORM_ALL = TRANSFORM_X | TRANSFORM_Y; + public static final int ALIGN_END_TAG = R.id.align_transform_end_tag; private static final float UNDEFINED = -1f; private static final int TRANSFORMATION_START_X = R.id.transformation_start_x_tag; @@ -78,11 +79,13 @@ public class TransformState { private boolean mSameAsAny; private float mTransformationEndY = UNDEFINED; private float mTransformationEndX = UNDEFINED; + private boolean mAlignEnd; protected Interpolator mDefaultInterpolator = Interpolators.FAST_OUT_SLOW_IN; public void initFrom(View view, TransformInfo transformInfo) { mTransformedView = view; mTransformInfo = transformInfo; + mAlignEnd = Boolean.TRUE.equals(view.getTag(ALIGN_END_TAG)); } /** @@ -135,13 +138,16 @@ public class TransformState { final View transformedView = mTransformedView; boolean transformX = (transformationFlags & TRANSFORM_X) != 0; boolean transformY = (transformationFlags & TRANSFORM_Y) != 0; - int viewHeight = getViewHeight(); - int otherHeight = otherState.getViewHeight(); - boolean differentHeight = otherHeight != viewHeight && otherHeight != 0 && viewHeight != 0; - int viewWidth = getViewWidth(); - int otherWidth = otherState.getViewWidth(); - boolean differentWidth = otherWidth != viewWidth && otherWidth != 0 && viewWidth != 0; - boolean transformScale = transformScale(otherState) && (differentHeight || differentWidth); + int ownContentHeight = getContentHeight(); + int otherContentHeight = otherState.getContentHeight(); + boolean differentHeight = otherContentHeight != ownContentHeight + && otherContentHeight != 0 && ownContentHeight != 0; + int ownContentWidth = getContentWidth(); + int otherContentWidth = otherState.getContentWidth(); + boolean differentWidth = otherContentWidth != ownContentWidth + && otherContentWidth != 0 && ownContentWidth != 0; + boolean transformScale = (differentHeight || differentWidth) && transformScale(otherState); + boolean transformRightEdge = transformRightEdge(otherState); // lets animate the positions correctly if (transformationAmount == 0.0f || transformX && getTransformationStartX() == UNDEFINED @@ -159,7 +165,14 @@ public class TransformState { if (customTransformation == null || !customTransformation.initTransformation(this, otherState)) { if (transformX) { - setTransformationStartX(otherPosition[0] - ownStablePosition[0]); + if (transformRightEdge) { + int otherViewWidth = otherState.getTransformedView().getWidth(); + int ownViewWidth = transformedView.getWidth(); + setTransformationStartX((otherPosition[0] + otherViewWidth) + - (ownStablePosition[0] + ownViewWidth)); + } else { + setTransformationStartX(otherPosition[0] - ownStablePosition[0]); + } } if (transformY) { setTransformationStartY(otherPosition[1] - ownStablePosition[1]); @@ -167,15 +180,15 @@ public class TransformState { // we also want to animate the scale if we're the same View otherView = otherState.getTransformedView(); if (transformScale && differentWidth) { - setTransformationStartScaleX(otherWidth * otherView.getScaleX() - / (float) viewWidth); - transformedView.setPivotX(0); + setTransformationStartScaleX(otherContentWidth * otherView.getScaleX() + / (float) ownContentWidth); + transformedView.setPivotX(transformRightEdge ? transformedView.getWidth() : 0); } else { setTransformationStartScaleX(UNDEFINED); } if (transformScale && differentHeight) { - setTransformationStartScaleY(otherHeight * otherView.getScaleY() - / (float) viewHeight); + setTransformationStartScaleY(otherContentHeight * otherView.getScaleY() + / (float) ownContentHeight); transformedView.setPivotY(0); } else { setTransformationStartScaleY(UNDEFINED); @@ -239,11 +252,19 @@ public class TransformState { } } - protected int getViewWidth() { + /** + * The width of the content of this view. For some views, like TextViews, this will be the + * width of content inside the view which is transforming, rather than the view's full width. + */ + protected int getContentWidth() { return mTransformedView.getWidth(); } - protected int getViewHeight() { + /** + * The height of the content of this view. For some views, like TextViews, this will be the + * height of content inside the view which is transforming, rather than the view's full height. + */ + protected int getContentHeight() { return mTransformedView.getHeight(); } @@ -251,6 +272,12 @@ public class TransformState { return sameAs(otherState); } + protected boolean transformRightEdge(TransformState otherState) { + boolean alignEnd = mAlignEnd && otherState.mAlignEnd; + boolean isRtl = mTransformedView.isLayoutRtl() && otherState.mTransformedView.isLayoutRtl(); + return alignEnd ^ isRtl; + } + /** * Transforms the {@link #mTransformedView} to the given transformviewstate * @param otherState the state to transform from @@ -302,6 +329,9 @@ public class TransformState { boolean transformX = (transformationFlags & TRANSFORM_X) != 0; boolean transformY = (transformationFlags & TRANSFORM_Y) != 0; boolean transformScale = transformScale(otherState); + boolean transformRightEdge = transformRightEdge(otherState); + int ownContentWidth = getContentWidth(); + int otherContentWidth = otherState.getContentWidth(); // lets animate the positions correctly if (transformationAmount == 0.0f) { if (transformX) { @@ -316,14 +346,13 @@ public class TransformState { : transformedView.getTranslationY(); setTransformationStartY(start); } - View otherView = otherState.getTransformedView(); - if (transformScale && otherState.getViewWidth() != getViewWidth()) { + if (transformScale && otherContentWidth != ownContentWidth) { setTransformationStartScaleX(transformedView.getScaleX()); - transformedView.setPivotX(0); + transformedView.setPivotX(transformRightEdge ? transformedView.getWidth() : 0); } else { setTransformationStartScaleX(UNDEFINED); } - if (transformScale && otherState.getViewHeight() != getViewHeight()) { + if (transformScale && otherState.getContentHeight() != getContentHeight()) { setTransformationStartScaleY(transformedView.getScaleY()); transformedView.setPivotY(0); } else { @@ -336,7 +365,11 @@ public class TransformState { int[] otherStablePosition = otherState.getLaidOutLocationOnScreen(); int[] ownPosition = getLaidOutLocationOnScreen(); if (transformX) { - float endX = otherStablePosition[0] - ownPosition[0]; + int ownViewWidth = transformedView.getWidth(); + int otherViewWidth = otherState.getTransformedView().getWidth(); + float endX = transformRightEdge + ? (otherStablePosition[0] + otherViewWidth) - (ownPosition[0] + ownViewWidth) + : otherStablePosition[0] - ownPosition[0]; float interpolation = interpolatedValue; if (customTransformation != null) { if (customTransformation.customTransformTarget(this, otherState)) { @@ -370,19 +403,18 @@ public class TransformState { interpolation)); } if (transformScale) { - View otherView = otherState.getTransformedView(); float transformationStartScaleX = getTransformationStartScaleX(); if (transformationStartScaleX != UNDEFINED) { transformedView.setScaleX( NotificationUtils.interpolate(transformationStartScaleX, - (otherState.getViewWidth() / (float) getViewWidth()), + (otherContentWidth / (float) ownContentWidth), interpolatedValue)); } float transformationStartScaleY = getTransformationStartScaleY(); if (transformationStartScaleY != UNDEFINED) { transformedView.setScaleY( NotificationUtils.interpolate(transformationStartScaleY, - (otherState.getViewHeight() / (float) getViewHeight()), + (otherState.getContentHeight() / (float) getContentHeight()), interpolatedValue)); } } @@ -529,6 +561,7 @@ public class TransformState { mSameAsAny = false; mTransformationEndX = UNDEFINED; mTransformationEndY = UNDEFINED; + mAlignEnd = false; mDefaultInterpolator = Interpolators.FAST_OUT_SLOW_IN; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java index 2a157261205d..199692bc3b79 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java @@ -151,6 +151,7 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp mRightIcon = mView.findViewById(com.android.internal.R.id.right_icon); if (mRightIcon != null) { mRightIcon.setTag(ImageTransformState.ICON_TAG, getRightIcon(sbn.getNotification())); + mRightIcon.setTag(TransformState.ALIGN_END_TAG, true); } mLeftIcon = mView.findViewById(com.android.internal.R.id.left_icon); if (mLeftIcon != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index 66d23477436f..a18917789ba1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -75,6 +75,7 @@ public class AmbientState { private int mExpandAnimationTopChange; private ExpandableNotificationRow mExpandingNotification; private float mHideAmount; + private float mNotificationScrimTop; private boolean mAppearing; private float mPulseHeight = MAX_PULSE_HEIGHT; private float mDozeAmount = 0.0f; @@ -255,6 +256,20 @@ public class AmbientState { return mHideAmount; } + /** + * Set y position of top of notifications background scrim, relative to top of screen. + */ + public void setNotificationScrimTop(float notificationScrimTop) { + mNotificationScrimTop = notificationScrimTop; + } + + /** + * @return Y position of top of notifications background scrim, relative to top of screen. + */ + public float getNotificationScrimTop() { + return mNotificationScrimTop; + } + public void setHideSensitive(boolean hideSensitive) { mHideSensitive = hideSensitive; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index a804ae6a5cd8..94edbd092a4d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -963,7 +963,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable @ShadeViewRefactor(RefactorComponent.LAYOUT_ALGORITHM) private void setMaxLayoutHeight(int maxLayoutHeight) { mMaxLayoutHeight = maxLayoutHeight; - mShelf.setMaxLayoutHeight(maxLayoutHeight); updateAlgorithmHeightAndPadding(); } @@ -1009,9 +1008,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private void updateClippingToTopRoundedCorner() { - Float clipStart = (float) mTopPadding - + mStackTranslation - + mAmbientState.getExpandAnimationTopChange(); + Float clipStart = mAmbientState.getNotificationScrimTop(); Float clipEnd = clipStart + mCornerRadius; boolean first = true; for (int i = 0; i < getChildCount(); i++) { @@ -1024,7 +1021,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable boolean clip = clipStart > start && clipStart < end || clipEnd >= start && clipEnd <= end; clip &= !(first && mScrollAdapter.isScrolledToTop()); - child.setDistanceToTopRoundness(ExpandableView.NO_ROUNDNESS); + child.setDistanceToTopRoundness(clip ? Math.max(start - clipStart, 0) + : ExpandableView.NO_ROUNDNESS); first = false; } } @@ -5147,8 +5145,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable } /** - * Sets the extra top inset for the full shade transition. This is needed to compensate for - * media transitioning to quick settings + * Sets the extra top inset for the full shade transition. This moves notifications down + * during the drag down. */ public void setExtraTopInsetForFullShadeTransition(float inset) { mExtraTopInsetForFullShadeTransition = inset; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java index d23a309ad1e9..4432f5463802 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java @@ -185,8 +185,17 @@ public class NotificationStackScrollLayoutController { private ColorExtractor.OnColorsChangedListener mOnColorsChangedListener; + /** + * The total distance in pixels that the full shade transition takes to transition entirely to + * the full shade. + */ private int mTotalDistanceForFullShadeTransition; - private int mTotalExtraMediaInsetFullShadeTransition; + + /** + * The amount of movement the notifications do when transitioning to the full shade before + * reaching the overstrech + */ + private int mNotificationDragDownMovement; @VisibleForTesting final View.OnAttachStateChangeListener mOnAttachStateChangeListener = @@ -255,8 +264,8 @@ public class NotificationStackScrollLayoutController { }; private void updateResources() { - mTotalExtraMediaInsetFullShadeTransition = mResources.getDimensionPixelSize( - R.dimen.lockscreen_shade_transition_extra_media_inset); + mNotificationDragDownMovement = mResources.getDimensionPixelSize( + R.dimen.lockscreen_shade_notification_movement); mTotalDistanceForFullShadeTransition = mResources.getDimensionPixelSize( R.dimen.lockscreen_shade_qs_transition_distance); } @@ -1410,15 +1419,13 @@ public class NotificationStackScrollLayoutController { * shade. 0.0f means we're not transitioning yet. */ public void setTransitionToFullShadeAmount(float amount) { - float extraTopInset; - MediaHeaderView view = mKeyguardMediaController.getSinglePaneContainer(); - if (view == null || view.getHeight() == 0 - || mStatusBarStateController.getState() != KEYGUARD) { - extraTopInset = 0; - } else { - extraTopInset = MathUtils.saturate(amount / mTotalDistanceForFullShadeTransition); - extraTopInset = Interpolators.FAST_OUT_SLOW_IN.getInterpolation(extraTopInset); - extraTopInset = extraTopInset * mTotalExtraMediaInsetFullShadeTransition; + float extraTopInset = 0.0f; + if (mStatusBarStateController.getState() == KEYGUARD) { + float overallProgress = MathUtils.saturate(amount / mView.getHeight()); + float transitionProgress = Interpolators.getOvershootInterpolation(overallProgress, + 0.6f, + (float) mTotalDistanceForFullShadeTransition / (float) mView.getHeight()); + extraTopInset = transitionProgress * mNotificationDragDownMovement; } mView.setExtraTopInsetForFullShadeTransition(extraTopInset); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index e931ec4626a1..86465b6f6b1a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -24,8 +24,8 @@ import android.util.MathUtils; import android.view.View; import android.view.ViewGroup; -import com.android.systemui.animation.Interpolators; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.notification.dagger.SilentHeader; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; @@ -156,9 +156,9 @@ public class StackScrollAlgorithm { private void updateClipping(StackScrollAlgorithmState algorithmState, AmbientState ambientState) { - float drawStart = !ambientState.isOnKeyguard() - ? ambientState.getStackY() - ambientState.getScrollY() : 0; - float clipStart = 0; + float drawStart = ambientState.isOnKeyguard() ? 0 + : ambientState.getStackY() - ambientState.getScrollY(); + float clipStart = ambientState.getNotificationScrimTop(); int childCount = algorithmState.visibleChildren.size(); boolean firstHeadsUp = true; for (int i = 0; i < childCount; i++) { @@ -380,11 +380,15 @@ public class StackScrollAlgorithm { ExpandableViewState viewState = view.getViewState(); viewState.location = ExpandableViewState.LOCATION_UNKNOWN; - if (ambientState.isExpansionChanging() && !ambientState.isOnKeyguard()) { - viewState.alpha = Interpolators.getNotificationScrimAlpha( - ambientState.getExpansionFraction()); - } else { - viewState.alpha = 1f - ambientState.getHideAmount(); + final boolean isHunGoingToShade = ambientState.isShadeExpanded() + && view == ambientState.getTrackedHeadsUpRow(); + if (!isHunGoingToShade) { + if (ambientState.isExpansionChanging() && !ambientState.isOnKeyguard()) { + viewState.alpha = Interpolators.getNotificationScrimAlpha( + ambientState.getExpansionFraction(), true /* notification */); + } else { + viewState.alpha = 1f - ambientState.getHideAmount(); + } } if (view.mustStayOnScreen() && viewState.yTranslation >= 0) { @@ -414,13 +418,15 @@ public class StackScrollAlgorithm { } if (view instanceof FooterView) { + final boolean shadeClosed = !ambientState.isShadeExpanded(); final boolean isShelfShowing = algorithmState.firstViewInShelf != null; final float footerEnd = algorithmState.mCurrentExpandedYPosition + view.getIntrinsicHeight(); final boolean noSpaceForFooter = footerEnd > ambientState.getStackEndHeight(); - viewState.hidden = isShelfShowing || noSpaceForFooter; + viewState.hidden = shadeClosed || isShelfShowing || noSpaceForFooter; + } else if (view != ambientState.getTrackedHeadsUpRow()) { if (ambientState.isExpansionChanging()) { // Show all views. Views below the shelf will later be clipped (essentially hidden) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index 7f919b5f5cf5..4d8e7de37606 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -24,6 +24,8 @@ import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_LEFT_BUTT import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_LEFT_UNLOCK; import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_RIGHT_BUTTON; import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_RIGHT_UNLOCK; +import static com.android.systemui.wallet.controller.QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE; +import static com.android.systemui.wallet.controller.QuickAccessWalletController.WalletChangeEvent.WALLET_PREFERENCE_CHANGE; import android.app.ActivityManager; import android.app.ActivityOptions; @@ -39,7 +41,6 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Configuration; -import android.database.ContentObserver; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; @@ -49,13 +50,10 @@ import android.os.Messenger; import android.os.RemoteException; import android.os.UserHandle; import android.provider.MediaStore; -import android.provider.Settings; import android.service.media.CameraPrewarmService; import android.service.quickaccesswallet.GetWalletCardsError; -import android.service.quickaccesswallet.GetWalletCardsRequest; import android.service.quickaccesswallet.GetWalletCardsResponse; import android.service.quickaccesswallet.QuickAccessWalletClient; -import android.service.quickaccesswallet.QuickAccessWalletClientImpl; import android.telecom.TelecomManager; import android.text.TextUtils; import android.util.AttributeSet; @@ -71,7 +69,6 @@ import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.widget.LockPatternUtils; @@ -97,11 +94,9 @@ import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.PreviewInflater; import com.android.systemui.tuner.LockscreenFragment.LockButtonFactory; import com.android.systemui.tuner.TunerService; -import com.android.systemui.util.settings.SecureSettings; +import com.android.systemui.wallet.controller.QuickAccessWalletController; import com.android.systemui.wallet.ui.WalletActivity; -import java.util.concurrent.Executor; - /** * Implementation for the bottom area of the Keyguard, including camera/phone affordance and status * text. @@ -137,10 +132,9 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL private KeyguardAffordanceView mLeftAffordanceView; private ImageView mWalletButton; - private boolean mWalletEnabled = false; private boolean mHasCard = false; private WalletCardRetriever mCardRetriever = new WalletCardRetriever(); - private QuickAccessWalletClient mQuickAccessWalletClient; + private QuickAccessWalletController mQuickAccessWalletController; private ViewGroup mIndicationArea; private TextView mIndicationText; @@ -159,7 +153,6 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL private StatusBar mStatusBar; private KeyguardAffordanceHelper mAffordanceHelper; private FalsingManager mFalsingManager; - @Nullable private Executor mUiExecutor; private boolean mUserSetupComplete; private boolean mPrewarmBound; private Messenger mPrewarmMessenger; @@ -193,8 +186,6 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL private int mBurnInYOffset; private ActivityIntentHelper mActivityIntentHelper; private KeyguardUpdateMonitor mKeyguardUpdateMonitor; - private ContentObserver mWalletPreferenceObserver; - private SecureSettings mSecureSettings; public KeyguardBottomAreaView(Context context) { this(context, null); @@ -332,8 +323,9 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL getContext().unregisterReceiver(mDevicePolicyReceiver); mKeyguardUpdateMonitor.removeCallback(mUpdateMonitorCallback); - if (mWalletPreferenceObserver != null) { - mSecureSettings.unregisterContentObserver(mWalletPreferenceObserver); + if (mQuickAccessWalletController != null) { + mQuickAccessWalletController.unregisterWalletChangeObservers( + WALLET_PREFERENCE_CHANGE, DEFAULT_PAYMENT_APP_CHANGE); } } @@ -456,7 +448,10 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL } private void updateWalletVisibility() { - if (mDozing || !mWalletEnabled || !mHasCard) { + if (mDozing + || mQuickAccessWalletController == null + || !mQuickAccessWalletController.isWalletEnabled() + || !mHasCard) { mWalletButton.setVisibility(GONE); mIndicationArea.setPadding(0, 0, 0, 0); } else { @@ -690,7 +685,9 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL @Override public void onKeyguardShowingChanged() { if (mKeyguardStateController.isShowing()) { - queryWalletCards(); + if (mQuickAccessWalletController != null) { + mQuickAccessWalletController.queryWalletCards(mCardRetriever); + } } } @@ -935,50 +932,17 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL /** * Initialize the wallet feature, only enabling if the feature is enabled within the platform. */ - public void initWallet(QuickAccessWalletClient client, Executor uiExecutor, - SecureSettings secureSettings) { - mQuickAccessWalletClient = client; - mSecureSettings = secureSettings; - setupWalletPreferenceObserver(); - updateWalletPreference(); - - mUiExecutor = uiExecutor; - queryWalletCards(); + public void initWallet( + QuickAccessWalletController controller) { + mQuickAccessWalletController = controller; + mQuickAccessWalletController.setupWalletChangeObservers( + mCardRetriever, WALLET_PREFERENCE_CHANGE, DEFAULT_PAYMENT_APP_CHANGE); + mQuickAccessWalletController.updateWalletPreference(); + mQuickAccessWalletController.queryWalletCards(mCardRetriever); updateWalletVisibility(); } - private void setupWalletPreferenceObserver() { - if (mWalletPreferenceObserver == null) { - mWalletPreferenceObserver = new ContentObserver(null /* handler */) { - @Override - public void onChange(boolean selfChange) { - mUiExecutor.execute(() -> updateWalletPreference()); - } - }; - - mSecureSettings.registerContentObserver( - Settings.Secure.getUriFor(QuickAccessWalletClientImpl.SETTING_KEY), - false /* notifyForDescendants */, - mWalletPreferenceObserver); - } - } - - private void updateWalletPreference() { - mWalletEnabled = mQuickAccessWalletClient.isWalletFeatureAvailable() - && mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked(); - } - - private void queryWalletCards() { - if (!mWalletEnabled || mUiExecutor == null) { - return; - } - GetWalletCardsRequest request = - new GetWalletCardsRequest(1 /* cardWidth */, 1 /* cardHeight */, - 1 /* iconSizePx */, 1 /* maxCards */); - mQuickAccessWalletClient.getWalletCards(mUiExecutor, request, mCardRetriever); - } - private void onWalletClick(View v) { // More coming here; need to inform the user about how to proceed if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { @@ -991,12 +955,13 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent); } else { - if (mQuickAccessWalletClient.createWalletIntent() == null) { + if (mQuickAccessWalletController.getWalletClient().createWalletIntent() == null) { Log.w(TAG, "Could not get intent of the wallet app."); return; } mActivityStarter.postStartActivityDismissingKeyguard( - mQuickAccessWalletClient.createWalletIntent(), /* delay= */ 0); + mQuickAccessWalletController.getWalletClient().createWalletIntent(), + /* delay= */ 0); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index f4710f49524d..7c2723d724ce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -325,7 +325,9 @@ public class KeyguardClockPositionAlgorithm { */ private float getClockAlpha(int y) { float alphaKeyguard = Math.max(0, y / Math.max(1f, getClockY(1f, mDarkAmount))); - alphaKeyguard *= (1f - mQsExpansion); + float qsAlphaFactor = MathUtils.saturate(mQsExpansion / 0.3f); + qsAlphaFactor = 1f - qsAlphaFactor; + alphaKeyguard *= qsAlphaFactor; alphaKeyguard = Interpolators.ACCELERATE.getInterpolation(alphaKeyguard); return MathUtils.lerp(alphaKeyguard, 1f, mDarkAmount); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java index d84bb908fe69..68e20705fbeb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java @@ -142,7 +142,6 @@ public class KeyguardIndicationTextView extends TextView { Animator yTranslate = ObjectAnimator.ofFloat(this, View.TRANSLATION_Y, 0, -getYTranslationPixels()); yTranslate.setDuration(getFadeOutDuration()); - fadeOut.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN); animatorSet.playTogether(fadeOut, yTranslate); return animatorSet; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index 0c4bec2c2c65..eef24200a882 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -116,6 +116,12 @@ public class KeyguardStatusBarView extends RelativeLayout implements // right and left padding applied to this view to account for cutouts and rounded corners private Pair<Integer, Integer> mPadding = new Pair(0, 0); + /** + * The clipping on the top + */ + private int mTopClipping; + private final Rect mClipRect = new Rect(0, 0, 0, 0); + public KeyguardStatusBarView(Context context, AttributeSet attrs) { super(context, attrs); mUserManager = UserManager.get(getContext()); @@ -549,4 +555,25 @@ public class KeyguardStatusBarView extends RelativeLayout implements public void onSystemChromeAnimationUpdate(ValueAnimator anim) { mSystemIconsContainer.setAlpha((float) anim.getAnimatedValue()); } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + updateClipping(); + } + + /** + * Set the clipping on the top of the view. + */ + public void setTopClipping(int topClipping) { + if (topClipping != mTopClipping) { + mTopClipping = topClipping; + updateClipping(); + } + } + + private void updateClipping() { + mClipRect.set(0, mTopClipping, getWidth(), getHeight()); + setClipBounds(mClipRect); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 0f3af095f7be..d9ba494a4d63 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -24,6 +24,8 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.util.AttributeSet; +import com.android.systemui.R; + public class NotificationPanelView extends PanelView { private static final boolean DEBUG = false; @@ -92,6 +94,10 @@ public class NotificationPanelView extends PanelView { mRtlChangeListener = listener; } + public TapAgainView getTapAgainView() { + return findViewById(R.id.shade_falsing_tap_again); + } + interface RtlChangeListener { void onRtlPropertielsChanged(int layoutDirection); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 3bbabeb0cf7e..7737420cf026 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -27,7 +27,6 @@ import static com.android.systemui.classifier.Classifier.QS_COLLAPSE; import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_ALL; -import static com.android.systemui.util.Utils.shouldUseSplitNotificationShade; import static java.lang.Float.isNaN; @@ -54,7 +53,6 @@ import android.os.PowerManager; import android.os.SystemClock; import android.os.UserManager; import android.os.VibrationEffect; -import android.service.quickaccesswallet.QuickAccessWalletClient; import android.util.Log; import android.util.MathUtils; import android.view.DisplayCutout; @@ -97,8 +95,8 @@ import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.dagger.qualifiers.DisplayId; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.doze.DozeLog; -import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentHostManager.FragmentListener; +import com.android.systemui.fragments.FragmentService; import com.android.systemui.media.KeyguardMediaController; import com.android.systemui.media.MediaDataManager; import com.android.systemui.media.MediaHierarchyManager; @@ -153,6 +151,7 @@ import com.android.systemui.statusbar.policy.KeyguardUserSwitcherView; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import com.android.systemui.util.Utils; import com.android.systemui.util.settings.SecureSettings; +import com.android.systemui.wallet.controller.QuickAccessWalletController; import com.android.wm.shell.animation.FlingAnimationUtils; import java.io.FileDescriptor; @@ -306,14 +305,17 @@ public class NotificationPanelViewController extends PanelViewController { private final KeyguardUserSwitcherComponent.Factory mKeyguardUserSwitcherComponentFactory; private final KeyguardStatusBarViewComponent.Factory mKeyguardStatusBarViewComponentFactory; private final QSDetailDisplayer mQSDetailDisplayer; + private final FragmentService mFragmentService; private final FeatureFlags mFeatureFlags; private final ScrimController mScrimController; private final PrivacyDotViewController mPrivacyDotViewController; + private final QuickAccessWalletController mQuickAccessWalletController; // Maximum # notifications to show on Keyguard; extras will be collapsed in an overflow card. // If there are exactly 1 + mMaxKeyguardNotifications, then still shows all notifications private final int mMaxKeyguardNotifications; private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; + private final TapAgainViewController mTapAgainViewController; private boolean mShouldUseSplitNotificationShade; // Current max allowed keyguard notifications determined by measuring the panel private int mMaxAllowedKeyguardNotifications; @@ -331,7 +333,7 @@ public class NotificationPanelViewController extends PanelViewController { private LockIconViewController mLockIconViewController; private NotificationsQuickSettingsContainer mNotificationContainerParent; private boolean mAnimateNextPositionUpdate; - + private float mQuickQsOffsetHeight; private int mTrackingPointer; private VelocityTracker mQsVelocityTracker; private boolean mQsTracking; @@ -508,6 +510,13 @@ public class NotificationPanelViewController extends PanelViewController { private float mSectionPadding; /** + * The padding between the start of notifications and the qs boundary on the lockscreen. + * On lockscreen, notifications aren't inset this extra amount, but we still want the + * qs boundary to be padded. + */ + private int mLockscreenNotificationQSPadding; + + /** * The amount of progress we are currently in if we're transitioning to the full shade. * 0.0f means we're not transitioning yet, while 1 means we're all the way in the full * shade. This value can also go beyond 1.1 when we're overshooting! @@ -529,7 +538,7 @@ public class NotificationPanelViewController extends PanelViewController { /** * The maximum overshoot allowed for the top padding for the full shade transition */ - private int mMaxOverscrollAmountForDragDown; + private int mMaxOverscrollAmountForPulse; /** * Should we animate the next bounds update @@ -573,8 +582,8 @@ public class NotificationPanelViewController extends PanelViewController { private int mScrimCornerRadius; private int mScreenCornerRadius; private int mNotificationScrimPadding; + private boolean mQSAnimatingHiddenFromCollapsed; - private final QuickAccessWalletClient mQuickAccessWalletClient; private final Executor mUiExecutor; private final SecureSettings mSecureSettings; @@ -604,7 +613,12 @@ public class NotificationPanelViewController extends PanelViewController { private final FalsingTapListener mFalsingTapListener = new FalsingTapListener() { @Override public void onDoubleTapRequired() { - showTransientIndication(R.string.notification_tap_again); + if (mStatusBarStateController.getState() == StatusBarState.SHADE_LOCKED) { + mTapAgainViewController.show(); + } else { + mKeyguardIndicationController.showTransientIndication( + R.string.notification_tap_again); + } mVibratorHelper.vibrate(VibrationEffect.EFFECT_STRENGTH_MEDIUM); } }; @@ -650,9 +664,11 @@ public class NotificationPanelViewController extends PanelViewController { AmbientState ambientState, LockIconViewController lockIconViewController, FeatureFlags featureFlags, - QuickAccessWalletClient quickAccessWalletClient, KeyguardMediaController keyguardMediaController, PrivacyDotViewController privacyDotViewController, + TapAgainViewController tapAgainViewController, + FragmentService fragmentService, + QuickAccessWalletController quickAccessWalletController, @Main Executor uiExecutor, SecureSettings secureSettings) { super(view, falsingManager, dozeLog, keyguardStateController, @@ -663,6 +679,7 @@ public class NotificationPanelViewController extends PanelViewController { mVibratorHelper = vibratorHelper; mKeyguardMediaController = keyguardMediaController; mPrivacyDotViewController = privacyDotViewController; + mQuickAccessWalletController = quickAccessWalletController; mMetricsLogger = metricsLogger; mActivityManager = activityManager; mConfigurationController = configurationController; @@ -679,6 +696,7 @@ public class NotificationPanelViewController extends PanelViewController { mKeyguardQsUserSwitchComponentFactory = keyguardQsUserSwitchComponentFactory; mKeyguardUserSwitcherComponentFactory = keyguardUserSwitcherComponentFactory; mQSDetailDisplayer = qsDetailDisplayer; + mFragmentService = fragmentService; mKeyguardUserSwitcherEnabled = mResources.getBoolean( com.android.internal.R.bool.config_keyguardUserSwitcher); mKeyguardQsUserSwitchEnabled = @@ -704,7 +722,7 @@ public class NotificationPanelViewController extends PanelViewController { mScrimController.setClipsQsScrim(!mShouldUseSplitNotificationShade); mUserManager = userManager; mMediaDataManager = mediaDataManager; - mQuickAccessWalletClient = quickAccessWalletClient; + mTapAgainViewController = tapAgainViewController; mUiExecutor = uiExecutor; mSecureSettings = secureSettings; pulseExpansionHandler.setPulseExpandAbortListener(() -> { @@ -812,7 +830,7 @@ public class NotificationPanelViewController extends PanelViewController { amount -> { float progress = amount / mView.getHeight(); float overstretch = Interpolators.getOvershootInterpolation(progress, - (float) mMaxOverscrollAmountForDragDown / mView.getHeight(), + (float) mMaxOverscrollAmountForPulse / mView.getHeight(), 0.2f); setOverStrechAmount(overstretch); }); @@ -843,6 +861,8 @@ public class NotificationPanelViewController extends PanelViewController { if (mShouldUseSplitNotificationShade) { updateResources(); } + + mTapAgainViewController.init(); } @Override @@ -873,14 +893,16 @@ public class NotificationPanelViewController extends PanelViewController { R.dimen.heads_up_status_bar_padding); mDistanceForQSFullShadeTransition = mResources.getDimensionPixelSize( R.dimen.lockscreen_shade_qs_transition_distance); - mMaxOverscrollAmountForDragDown = mResources.getDimensionPixelSize( - R.dimen.lockscreen_shade_max_top_overshoot); + mMaxOverscrollAmountForPulse = mResources.getDimensionPixelSize( + R.dimen.pulse_expansion_max_top_overshoot); mScrimCornerRadius = mResources.getDimensionPixelSize( R.dimen.notification_scrim_corner_radius); mScreenCornerRadius = mResources.getDimensionPixelSize( com.android.internal.R.dimen.rounded_corner_radius); mNotificationScrimPadding = mResources.getDimensionPixelSize( R.dimen.notification_side_paddings); + mLockscreenNotificationQSPadding = mResources.getDimensionPixelSize( + R.dimen.notification_side_paddings); } private void updateViewControllers(KeyguardStatusView keyguardStatusView, @@ -943,6 +965,8 @@ public class NotificationPanelViewController extends PanelViewController { } public void updateResources() { + mQuickQsOffsetHeight = mResources.getDimensionPixelSize( + com.android.internal.R.dimen.quick_qs_offset_height); mSplitShadeNotificationsTopPadding = mResources.getDimensionPixelSize(R.dimen.notifications_top_padding_split_shade); int qsWidth = mResources.getDimensionPixelSize(R.dimen.qs_panel_width); @@ -1098,7 +1122,7 @@ public class NotificationPanelViewController extends PanelViewController { mKeyguardBottomArea.setFalsingManager(mFalsingManager); if (mFeatureFlags.isQuickAccessWalletEnabled()) { - mKeyguardBottomArea.initWallet(mQuickAccessWalletClient, mUiExecutor, mSecureSettings); + mKeyguardBottomArea.initWallet(mQuickAccessWalletController); } } @@ -1235,7 +1259,7 @@ public class NotificationPanelViewController extends PanelViewController { bypassEnabled, getUnlockedStackScrollerPadding(), computeQsExpansionFraction(), mDisplayCutoutTopInset, - shouldUseSplitNotificationShade(mFeatureFlags, mResources)); + mShouldUseSplitNotificationShade); mClockPositionAlgorithm.run(mClockPositionResult); boolean animate = mNotificationStackScrollLayoutController.isAddOrRemoveAnimationPending(); boolean animateClock = animate || mAnimateNextPositionUpdate; @@ -1419,7 +1443,7 @@ public class NotificationPanelViewController extends PanelViewController { } mStatusBar.getGutsManager().closeAndSaveGuts(true /* leavebehind */, true /* force */, true /* controls */, -1 /* x */, -1 /* y */, true /* resetMenu */); - if (animate) { + if (animate && !isFullyCollapsed()) { animateCloseQs(true /* animateAway */); } else { closeQs(); @@ -1703,6 +1727,11 @@ public class NotificationPanelViewController extends PanelViewController { } private float computeQsExpansionFraction() { + if (mQSAnimatingHiddenFromCollapsed) { + // When hiding QS from collapsed state, the expansion can sometimes temporarily + // be larger than 0 because of the timing, leading to flickers. + return 0.0f; + } return Math.min( 1f, (mQsExpansionHeight - mQsMinExpansionHeight) / (mQsMaxExpansionHeight - mQsMinExpansionHeight)); @@ -2170,7 +2199,8 @@ public class NotificationPanelViewController extends PanelViewController { // can be wrong during transitions when waiting for the keyguard to unlock top = mTransitionToFullShadeQSPosition; } else { - float notificationTop = getQSEdgePosition(); + final float notificationTop = getQSEdgePosition(); + mAmbientState.setNotificationScrimTop(notificationTop); top = (int) (isOnKeyguard() ? Math.min(qsPanelBottomY, notificationTop) : notificationTop); } @@ -2235,24 +2265,30 @@ public class NotificationPanelViewController extends PanelViewController { boolean visible) { // Fancy clipping for quick settings int radius = mScrimCornerRadius; + int statusBarClipTop = 0; + boolean clipStatusView = false; if (!mShouldUseSplitNotificationShade) { // The padding on this area is large enough that we can use a cheaper clipping strategy mKeyguardStatusAreaClipBounds.set(left, top, right, bottom); - mKeyguardStatusViewController.setClipBounds(visible - ? mKeyguardStatusAreaClipBounds : null); + clipStatusView = visible; radius = (int) MathUtils.lerp(mScreenCornerRadius, mScrimCornerRadius, Math.min(top / (float) mScrimCornerRadius, 1f)); + statusBarClipTop = top - mKeyguardStatusBar.getTop(); } if (mQs != null) { mQs.setFancyClipping(top, bottom, radius, visible); } + mKeyguardStatusViewController.setClipBounds( + clipStatusView ? mKeyguardStatusAreaClipBounds : null); mScrimController.setNotificationsBounds(left, top, right, bottom); mScrimController.setScrimCornerRadius(radius); + mKeyguardStatusBar.setTopClipping(statusBarClipTop); } private float getQSEdgePosition() { // TODO: replace StackY with unified calculation - return mAmbientState.getStackY() - mAmbientState.getScrollY(); + return Math.max(mQuickQsOffsetHeight * mAmbientState.getExpansionFraction(), + mAmbientState.getStackY() - mAmbientState.getScrollY()); } private int calculateQsBottomPosition(float qsExpansionFraction) { @@ -2363,7 +2399,6 @@ public class NotificationPanelViewController extends PanelViewController { public void setTransitionToFullShadeAmount(float pxAmount, boolean animate, long delay) { mAnimateNextNotificationBounds = animate && !mShouldUseSplitNotificationShade; mNotificationBoundsAnimationDelay = delay; - float progress = MathUtils.saturate(pxAmount / mView.getHeight()); float endPosition = 0; if (pxAmount > 0.0f) { @@ -2371,29 +2406,28 @@ public class NotificationPanelViewController extends PanelViewController { && !mMediaDataManager.hasActiveMedia()) { // No notifications are visible, let's animate to the height of qs instead if (mQs != null) { - // Let's interpolate to the header height - endPosition = mQs.getHeader().getHeight(); + // Let's interpolate to the header height instead of the top padding, + // because the toppadding is way too low because of the large clock. + // we still want to take into account the edgePosition though as that nicely + // overshoots in the stackscroller + endPosition = getQSEdgePosition() + - mNotificationStackScrollLayoutController.getTopPadding() + + mQs.getHeader().getHeight(); } } else { // Interpolating to the new bottom edge position! - endPosition = getQSEdgePosition() - mOverStretchAmount; - - // If we have media, we need to put the boundary below it, as the media header - // still uses the space during the transition. - endPosition += - mNotificationStackScrollLayoutController.getFullShadeTransitionInset(); + endPosition = getQSEdgePosition() + + mNotificationStackScrollLayoutController.getFullShadeTransitionInset(); + if (isOnKeyguard()) { + endPosition -= mLockscreenNotificationQSPadding; + } } } // Calculate the overshoot amount such that we're reaching the target after our desired // distance, but only reach it fully once we drag a full shade length. - float transitionProgress = 0; - if (endPosition != 0 && progress != 0) { - transitionProgress = Interpolators.getOvershootInterpolation(progress, - mMaxOverscrollAmountForDragDown / endPosition, - (float) mDistanceForQSFullShadeTransition / (float) mView.getHeight()); - } - mTransitioningToFullShadeProgress = transitionProgress; + mTransitioningToFullShadeProgress = Interpolators.FAST_OUT_SLOW_IN.getInterpolation( + MathUtils.saturate(pxAmount / mDistanceForQSFullShadeTransition)); int position = (int) MathUtils.lerp((float) 0, endPosition, mTransitioningToFullShadeProgress); @@ -2401,8 +2435,6 @@ public class NotificationPanelViewController extends PanelViewController { // we want at least 1 pixel otherwise the panel won't be clipped position = Math.max(1, position); } - float overStretchAmount = Math.max(position - endPosition, 0.0f); - setOverStrechAmount(overStretchAmount); mTransitionToFullShadeQSPosition = position; updateQsExpansion(); } @@ -2505,6 +2537,7 @@ public class NotificationPanelViewController extends PanelViewController { @Override public void onAnimationEnd(Animator animation) { + mQSAnimatingHiddenFromCollapsed = false; mAnimatingQS = false; notifyExpandingFinished(); mNotificationStackScrollLayoutController.resetCheckSnoozeLeavebehind(); @@ -2521,6 +2554,7 @@ public class NotificationPanelViewController extends PanelViewController { animator.start(); mQsExpansionAnimator = animator; mQsAnimatorExpand = expanding; + mQSAnimatingHiddenFromCollapsed = computeQsExpansionFraction() == 0.0f && target == 0; } /** @@ -3671,10 +3705,6 @@ public class NotificationPanelViewController extends PanelViewController { updateMaxDisplayedNotifications(true); } - public void showTransientIndication(int id) { - mKeyguardIndicationController.showTransientIndication(id); - } - public void setAlpha(float alpha) { mView.setAlpha(alpha); } @@ -4260,7 +4290,8 @@ public class NotificationPanelViewController extends PanelViewController { private class OnAttachStateChangeListener implements View.OnAttachStateChangeListener { @Override public void onViewAttachedToWindow(View v) { - FragmentHostManager.get(mView).addTagListener(QS.TAG, mFragmentListener); + mFragmentService.getFragmentHostManager(mView) + .addTagListener(QS.TAG, mFragmentListener); mStatusBarStateController.addCallback(mStatusBarStateListener); mConfigurationController.addCallback(mConfigurationListener); mUpdateMonitor.registerCallback(mKeyguardUpdateCallback); @@ -4274,7 +4305,8 @@ public class NotificationPanelViewController extends PanelViewController { @Override public void onViewDetachedFromWindow(View v) { - FragmentHostManager.get(mView).removeTagListener(QS.TAG, mFragmentListener); + mFragmentService.getFragmentHostManager(mView) + .removeTagListener(QS.TAG, mFragmentListener); mStatusBarStateController.removeCallback(mStatusBarStateListener); mConfigurationController.removeCallback(mConfigurationListener); mUpdateMonitor.removeCallback(mKeyguardUpdateCallback); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java index ae018ba4fe76..52f9aca82783 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java @@ -152,6 +152,16 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW mCallbacks.add(new WeakReference<StatusBarWindowCallback>(callback)); } + @Override + public void unregisterCallback(StatusBarWindowCallback callback) { + for (int i = 0; i < mCallbacks.size(); i++) { + if (mCallbacks.get(i).get() == callback) { + mCallbacks.remove(i); + return; + } + } + } + /** * Register a listener to monitor scrims visibility * @param listener A listener to monitor scrims visibility diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 7c63763b43c3..b92f7c034b57 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -548,8 +548,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump */ public void setNotificationsBounds(float left, float top, float right, float bottom) { if (mClipsQsScrim) { - // "top - 1" to have 1 px of scrims overlap, see: b/186644628 - mNotificationsScrim.setDrawableBounds(left, top - 1, right, bottom); + // notification scrim's rounded corners are anti-aliased, but clipping of the QS scrim + // can't be and it's causing jagged corners. That's why notification scrim needs + // to overlap QS scrim by one pixel - both vertically (top - 1) and + // horizontally (left - 1 and right + 1), see: b/186644628 + mNotificationsScrim.setDrawableBounds(left - 1, top - 1, right + 1, bottom); mScrimBehind.setBottomEdgePosition((int) top); } else { mNotificationsScrim.setDrawableBounds(left, top, right, bottom); @@ -883,7 +886,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } private float getInterpolatedFraction() { - return Interpolators.getNotificationScrimAlpha(mPanelExpansion); + return Interpolators.getNotificationScrimAlpha(mPanelExpansion, false /* notification */); } private void setScrimAlpha(ScrimView scrim, float alpha) { 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 eec896ae5830..c27497e43400 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -73,9 +73,9 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Point; import android.graphics.PointF; -import android.graphics.RectF; import android.media.AudioAttributes; import android.metrics.LogMaker; import android.net.Uri; @@ -150,6 +150,7 @@ import com.android.systemui.accessibility.floatingmenu.AccessibilityFloatingMenu import com.android.systemui.animation.ActivityLaunchAnimator; import com.android.systemui.animation.DelegateLaunchAnimatorController; import com.android.systemui.assist.AssistManager; +import com.android.systemui.biometrics.AuthRippleController; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.camera.CameraIntents; import com.android.systemui.charging.WirelessChargingAnimation; @@ -326,9 +327,15 @@ public class StatusBar extends SystemUI implements DemoMode, public static final int FADE_KEYGUARD_DURATION = 300; public static final int FADE_KEYGUARD_DURATION_PULSING = 96; + public static final long[] CAMERA_LAUNCH_GESTURE_VIBRATION_TIMINGS = + new long[]{20, 20, 20, 20, 100, 20}; + public static final int[] CAMERA_LAUNCH_GESTURE_VIBRATION_AMPLITUDES = + new int[]{39, 82, 139, 213, 0, 127}; - /** If true, the system is in the half-boot-to-decryption-screen state. - * Prudently disable QS and notifications. */ + /** + * If true, the system is in the half-boot-to-decryption-screen state. + * Prudently disable QS and notifications. + */ public static final boolean ONLY_CORE_APPS; /** If true, the lockscreen will show a distinct wallpaper */ @@ -380,6 +387,7 @@ public class StatusBar extends SystemUI implements DemoMode, protected NotificationShadeWindowView mNotificationShadeWindowView; protected StatusBarWindowView mPhoneStatusBarWindow; protected PhoneStatusBarView mStatusBarView; + private AuthRippleController mAuthRippleController; private int mStatusBarWindowState = WINDOW_STATE_SHOWING; protected NotificationShadeWindowController mNotificationShadeWindowController; protected StatusBarWindowController mStatusBarWindowController; @@ -456,6 +464,7 @@ public class StatusBar extends SystemUI implements DemoMode, protected final NotificationInterruptStateProvider mNotificationInterruptStateProvider; private final BrightnessSlider.Factory mBrightnessSliderFactory; private final FeatureFlags mFeatureFlags; + private final KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; private final List<ExpansionChangedListener> mExpansionChangedListeners; @@ -600,7 +609,7 @@ public class StatusBar extends SystemUI implements DemoMode, private int mLastCameraLaunchSource; protected PowerManager.WakeLock mGestureWakeLock; private Vibrator mVibrator; - private long[] mCameraLaunchGestureVibePattern; + private VibrationEffect mCameraLaunchGestureVibrationEffect; private final int[] mTmpInt2 = new int[2]; @@ -877,6 +886,8 @@ public class StatusBar extends SystemUI implements DemoMode, mAnimationScheduler = animationScheduler; mStatusBarLocationPublisher = locationPublisher; mFeatureFlags = featureFlags; + mKeyguardUnlockAnimationController = keyguardUnlockAnimationController; + mLockscreenShadeTransitionController = lockscreenShadeTransitionController; lockscreenShadeTransitionController.setStatusbar(this); @@ -1311,12 +1322,8 @@ public class StatusBar extends SystemUI implements DemoMode, mGestureWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "GestureWakeLock"); mVibrator = mContext.getSystemService(Vibrator.class); - int[] pattern = mContext.getResources().getIntArray( - R.array.config_cameraLaunchGestureVibePattern); - mCameraLaunchGestureVibePattern = new long[pattern.length]; - for (int i = 0; i < pattern.length; i++) { - mCameraLaunchGestureVibePattern[i] = pattern[i]; - } + mCameraLaunchGestureVibrationEffect = getCameraGestureVibrationEffect( + mVibrator, context.getResources()); // receive broadcasts registerBroadcastReceiver(); @@ -1365,7 +1372,8 @@ public class StatusBar extends SystemUI implements DemoMode, // are already animating the keyguard dismiss (since we will need to either finish or cancel // the animation). if (trackingTouch - || mKeyguardViewMediator.isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe()) { + || mKeyguardViewMediator.isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe() + || mKeyguardUnlockAnimationController.isUnlockingWithSmartSpaceTransition()) { mKeyguardStateController.notifyKeyguardDismissAmountChanged( 1f - expansion, trackingTouch); } @@ -1556,7 +1564,9 @@ public class StatusBar extends SystemUI implements DemoMode, mPhoneStatusBarWindow = mSuperStatusBarViewFactory.getStatusBarWindowView(); mNotificationPanelViewController = statusBarComponent.getNotificationPanelViewController(); statusBarComponent.getLockIconViewController().init(); - statusBarComponent.getAuthRippleController().init(); + + mAuthRippleController = statusBarComponent.getAuthRippleController(); + mAuthRippleController.init(); } protected void startKeyguard() { @@ -2801,7 +2811,7 @@ public class StatusBar extends SystemUI implements DemoMode, int[] result = new int[]{ActivityManager.START_CANCELED}; mActivityLaunchAnimator.startIntentWithAnimation(animController, - areLaunchAnimationsEnabled(), (adapter) -> { + areLaunchAnimationsEnabled(), intent.getPackage(), (adapter) -> { ActivityOptions options = new ActivityOptions( getActivityOptions(mDisplayId, adapter)); options.setDisallowEnterPictureInPictureWhileLaunching( @@ -3609,10 +3619,16 @@ public class StatusBar extends SystemUI implements DemoMode, boolean visibleNotOccluded = mStatusBarKeyguardViewManager.isShowing() && !mStatusBarKeyguardViewManager.isOccluded(); + // If we're dozing and we'll be animating the screen off, the keyguard isn't currently + // visible but will be shortly for the animation, so we should proceed as if it's visible. + boolean visibleNotOccludedOrWillBe = + visibleNotOccluded || (mDozing && mDozeParameters.shouldControlUnlockedScreenOff()); + boolean wakeAndUnlock = mBiometricUnlockController.getMode() == BiometricUnlockController.MODE_WAKE_AND_UNLOCK; boolean animate = (!mDozing && mDozeServiceHost.shouldAnimateWakeup() && !wakeAndUnlock) - || (mDozing && mDozeServiceHost.shouldAnimateScreenOff() && visibleNotOccluded); + || (mDozing && mDozeServiceHost.shouldAnimateScreenOff() + && visibleNotOccludedOrWillBe); mNotificationPanelViewController.setDozing(mDozing, animate, mWakeUpTouchLocation); updateQsExpansionEnabled(); @@ -3791,7 +3807,8 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onDozeAmountChanged(float linear, float eased) { - if (mFeatureFlags.useNewLockscreenAnimations()) { + if (mFeatureFlags.useNewLockscreenAnimations() + && !mCircleRevealAnimator.isRunning()) { mLightRevealScrim.setRevealAmount(1f - linear); } } @@ -3828,6 +3845,23 @@ public class StatusBar extends SystemUI implements DemoMode, Trace.endSection(); } + /** + * Update the parameters for the dozing circle reveal that animates when the user authenticates + * from AOD using the fingerprint sensor. + */ + public void updateCircleReveal() { + final PointF fpLocation = mAuthRippleController.getFingerprintSensorLocation(); + if (fpLocation != null) { + mCircleReveal = + new CircleReveal( + fpLocation.x, + fpLocation.y, + 0, + Math.max(Math.max(fpLocation.x, getDisplayWidth() - fpLocation.x), + Math.max(fpLocation.y, getDisplayHeight() - fpLocation.y))); + } + } + private void startCircleReveal() { mLightRevealScrim.setRevealEffect(mCircleReveal); mCircleRevealAnimator.cancel(); @@ -3840,7 +3874,6 @@ public class StatusBar extends SystemUI implements DemoMode, private boolean shouldShowCircleReveal() { return mCircleReveal != null && !mCircleRevealAnimator.isRunning() - && mKeyguardUpdateMonitor.isUdfpsEnrolled() && mBiometricUnlockController.getBiometricType() == FINGERPRINT; } @@ -4062,12 +4095,37 @@ public class StatusBar extends SystemUI implements DemoMode, private void vibrateForCameraGesture() { // Make sure to pass -1 for repeat so VibratorService doesn't stop us when going to sleep. - mVibrator.vibrate(mCameraLaunchGestureVibePattern, -1 /* repeat */); + mVibrator.vibrate(mCameraLaunchGestureVibrationEffect); + } + + private static VibrationEffect getCameraGestureVibrationEffect(Vibrator vibrator, + Resources resources) { + if (vibrator.areAllPrimitivesSupported( + VibrationEffect.Composition.PRIMITIVE_QUICK_RISE, + VibrationEffect.Composition.PRIMITIVE_CLICK)) { + return VibrationEffect.startComposition() + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_QUICK_RISE) + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1, 50) + .compose(); + } + if (vibrator.hasAmplitudeControl()) { + return VibrationEffect.createWaveform( + CAMERA_LAUNCH_GESTURE_VIBRATION_TIMINGS, + CAMERA_LAUNCH_GESTURE_VIBRATION_AMPLITUDES, + /* repeat= */ -1); + } + + int[] pattern = resources.getIntArray(R.array.config_cameraLaunchGestureVibePattern); + long[] timings = new long[pattern.length]; + for (int i = 0; i < pattern.length; i++) { + timings[i] = pattern[i]; + } + return VibrationEffect.createWaveform(timings, /* repeat= */ -1); } /** * @return true if the screen is currently fully off, i.e. has finished turning off and has - * since not started turning on. + * since not started turning on. */ public boolean isScreenFullyOff() { return mScreenLifecycle.getScreenState() == ScreenLifecycle.SCREEN_OFF; @@ -4278,15 +4336,6 @@ public class StatusBar extends SystemUI implements DemoMode, updateScrimController(); } - /** - * Set the location of the sensor on UDFPS if existent. - */ - public void setSensorRect(RectF rect) { - final float startRadius = (rect.right - rect.left) / 2f; - mCircleReveal = new CircleReveal(rect.centerX(), rect.centerY(), - startRadius, rect.centerY() - startRadius); - } - @VisibleForTesting public void updateScrimController() { Trace.beginSection("StatusBar#updateScrimController"); @@ -4341,6 +4390,7 @@ public class StatusBar extends SystemUI implements DemoMode, } else { mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback); } + updateLightRevealScrimVisibility(); Trace.endSection(); } @@ -4565,7 +4615,7 @@ public class StatusBar extends SystemUI implements DemoMode, animationController, this, intent.isActivity()) : null; mActivityLaunchAnimator.startPendingIntentWithAnimation( - controller, areLaunchAnimationsEnabled(), + controller, areLaunchAnimationsEnabled(), intent.getCreatorPackage(), (animationAdapter) -> intent.sendAndReturnResult(null, 0, null, null, null, null, getActivityOptions(mDisplayId, animationAdapter))); } catch (PendingIntent.CanceledException e) { @@ -4773,6 +4823,11 @@ public class StatusBar extends SystemUI implements DemoMode, return; } + if (mDozeServiceHost.isPulsing()) { + mLightRevealScrim.setVisibility(View.GONE); + return; + } + if (mFeatureFlags.useNewLockscreenAnimations() && (mDozeParameters.getAlwaysOn() || mDozeParameters.isQuickPickupEnabled())) { mLightRevealScrim.setVisibility(View.VISIBLE); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt index 8befe800b4e1..edcf261115d2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt @@ -23,6 +23,8 @@ import android.util.Pair import android.view.DisplayCutout import android.view.View.LAYOUT_DIRECTION_RTL import android.view.WindowManager +import android.view.WindowMetrics +import androidx.annotation.VisibleForTesting import com.android.systemui.Dumpable import com.android.systemui.R import com.android.systemui.dagger.SysUISingleton @@ -118,17 +120,8 @@ class StatusBarContentInsetsProvider @Inject constructor( val chipWidth = rotatedResources.getDimensionPixelSize( R.dimen.ongoing_appops_chip_max_width) - return if (context.resources.configuration.layoutDirection == LAYOUT_DIRECTION_RTL) { - Rect(insets.left - dotWidth, - insets.top, - insets.left + chipWidth, - insets.bottom) - } else { - Rect(insets.right - chipWidth, - insets.top, - insets.right + dotWidth, - insets.bottom) - } + val isRtl = context.resources.configuration.layoutDirection == LAYOUT_DIRECTION_RTL + return getPrivacyChipBoundingRectForInsets(insets, dotWidth, chipWidth, isRtl) } /** @@ -139,8 +132,7 @@ class StatusBarContentInsetsProvider @Inject constructor( var insets = insetsByCorner[rotation] if (insets == null) { val rotatedResources = RotationUtils.getResourcesForRotation(rotation, context) - insets = getCalculatedInsetsForRotation(rotation, rotatedResources) - insetsByCorner[rotation] = insets + insets = getAndSetInsetsForRotation(rotation, rotatedResources) } return insets @@ -157,13 +149,19 @@ class StatusBarContentInsetsProvider @Inject constructor( } private fun getCalculatedInsetsForRotation( - @Rotation rotation: Int, + @Rotation targetRotation: Int, rotatedResources: Resources ): Rect { val dc = context.display.cutout + val currentRotation = RotationUtils.getExactRotation(context) return calculateInsetsForRotationWithRotatedResources( - rotation, rotatedResources, dc, windowManager, context) + currentRotation, + targetRotation, + dc, + windowManager.maximumWindowMetrics, + rotatedResources.getDimensionPixelSize(R.dimen.status_bar_height), + rotatedResources.getDimensionPixelSize(R.dimen.rounded_corner_content_padding)) } override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) { @@ -179,8 +177,8 @@ interface StatusBarContentInsetsChangedListener { private const val TAG = "StatusBarInsetsProvider" -private fun getRotationZeroDisplayBounds(wm: WindowManager, @Rotation exactRotation: Int): Rect { - val bounds = wm.maximumWindowMetrics.bounds +private fun getRotationZeroDisplayBounds(wm: WindowMetrics, @Rotation exactRotation: Int): Rect { + val bounds = wm.bounds if (exactRotation == ROTATION_NONE || exactRotation == ROTATION_UPSIDE_DOWN) { return bounds @@ -190,9 +188,24 @@ private fun getRotationZeroDisplayBounds(wm: WindowManager, @Rotation exactRotat return Rect(0, 0, bounds.bottom, bounds.right) } -private fun getCurrentDisplayBounds(wm: WindowManager): Rect { - val bounds = wm.maximumWindowMetrics.bounds - return bounds +@VisibleForTesting +fun getPrivacyChipBoundingRectForInsets( + contentRect: Rect, + dotWidth: Int, + chipWidth: Int, + isRtl: Boolean +): Rect { + return if (isRtl) { + Rect(contentRect.left - dotWidth, + contentRect.top, + contentRect.left + chipWidth, + contentRect.bottom) + } else { + Rect(contentRect.right - chipWidth, + contentRect.top, + contentRect.right + dotWidth, + contentRect.bottom) + } } /** @@ -206,41 +219,32 @@ private fun getCurrentDisplayBounds(wm: WindowManager): Rect { * @see [RotationUtils#getResourcesForRotation] */ fun calculateInsetsForRotationWithRotatedResources( + @Rotation currentRotation: Int, @Rotation targetRotation: Int, - rotatedResources: Resources, displayCutout: DisplayCutout?, - windowmanager: WindowManager, - context: Context + windowMetrics: WindowMetrics, + statusBarHeight: Int, + roundedCornerPadding: Int ): Rect { - val rtl = rotatedResources.configuration.layoutDirection == LAYOUT_DIRECTION_RTL - - val exactRotation = RotationUtils.getExactRotation(context) - val height = rotatedResources.getDimensionPixelSize(R.dimen.status_bar_height) - /* TODO: Check if this is ever used for devices with no rounded corners - val paddingStart = rotatedResources.getDimensionPixelSize(R.dimen.status_bar_padding_start) - val paddingEnd = rotatedResources.getDimensionPixelSize(R.dimen.status_bar_padding_end) - val left = if (rtl) paddingEnd else paddingStart - val right = if(rtl) paddingStart else paddingEnd + val left = if (isRtl) paddingEnd else paddingStart + val right = if (isRtl) paddingStart else paddingEnd */ - val roundedCornerPadding = rotatedResources.getDimensionPixelSize( - R.dimen.rounded_corner_content_padding) - - val rotZeroBounds = getRotationZeroDisplayBounds(windowmanager, exactRotation) - val currentBounds = getCurrentDisplayBounds(windowmanager) + val rotZeroBounds = getRotationZeroDisplayBounds(windowMetrics, currentRotation) + val currentBounds = windowMetrics.bounds val sbLeftRight = getStatusBarLeftRight( displayCutout, - height, + statusBarHeight, rotZeroBounds.right, rotZeroBounds.bottom, currentBounds.width(), currentBounds.height(), roundedCornerPadding, targetRotation, - exactRotation) + currentRotation) return sbLeftRight } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java index ab58aae6857e..5cd4e13bdcce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java @@ -437,7 +437,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit mActivityLaunchAnimator.startPendingIntentWithAnimation(animationController, !wasOccluded && mStatusBar.areLaunchAnimationsEnabled(), - (adapter) -> { + intent.getCreatorPackage(), (adapter) -> { long eventTime = row.getAndResetLastActionUpTime(); Bundle options = eventTime > 0 ? getActivityOptions( @@ -469,6 +469,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit mActivityLaunchAnimator.startIntentWithAnimation( animationController, mStatusBar.areLaunchAnimationsEnabled(), + intent.getPackage(), (adapter) -> TaskStackBuilder.create(mContext) .addNextIntentWithParentStack(intent) .startActivities(getActivityOptions( @@ -499,7 +500,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit true /* isActivityIntent */); mActivityLaunchAnimator.startIntentWithAnimation(animationController, - mStatusBar.areLaunchAnimationsEnabled(), + mStatusBar.areLaunchAnimationsEnabled(), intent.getPackage(), (adapter) -> tsb.startActivities( getActivityOptions(mStatusBar.getDisplayId(), adapter), UserHandle.CURRENT)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java index ebf2465f3bf3..d3953df8c8c0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -23,7 +23,6 @@ import android.util.ArraySet; import android.util.Log; import com.android.settingslib.mobile.TelephonyIcons; -import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.statusbar.policy.NetworkController; @@ -63,6 +62,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba private final SecurityController mSecurityController; private final Handler mHandler = Handler.getMain(); private final CarrierConfigTracker mCarrierConfigTracker; + private final TunerService mTunerService; private boolean mHideAirplane; private boolean mHideMobile; @@ -83,9 +83,16 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba @Inject public StatusBarSignalPolicy(Context context, StatusBarIconController iconController, - CarrierConfigTracker carrierConfigTracker) { + CarrierConfigTracker carrierConfigTracker, NetworkController networkController, + SecurityController securityController, TunerService tunerService) { mContext = context; + mIconController = iconController; + mCarrierConfigTracker = carrierConfigTracker; + mNetworkController = networkController; + mSecurityController = securityController; + mTunerService = tunerService; + mSlotAirplane = mContext.getString(com.android.internal.R.string.status_bar_airplane); mSlotMobile = mContext.getString(com.android.internal.R.string.status_bar_mobile); mSlotWifi = mContext.getString(com.android.internal.R.string.status_bar_wifi); @@ -96,18 +103,14 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba mContext.getString(com.android.internal.R.string.status_bar_call_strength); mActivityEnabled = mContext.getResources().getBoolean(R.bool.config_showActivity); - mIconController = iconController; - mCarrierConfigTracker = carrierConfigTracker; - mNetworkController = Dependency.get(NetworkController.class); - mSecurityController = Dependency.get(SecurityController.class); - Dependency.get(TunerService.class).addTunable(this, StatusBarIconController.ICON_HIDE_LIST); + tunerService.addTunable(this, StatusBarIconController.ICON_HIDE_LIST); mNetworkController.addCallback(this); mSecurityController.addCallback(this); } public void destroy() { - Dependency.get(TunerService.class).removeTunable(this); + mTunerService.removeTunable(this); mNetworkController.removeCallback(this); mSecurityController.removeCallback(this); } @@ -172,7 +175,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba && !mIsAirplaneMode) { newState.visible = true; newState.resId = R.drawable.ic_qs_no_internet_unavailable; - } else if (mWifiIconState.noValidatedNetwork && !mWifiIconState.noNetworksAvailable + } else if (mWifiIconState.noDefaultNetwork && !mWifiIconState.noNetworksAvailable && (!mIsAirplaneMode || (mIsAirplaneMode && mIsWifiEnabled))) { newState.visible = true; newState.resId = R.drawable.ic_qs_no_internet_available; @@ -377,7 +380,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba if (noDefaultNetwork && noNetworksAvailable && !mIsAirplaneMode) { newState.visible = true; newState.resId = R.drawable.ic_qs_no_internet_unavailable; - } else if (noValidatedNetwork && !noNetworksAvailable + } else if (noDefaultNetwork && !noNetworksAvailable && (!mIsAirplaneMode || (mIsAirplaneMode && mIsWifiEnabled))) { newState.visible = true; newState.resId = R.drawable.ic_qs_no_internet_available; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainView.java new file mode 100644 index 000000000000..52e0e8a7a0cb --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainView.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.android.systemui.R; +import com.android.wm.shell.animation.Interpolators; + +/** + * View to show a toast-like popup on the notification shade and quick settings. + */ +public class TapAgainView extends TextView { + private TextView mTextView; + + public TapAgainView( + @NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + updateColor(); + } + + void updateColor() { + int textColor = getResources().getColor(R.color.notif_pill_text, mContext.getTheme()); + setTextColor(textColor); + setBackground(getResources().getDrawable(R.drawable.rounded_bg_full, mContext.getTheme())); + } + + /** Make the view visible. */ + public void animateIn() { + int yTranslation = mContext.getResources().getDimensionPixelSize( + R.dimen.keyguard_indication_y_translation); + + AnimatorSet animatorSet = new AnimatorSet(); + ObjectAnimator fadeIn = ObjectAnimator.ofFloat(this, View.ALPHA, 1f); + fadeIn.setStartDelay(150); // From KeyguardIndicationTextView#getFadeInDelay + fadeIn.setDuration(317); // From KeyguardIndicationTextView#getFadeInDuration + fadeIn.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); + + Animator yTranslate = + ObjectAnimator.ofFloat(this, View.TRANSLATION_Y, yTranslation, 0); + yTranslate.setDuration(600); // From KeyguardIndicationTextView#getYInDuration + yTranslate.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationCancel(Animator animation) { + setTranslationY(0); + } + }); + animatorSet.playTogether(yTranslate, fadeIn); + animatorSet.start(); + setVisibility(View.VISIBLE); + } + + /** Make the view gone. */ + public void animateOut() { + long fadeOutDuration = 167L; // From KeyguardIndicationTextView#getFadeOutDuration + int yTranslation = mContext.getResources().getDimensionPixelSize( + com.android.systemui.R.dimen.keyguard_indication_y_translation); + + AnimatorSet animatorSet = new AnimatorSet(); + ObjectAnimator fadeOut = ObjectAnimator.ofFloat(this, View.ALPHA, 0f); + fadeOut.setDuration(fadeOutDuration); + fadeOut.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN); + + Animator yTranslate = + ObjectAnimator.ofFloat(this, View.TRANSLATION_Y, 0, -yTranslation); + yTranslate.setDuration(fadeOutDuration); + animatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + setVisibility(GONE); + } + + @Override + public void onAnimationCancel(Animator animation) { + setVisibility(GONE); + } + }); + animatorSet.playTogether(yTranslate, fadeOut); + animatorSet.start(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainViewController.java new file mode 100644 index 000000000000..0c5502bac8fc --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TapAgainViewController.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone; + +import static com.android.systemui.classifier.FalsingModule.DOUBLE_TAP_TIMEOUT_MS; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; +import com.android.systemui.statusbar.policy.ConfigurationController; +import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; +import com.android.systemui.util.ViewController; +import com.android.systemui.util.concurrency.DelayableExecutor; + +import javax.inject.Inject; +import javax.inject.Named; + +/** + * Controller for {@link TapAgainView}. + */ +@StatusBarComponent.StatusBarScope +public class TapAgainViewController extends ViewController<TapAgainView> { + private final DelayableExecutor mDelayableExecutor; + private final ConfigurationController mConfigurationController; + private final long mDoubleTapTimeMs; + + private Runnable mHideCanceler; + + @VisibleForTesting + final ConfigurationListener mConfigurationListener = new ConfigurationListener() { + @Override + public void onOverlayChanged() { + mView.updateColor(); + } + + @Override + public void onUiModeChanged() { + mView.updateColor(); + } + + @Override + public void onThemeChanged() { + mView.updateColor(); + } + }; + + @Inject + protected TapAgainViewController(TapAgainView view, + @Main DelayableExecutor delayableExecutor, + ConfigurationController configurationController, + @Named(DOUBLE_TAP_TIMEOUT_MS) long doubleTapTimeMs) { + super(view); + mDelayableExecutor = delayableExecutor; + mConfigurationController = configurationController; + mDoubleTapTimeMs = doubleTapTimeMs; + } + + @Override + protected void onViewAttached() { + mConfigurationController.addCallback(mConfigurationListener); + } + + @Override + protected void onViewDetached() { + mConfigurationController.removeCallback(mConfigurationListener); + } + + /** Shows the associated view, possibly animating it. */ + public void show() { + if (mHideCanceler != null) { + mHideCanceler.run(); + } + mView.animateIn(); + mHideCanceler = mDelayableExecutor.executeDelayed(this::hide, mDoubleTapTimeMs); + } + + /** Hides the associated view, possibly animating it. */ + public void hide() { + mHideCanceler = null; + mView.animateOut(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java index 008c0aea7ce9..27d71edd5e8a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java @@ -23,6 +23,7 @@ import com.android.systemui.R; import com.android.systemui.biometrics.AuthRippleView; import com.android.systemui.statusbar.phone.NotificationPanelView; import com.android.systemui.statusbar.phone.NotificationShadeWindowView; +import com.android.systemui.statusbar.phone.TapAgainView; import dagger.Module; import dagger.Provides; @@ -53,4 +54,11 @@ public abstract class StatusBarViewModule { NotificationShadeWindowView notificationShadeWindowView) { return notificationShadeWindowView.findViewById(R.id.auth_ripple); } + + /** */ + @Provides + @StatusBarComponent.StatusBarScope + public static TapAgainView getTapAgainView(NotificationPanelView npv) { + return npv.getTapAgainView(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt index 9bf13b8dc572..7dccf01dcbc6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt @@ -150,9 +150,11 @@ class OngoingCallController @Inject constructor( val currentChipView = chipView val timeView = - currentChipView?.findViewById<Chronometer>(R.id.ongoing_call_chip_time) + currentChipView?.findViewById<Chronometer>(R.id.ongoing_call_chip_time) + val backgroundView = + currentChipView?.findViewById<View>(R.id.ongoing_call_chip_background) - if (currentChipView != null && timeView != null) { + if (currentChipView != null && timeView != null && backgroundView != null) { timeView.base = currentOngoingCallInfo.callStartTime - System.currentTimeMillis() + systemClock.elapsedRealtime() @@ -162,7 +164,7 @@ class OngoingCallController @Inject constructor( logger.logChipClicked() activityStarter.postStartActivityDismissingKeyguard( currentOngoingCallInfo.intent, 0, - ActivityLaunchAnimator.Controller.fromView(it)) + ActivityLaunchAnimator.Controller.fromView(backgroundView)) } setUpUidObserver(currentOngoingCallInfo) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateController.java index e7201f87b320..af7bf9500bf3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateController.java @@ -50,6 +50,13 @@ public interface KeyguardStateController extends CallbackController<Callback> { boolean canDismissLockScreen(); /** + * Whether we can currently perform the shared element SmartSpace transition. This is true if + * we're on the lockscreen, it can be dismissed with a swipe, and the Launcher is underneath the + * keyguard and displaying a SmartSpace that it has registered with System UI. + */ + boolean canPerformSmartSpaceTransition(); + + /** * If the device has PIN/pattern/password or a lock screen at all. */ boolean isMethodSecure(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java index e69c1f2573b7..0945a3f884d6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java @@ -32,6 +32,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.Dumpable; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.shared.system.smartspace.SmartspaceTransitionController; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -53,6 +54,7 @@ public class KeyguardStateControllerImpl implements KeyguardStateController, Dum private final LockPatternUtils mLockPatternUtils; private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback = new UpdateMonitorCallback(); + private final SmartspaceTransitionController mSmartspaceTransitionController; private boolean mCanDismissLockScreen; private boolean mShowing; @@ -96,10 +98,12 @@ public class KeyguardStateControllerImpl implements KeyguardStateController, Dum */ @Inject public KeyguardStateControllerImpl(Context context, - KeyguardUpdateMonitor keyguardUpdateMonitor, LockPatternUtils lockPatternUtils) { + KeyguardUpdateMonitor keyguardUpdateMonitor, LockPatternUtils lockPatternUtils, + SmartspaceTransitionController smartspaceTransitionController) { mKeyguardUpdateMonitor = keyguardUpdateMonitor; mLockPatternUtils = lockPatternUtils; mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback); + mSmartspaceTransitionController = smartspaceTransitionController; update(true /* updateAlways */); if (Build.IS_DEBUGGABLE && DEBUG_AUTH_WITH_ADB) { @@ -158,6 +162,11 @@ public class KeyguardStateControllerImpl implements KeyguardStateController, Dum mShowing = showing; mOccluded = occluded; notifyKeyguardChanged(); + + // Update the dismiss amount to the full 0f/1f if we explicitly show or hide the keyguard. + // Otherwise, the dismiss amount could be left at a random value if we show/hide during a + // dismiss gesture, canceling the gesture. + notifyKeyguardDismissAmountChanged(showing ? 0f : 1f, false); } private void notifyKeyguardChanged() { @@ -228,6 +237,12 @@ public class KeyguardStateControllerImpl implements KeyguardStateController, Dum } @Override + public boolean canPerformSmartSpaceTransition() { + return canDismissLockScreen() + && mSmartspaceTransitionController.isSmartspaceTransitionPossible(); + } + + @Override public boolean isFaceAuthEnabled() { return mFaceAuthEnabled; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 07e9fed13499..4ab07af92006 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -1023,6 +1023,11 @@ public class NetworkControllerImpl extends BroadcastReceiver mValidatedTransports.clear(); if (mLastDefaultNetworkCapabilities != null) { for (int transportType : mLastDefaultNetworkCapabilities.getTransportTypes()) { + if (transportType != NetworkCapabilities.TRANSPORT_CELLULAR + && transportType != NetworkCapabilities.TRANSPORT_WIFI + && transportType != NetworkCapabilities.TRANSPORT_ETHERNET) { + continue; + } if (transportType == NetworkCapabilities.TRANSPORT_CELLULAR && Utils.tryGetWifiInfoForVcn(mLastDefaultNetworkCapabilities) != null) { mConnectedTransports.set(NetworkCapabilities.TRANSPORT_WIFI); @@ -1045,11 +1050,15 @@ public class NetworkControllerImpl extends BroadcastReceiver Log.d(TAG, "updateConnectivity: mValidatedTransports=" + mValidatedTransports); } - mInetCondition = !mValidatedTransports.isEmpty(); + mInetCondition = mValidatedTransports.get(NetworkCapabilities.TRANSPORT_CELLULAR) + || mValidatedTransports.get(NetworkCapabilities.TRANSPORT_WIFI) + || mValidatedTransports.get(NetworkCapabilities.TRANSPORT_ETHERNET); pushConnectivityToSignals(); if (mProviderModel) { - mNoDefaultNetwork = mConnectedTransports.isEmpty(); + mNoDefaultNetwork = !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_CELLULAR) + && !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_WIFI) + && !mConnectedTransports.get(NetworkCapabilities.TRANSPORT_ETHERNET); mCallbackHandler.setConnectivityStatus(mNoDefaultNetwork, !mInetCondition, mNoNetworksAvailable); for (int i = 0; i < mMobileSignalControllers.size(); i++) { diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java index 4b4a428e080b..4be4b11f3d37 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java @@ -103,11 +103,11 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { private final boolean mIsMonetEnabled; private UserTracker mUserTracker; private DeviceProvisionedController mDeviceProvisionedController; - private WallpaperColors mSystemColors; + private WallpaperColors mCurrentColors; private WallpaperManager mWallpaperManager; // If fabricated overlays were already created for the current theme. private boolean mNeedsOverlayCreation; - // Dominant olor extracted from wallpaper, NOT the color used on the overlay + // Dominant color extracted from wallpaper, NOT the color used on the overlay protected int mMainWallpaperColor = Color.TRANSPARENT; // Accent color extracted from wallpaper, NOT the color used on the overlay protected int mWallpaperAccentColor = Color.TRANSPARENT; @@ -162,10 +162,17 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { handleWallpaperColors(wallpaperColors, which); }; + private int getLatestWallpaperType() { + return mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_LOCK) + > mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_SYSTEM) + ? WallpaperManager.FLAG_LOCK : WallpaperManager.FLAG_SYSTEM; + } + private void handleWallpaperColors(WallpaperColors wallpaperColors, int flags) { - final boolean hadWallpaperColors = mSystemColors != null; - if ((flags & WallpaperManager.FLAG_SYSTEM) != 0) { - mSystemColors = wallpaperColors; + final boolean hadWallpaperColors = mCurrentColors != null; + int latestWallpaperType = getLatestWallpaperType(); + if ((flags & latestWallpaperType) != 0) { + mCurrentColors = wallpaperColors; if (DEBUG) Log.d(TAG, "got new colors: " + wallpaperColors + " where: " + flags); } @@ -183,7 +190,7 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { } else { if (DEBUG) { Log.i(TAG, "During user setup, but allowing first color event: had? " - + hadWallpaperColors + " has? " + (mSystemColors != null)); + + hadWallpaperColors + " has? " + (mCurrentColors != null)); } } } @@ -198,7 +205,8 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { if (!TextUtils.isEmpty(overlayPackageJson)) { try { JSONObject jsonObject = new JSONObject(overlayPackageJson); - if (!COLOR_SOURCE_PRESET.equals(jsonObject.optString(OVERLAY_COLOR_SOURCE))) { + if (!COLOR_SOURCE_PRESET.equals(jsonObject.optString(OVERLAY_COLOR_SOURCE)) + && ((flags & latestWallpaperType) != 0)) { mSkipSettingChange = true; if (jsonObject.has(OVERLAY_CATEGORY_ACCENT_COLOR) || jsonObject.has( OVERLAY_CATEGORY_SYSTEM_PALETTE)) { @@ -314,10 +322,10 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { // Upon boot, make sure we have the most up to date colors Runnable updateColors = () -> { WallpaperColors systemColor = mWallpaperManager.getWallpaperColors( - WallpaperManager.FLAG_SYSTEM); + getLatestWallpaperType()); mMainExecutor.execute(() -> { if (DEBUG) Log.d(TAG, "Boot colors: " + systemColor); - mSystemColors = systemColor; + mCurrentColors = systemColor; reevaluateSystemTheme(false /* forceReload */); }); }; @@ -348,7 +356,7 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { } private void reevaluateSystemTheme(boolean forceReload) { - final WallpaperColors currentColors = mSystemColors; + final WallpaperColors currentColors = mCurrentColors; final int mainColor; final int accentCandidate; if (currentColors == null) { @@ -506,7 +514,7 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { @Override public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) { - pw.println("mSystemColors=" + mSystemColors); + pw.println("mSystemColors=" + mCurrentColors); pw.println("mMainWallpaperColor=" + Integer.toHexString(mMainWallpaperColor)); pw.println("mWallpaperAccentColor=" + Integer.toHexString(mWallpaperAccentColor)); pw.println("mSecondaryOverlay=" + mSecondaryOverlay); diff --git a/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java b/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java index 4284148c38a8..c5e35a497956 100644 --- a/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java +++ b/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java @@ -22,16 +22,19 @@ import android.annotation.Nullable; import android.app.Application; import android.content.Context; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.os.Build; import android.os.UserHandle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.TextView; -import android.widget.ToastPresenter; import com.android.internal.R; import com.android.launcher3.icons.IconFactory; @@ -52,7 +55,6 @@ public class SystemUIToast implements ToastPlugin.Toast { private final String mPackageName; private final int mUserId; private final LayoutInflater mLayoutInflater; - private final boolean mToastStyleEnabled; final int mDefaultX = 0; final int mDefaultHorizontalMargin = 0; @@ -66,15 +68,14 @@ public class SystemUIToast implements ToastPlugin.Toast { @Nullable private final Animator mOutAnimator; SystemUIToast(LayoutInflater layoutInflater, Context context, CharSequence text, - String packageName, int userId, boolean toastStyleEnabled, int orientation) { + String packageName, int userId, int orientation) { this(layoutInflater, context, text, null, packageName, userId, - toastStyleEnabled, orientation); + orientation); } SystemUIToast(LayoutInflater layoutInflater, Context context, CharSequence text, ToastPlugin.Toast pluginToast, String packageName, int userId, - boolean toastStyleEnabled, int orientation) { - mToastStyleEnabled = toastStyleEnabled; + int orientation) { mLayoutInflater = layoutInflater; mContext = context; mText = text; @@ -167,23 +168,45 @@ public class SystemUIToast implements ToastPlugin.Toast { return mPluginToast.getView(); } - View toastView; - if (mToastStyleEnabled) { - toastView = mLayoutInflater.inflate( + final View toastView = mLayoutInflater.inflate( com.android.systemui.R.layout.text_toast, null); - ((TextView) toastView.findViewById(com.android.systemui.R.id.text)).setText(mText); + final TextView textView = toastView.findViewById(com.android.systemui.R.id.text); + final ImageView iconView = toastView.findViewById(com.android.systemui.R.id.icon); + textView.setText(mText); + + ApplicationInfo appInfo = null; + try { + appInfo = mContext.getPackageManager() + .getApplicationInfoAsUser(mPackageName, 0, mUserId); + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Package name not found package=" + mPackageName + + " user=" + mUserId); + } + + if (appInfo != null && appInfo.targetSdkVersion < Build.VERSION_CODES.S) { + // no two-line limit + textView.setMaxLines(Integer.MAX_VALUE); + // no app icon + toastView.findViewById(com.android.systemui.R.id.icon).setVisibility(View.GONE); + } else { Drawable icon = getBadgedIcon(mContext, mPackageName, mUserId); if (icon == null) { - toastView.findViewById(com.android.systemui.R.id.icon).setVisibility(View.GONE); + iconView.setVisibility(View.GONE); } else { - ((ImageView) toastView.findViewById(com.android.systemui.R.id.icon)) - .setImageDrawable(icon); + iconView.setImageDrawable(icon); + if (appInfo.labelRes != 0) { + try { + Resources res = mContext.getPackageManager().getResourcesForApplication( + appInfo, + new Configuration(mContext.getResources().getConfiguration())); + iconView.setContentDescription(res.getString(appInfo.labelRes)); + } catch (PackageManager.NameNotFoundException e) { + Log.d(TAG, "Cannot find application resources for icon label."); + } + } } - } else { - toastView = ToastPresenter.getTextToastView(mContext, mText); } - return toastView; } @@ -205,18 +228,14 @@ public class SystemUIToast implements ToastPlugin.Toast { return mPluginToast.getInAnimation(); } - return mToastStyleEnabled - ? ToastDefaultAnimation.Companion.toastIn(getView()) - : null; + return ToastDefaultAnimation.Companion.toastIn(getView()); } private Animator createOutAnimator() { if (isPluginToast() && mPluginToast.getOutAnimation() != null) { return mPluginToast.getOutAnimation(); } - return mToastStyleEnabled - ? ToastDefaultAnimation.Companion.toastOut(getView()) - : null; + return ToastDefaultAnimation.Companion.toastOut(getView()); } /** @@ -225,6 +244,10 @@ public class SystemUIToast implements ToastPlugin.Toast { */ public static Drawable getBadgedIcon(@NonNull Context context, String packageName, int userId) { + if (!(context.getApplicationContext() instanceof Application)) { + return null; + } + final ApplicationsState appState = ApplicationsState.getInstance((Application) context.getApplicationContext()); if (!appState.isUserAdded(userId)) { diff --git a/packages/SystemUI/src/com/android/systemui/toast/ToastDefaultAnimation.kt b/packages/SystemUI/src/com/android/systemui/toast/ToastDefaultAnimation.kt index 603d69057e5c..8187956962b6 100644 --- a/packages/SystemUI/src/com/android/systemui/toast/ToastDefaultAnimation.kt +++ b/packages/SystemUI/src/com/android/systemui/toast/ToastDefaultAnimation.kt @@ -76,29 +76,41 @@ class ToastDefaultAnimation { } val linearInterp = LinearInterpolator() val scaleInterp = PathInterpolator(0.3f, 0f, 1f, 1f) - val sX = ObjectAnimator.ofFloat(view, "scaleX", 1f, 0.9f).apply { + val viewScaleX = ObjectAnimator.ofFloat(view, "scaleX", 1f, 0.9f).apply { interpolator = scaleInterp duration = 250 } - val sY = ObjectAnimator.ofFloat(view, "scaleY", 1f, 0.9f).apply { + val viewScaleY = ObjectAnimator.ofFloat(view, "scaleY", 1f, 0.9f).apply { interpolator = scaleInterp duration = 250 } - val vA = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f).apply { + val viewElevation = ObjectAnimator.ofFloat(view, "elevation", + view.elevation, 0f).apply { + interpolator = linearInterp + duration = 40 + startDelay = 150 + } + val viewAlpha = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f).apply { interpolator = linearInterp duration = 100 startDelay = 150 } - val tA = ObjectAnimator.ofFloat(text, "alpha", 1f, 0f).apply { + val textAlpha = ObjectAnimator.ofFloat(text, "alpha", 1f, 0f).apply { interpolator = linearInterp duration = 166 } - val iA = ObjectAnimator.ofFloat(icon, "alpha", 1f, 0f).apply { + val iconAlpha = ObjectAnimator.ofFloat(icon, "alpha", 1f, 0f).apply { interpolator = linearInterp duration = 166 } return AnimatorSet().apply { - playTogether(sX, sY, vA, tA, iA) + playTogether( + viewScaleX, + viewScaleY, + viewElevation, + viewAlpha, + textAlpha, + iconAlpha) } } } diff --git a/packages/SystemUI/src/com/android/systemui/toast/ToastFactory.java b/packages/SystemUI/src/com/android/systemui/toast/ToastFactory.java index 8b782d4b7923..148bffa0000e 100644 --- a/packages/SystemUI/src/com/android/systemui/toast/ToastFactory.java +++ b/packages/SystemUI/src/com/android/systemui/toast/ToastFactory.java @@ -27,7 +27,6 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.ToastPlugin; import com.android.systemui.shared.plugins.PluginManager; -import com.android.systemui.statusbar.FeatureFlags; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -43,17 +42,14 @@ public class ToastFactory implements Dumpable { // only one ToastPlugin can be connected at a time. private ToastPlugin mPlugin; private final LayoutInflater mLayoutInflater; - private final boolean mToastStyleEnabled; @Inject public ToastFactory( LayoutInflater layoutInflater, PluginManager pluginManager, - DumpManager dumpManager, - FeatureFlags featureFlags) { + DumpManager dumpManager) { mLayoutInflater = layoutInflater; dumpManager.registerDumpable("ToastFactory", this); - mToastStyleEnabled = featureFlags.isToastStyleEnabled(); pluginManager.addPluginListener( new PluginListener<ToastPlugin>() { @Override @@ -77,10 +73,10 @@ public class ToastFactory implements Dumpable { int userId, int orientation) { if (isPluginAvailable()) { return new SystemUIToast(mLayoutInflater, context, text, mPlugin.createToast(text, - packageName, userId), packageName, userId, mToastStyleEnabled, orientation); + packageName, userId), packageName, userId, orientation); } return new SystemUIToast(mLayoutInflater, context, text, packageName, userId, - mToastStyleEnabled, orientation); + orientation); } private boolean isPluginAvailable() { @@ -91,6 +87,5 @@ public class ToastFactory implements Dumpable { public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) { pw.println("ToastFactory:"); pw.println(" mAttachedPlugin=" + mPlugin); - pw.println(" mToastStyleEnabled=" + mToastStyleEnabled); } } diff --git a/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java b/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java index 92ea1d0e5fbd..42f66875e7a1 100644 --- a/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java +++ b/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java @@ -19,6 +19,7 @@ package com.android.systemui.toast; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; @@ -34,7 +35,8 @@ import android.view.accessibility.AccessibilityManager; import android.view.accessibility.IAccessibilityManager; import android.widget.ToastPresenter; -import com.android.internal.annotations.VisibleForTesting; +import androidx.annotation.VisibleForTesting; + import com.android.systemui.SystemUI; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.statusbar.CommandQueue; @@ -60,11 +62,11 @@ public class ToastUI extends SystemUI implements CommandQueue.Callbacks { private final AccessibilityManager mAccessibilityManager; private final ToastFactory mToastFactory; private final ToastLogger mToastLogger; - private SystemUIToast mToast; @Nullable private ToastPresenter mPresenter; @Nullable private ITransientNotificationCallback mCallback; private ToastOutAnimatorListener mToastOutAnimatorListener; + @VisibleForTesting SystemUIToast mToast; private int mOrientation = ORIENTATION_PORTRAIT; @Inject @@ -191,7 +193,7 @@ public class ToastUI extends SystemUI implements CommandQueue.Callbacks { /** * Once the out animation for a toast is finished, start showing the next toast. */ - class ToastOutAnimatorListener implements Animator.AnimatorListener { + class ToastOutAnimatorListener extends AnimatorListenerAdapter { final ToastPresenter mPrevPresenter; final ITransientNotificationCallback mPrevCallback; @Nullable Runnable mShowNextToastRunnable; @@ -210,10 +212,6 @@ public class ToastUI extends SystemUI implements CommandQueue.Callbacks { } @Override - public void onAnimationStart(Animator animation) { - } - - @Override public void onAnimationEnd(Animator animation) { mPrevPresenter.hide(mPrevCallback); if (mShowNextToastRunnable != null) { @@ -221,15 +219,5 @@ public class ToastUI extends SystemUI implements CommandQueue.Callbacks { } mToastOutAnimatorListener = null; } - - @Override - public void onAnimationCancel(Animator animation) { - onAnimationEnd(animation); - } - - @Override - public void onAnimationRepeat(Animator animation) { - - } } } diff --git a/packages/SystemUI/src/com/android/systemui/util/concurrency/ThreadFactory.java b/packages/SystemUI/src/com/android/systemui/util/concurrency/ThreadFactory.java index 7a5ceb547d9e..fbec9e7b7f0c 100644 --- a/packages/SystemUI/src/com/android/systemui/util/concurrency/ThreadFactory.java +++ b/packages/SystemUI/src/com/android/systemui/util/concurrency/ThreadFactory.java @@ -30,12 +30,20 @@ import java.util.concurrent.Executor; */ public interface ThreadFactory { /** + * Returns a {@link Looper} running on a named thread. + * + * The thread is implicitly started and may be left running indefinitely, depending on the + * implementation. Assume this is the case and use responsibly. + */ + Looper buildLooperOnNewThread(String threadName); + + /** * Returns a {@link Handler} running on a named thread. * * The thread is implicitly started and may be left running indefinitely, depending on the * implementation. Assume this is the case and use responsibly. */ - Handler builderHandlerOnNewThread(String threadName); + Handler buildHandlerOnNewThread(String threadName); /** * Return an {@link java.util.concurrent.Executor} running on a named thread. diff --git a/packages/SystemUI/src/com/android/systemui/util/concurrency/ThreadFactoryImpl.java b/packages/SystemUI/src/com/android/systemui/util/concurrency/ThreadFactoryImpl.java index 184b83113d8d..051f4335e171 100644 --- a/packages/SystemUI/src/com/android/systemui/util/concurrency/ThreadFactoryImpl.java +++ b/packages/SystemUI/src/com/android/systemui/util/concurrency/ThreadFactoryImpl.java @@ -29,10 +29,15 @@ class ThreadFactoryImpl implements ThreadFactory { ThreadFactoryImpl() {} @Override - public Handler builderHandlerOnNewThread(String threadName) { + public Looper buildLooperOnNewThread(String threadName) { HandlerThread handlerThread = new HandlerThread(threadName); handlerThread.start(); - return new Handler(handlerThread.getLooper()); + return handlerThread.getLooper(); + } + + @Override + public Handler buildHandlerOnNewThread(String threadName) { + return new Handler(buildLooperOnNewThread(threadName)); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/RotationUtils.java b/packages/SystemUI/src/com/android/systemui/util/leak/RotationUtils.java index b9b7730c67f3..0b2f004537d6 100644 --- a/packages/SystemUI/src/com/android/systemui/util/leak/RotationUtils.java +++ b/packages/SystemUI/src/com/android/systemui/util/leak/RotationUtils.java @@ -116,7 +116,7 @@ public class RotationUtils { default: throw new IllegalArgumentException("Unknown rotation: " + rot); } - Configuration c = context.getResources().getConfiguration(); + Configuration c = new Configuration(context.getResources().getConfiguration()); c.orientation = orientation; Context rotated = context.createConfigurationContext(c); return rotated.getResources(); diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java index 3aba7ca1ad7c..a5ccc47b8072 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java @@ -38,11 +38,9 @@ import android.media.session.MediaController.PlaybackInfo; import android.media.session.MediaSession.Token; import android.net.Uri; import android.os.Handler; -import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.os.RemoteException; -import android.os.ServiceManager; import android.os.UserHandle; import android.os.VibrationEffect; import android.os.Vibrator; @@ -66,9 +64,9 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.plugins.VolumeDialogController; import com.android.systemui.qs.tiles.DndTile; -import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.util.RingerModeLiveData; import com.android.systemui.util.RingerModeTracker; +import com.android.systemui.util.concurrency.ThreadFactory; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -80,8 +78,6 @@ import java.util.concurrent.ConcurrentHashMap; import javax.inject.Inject; -import dagger.Lazy; - /** * Source of truth for all state / events related to the volume dialog. No presentation. * @@ -118,12 +114,13 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa STREAMS.put(AudioSystem.STREAM_VOICE_CALL, R.string.stream_voice_call); } - private final HandlerThread mWorkerThread; private final W mWorker; private final Context mContext; + private final Looper mWorkerLooper; + private final PackageManager mPackageManager; + private final WakefulnessLifecycle mWakefulnessLifecycle; private AudioManager mAudio; private IAudioService mAudioService; - private final Optional<Lazy<StatusBar>> mStatusBarOptionalLazy; private final NotificationManager mNoMan; private final SettingObserver mObserver; private final Receiver mReceiver = new Receiver(); @@ -132,13 +129,13 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa protected C mCallbacks = new C(); private final State mState = new State(); protected final MediaSessionsCallbacks mMediaSessionsCallbacksW = new MediaSessionsCallbacks(); - private final Vibrator mVibrator; + private final Optional<Vibrator> mVibrator; private final boolean mHasVibrator; private boolean mShowA11yStream; private boolean mShowVolumeDialog; private boolean mShowSafetyWarning; private long mLastToggledRingerOn; - private final NotificationManager mNotificationManager; + private boolean mDeviceInteractive; private boolean mDestroyed; private VolumePolicy mVolumePolicy; @@ -149,26 +146,42 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa protected final VC mVolumeController = new VC(); protected final BroadcastDispatcher mBroadcastDispatcher; + private final WakefulnessLifecycle.Observer mWakefullnessLifecycleObserver = + new WakefulnessLifecycle.Observer() { + @Override + public void onStartedWakingUp() { + mDeviceInteractive = true; + } + + @Override + public void onFinishedGoingToSleep() { + mDeviceInteractive = false; + } + }; + @Inject - public VolumeDialogControllerImpl(Context context, BroadcastDispatcher broadcastDispatcher, - Optional<Lazy<StatusBar>> statusBarOptionalLazy, RingerModeTracker ringerModeTracker) { + public VolumeDialogControllerImpl( + Context context, + BroadcastDispatcher broadcastDispatcher, + RingerModeTracker ringerModeTracker, + ThreadFactory theadFactory, + AudioManager audioManager, + NotificationManager notificationManager, + Optional<Vibrator> optionalVibrator, + IAudioService iAudioService, + AccessibilityManager accessibilityManager, + PackageManager packageManager, + WakefulnessLifecycle wakefulnessLifecycle) { mContext = context.getApplicationContext(); - // TODO(b/150663459): remove this TV workaround once StatusBar is "unbound" on TVs - if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK)) { - mStatusBarOptionalLazy = Optional.empty(); - } else { - mStatusBarOptionalLazy = statusBarOptionalLazy; - } - mNotificationManager = (NotificationManager) mContext.getSystemService( - Context.NOTIFICATION_SERVICE); + mPackageManager = packageManager; + mWakefulnessLifecycle = wakefulnessLifecycle; Events.writeEvent(Events.EVENT_COLLECTION_STARTED); - mWorkerThread = new HandlerThread(VolumeDialogControllerImpl.class.getSimpleName()); - mWorkerThread.start(); - mWorker = new W(mWorkerThread.getLooper()); - mMediaSessions = createMediaSessions(mContext, mWorkerThread.getLooper(), - mMediaSessionsCallbacksW); - mAudio = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); - mNoMan = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); + mWorkerLooper = theadFactory.buildLooperOnNewThread( + VolumeDialogControllerImpl.class.getSimpleName()); + mWorker = new W(mWorkerLooper); + mMediaSessions = createMediaSessions(mContext, mWorkerLooper, mMediaSessionsCallbacksW); + mAudio = audioManager; + mNoMan = notificationManager; mObserver = new SettingObserver(mWorker); mRingerModeObservers = new RingerModeObservers( (RingerModeLiveData) ringerModeTracker.getRingerMode(), @@ -178,16 +191,17 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa mBroadcastDispatcher = broadcastDispatcher; mObserver.init(); mReceiver.init(); - mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); - mHasVibrator = mVibrator != null && mVibrator.hasVibrator(); - mAudioService = IAudioService.Stub.asInterface( - ServiceManager.getService(Context.AUDIO_SERVICE)); + mVibrator = optionalVibrator; + mHasVibrator = mVibrator.isPresent() && mVibrator.get().hasVibrator(); + mAudioService = iAudioService; - boolean accessibilityVolumeStreamActive = context.getSystemService( - AccessibilityManager.class).isAccessibilityVolumeStreamActive(); + boolean accessibilityVolumeStreamActive = accessibilityManager + .isAccessibilityVolumeStreamActive(); mVolumeController.setA11yMode(accessibilityVolumeStreamActive ? VolumePolicy.A11Y_MODE_INDEPENDENT_A11Y_VOLUME : VolumePolicy.A11Y_MODE_MEDIA_A11Y_VOLUME); + + mWakefulnessLifecycle.addObserver(mWakefullnessLifecycleObserver); } public AudioManager getAudioManager() { @@ -203,7 +217,6 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa mAudio.setVolumeController(mVolumeController); } catch (SecurityException e) { Log.w(TAG, "Unable to set the volume controller", e); - return; } } @@ -249,18 +262,6 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa return new MediaSessions(context, looper, callbacks); } - public void destroy() { - if (D.BUG) Log.d(TAG, "destroy"); - if (mDestroyed) return; - mDestroyed = true; - Events.writeEvent(Events.EVENT_COLLECTION_STOPPED); - mMediaSessions.destroy(); - mObserver.destroy(); - mReceiver.destroy(); - mRingerModeObservers.destroy(); - mWorkerThread.quitSafely(); - } - public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println(VolumeDialogControllerImpl.class.getSimpleName() + " state:"); pw.print(" mDestroyed: "); pw.println(mDestroyed); @@ -383,9 +384,8 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } public void vibrate(VibrationEffect effect) { - if (mHasVibrator) { - mVibrator.vibrate(effect, SONIFICIATION_VIBRATION_ATTRIBUTES); - } + mVibrator.ifPresent( + vibrator -> vibrator.vibrate(effect, SONIFICIATION_VIBRATION_ATTRIBUTES)); } public boolean hasVibrator() { @@ -437,9 +437,8 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa return; } - PackageManager packageManager = mContext.getPackageManager(); mCallbacks.onCaptionComponentStateChanged( - packageManager.getComponentEnabledSetting(componentName) + mPackageManager.getComponentEnabledSetting(componentName) == PackageManager.COMPONENT_ENABLED_STATE_ENABLED, fromTooltip); } catch (Exception ex) { Log.e(TAG, @@ -466,17 +465,11 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } private boolean shouldShowUI(int flags) { - // if status bar isn't null, check if phone is in AOD, else check flags - // since we could be using a different status bar - return mStatusBarOptionalLazy.map(statusBarLazy -> { - StatusBar statusBar = statusBarLazy.get(); - return statusBar.getWakefulnessState() != WakefulnessLifecycle.WAKEFULNESS_ASLEEP - && statusBar.getWakefulnessState() - != WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP - && statusBar.isDeviceInteractive() && (flags & AudioManager.FLAG_SHOW_UI) != 0 - && mShowVolumeDialog; - }).orElse( - mShowVolumeDialog && (flags & AudioManager.FLAG_SHOW_UI) != 0); + int wakefulness = mWakefulnessLifecycle.getWakefulness(); + return wakefulness != WakefulnessLifecycle.WAKEFULNESS_ASLEEP + && wakefulness != WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP + && mDeviceInteractive && (flags & AudioManager.FLAG_SHOW_UI) != 0 + && mShowVolumeDialog; } boolean onVolumeChangedW(int stream, int flags) { @@ -600,15 +593,15 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa private boolean updateEffectsSuppressorW(ComponentName effectsSuppressor) { if (Objects.equals(mState.effectsSuppressor, effectsSuppressor)) return false; mState.effectsSuppressor = effectsSuppressor; - mState.effectsSuppressorName = getApplicationName(mContext, mState.effectsSuppressor); + mState.effectsSuppressorName = + getApplicationName(mPackageManager, mState.effectsSuppressor); Events.writeEvent(Events.EVENT_SUPPRESSOR_CHANGED, mState.effectsSuppressor, mState.effectsSuppressorName); return true; } - private static String getApplicationName(Context context, ComponentName component) { + private static String getApplicationName(PackageManager pm, ComponentName component) { if (component == null) return null; - final PackageManager pm = context.getPackageManager(); final String pkg = component.getPackageName(); try { final ApplicationInfo ai = pm.getApplicationInfo(pkg, 0); @@ -630,8 +623,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } private boolean updateZenConfig() { - final NotificationManager.Policy policy = - mNotificationManager.getConsolidatedNotificationPolicy(); + final NotificationManager.Policy policy = mNoMan.getConsolidatedNotificationPolicy(); boolean disallowAlarms = (policy.priorityCategories & NotificationManager.Policy .PRIORITY_CATEGORY_ALARMS) == 0; boolean disallowMedia = (policy.priorityCategories & NotificationManager.Policy diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index b9f896e46913..961822a598e7 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -28,6 +28,7 @@ import static android.media.AudioManager.STREAM_VOICE_CALL; import static android.view.View.ACCESSIBILITY_LIVE_REGION_POLITE; import static android.view.View.GONE; import static android.view.View.INVISIBLE; +import static android.view.View.LAYOUT_DIRECTION_RTL; import static android.view.View.VISIBLE; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; @@ -52,6 +53,7 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Color; +import android.graphics.Outline; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.Region; @@ -74,11 +76,13 @@ import android.util.Log; import android.util.Slog; import android.util.SparseBooleanArray; import android.view.ContextThemeWrapper; +import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.AccessibilityDelegate; import android.view.View.OnAttachStateChangeListener; import android.view.ViewGroup; +import android.view.ViewOutlineProvider; import android.view.ViewPropertyAnimator; import android.view.ViewStub; import android.view.ViewTreeObserver; @@ -147,7 +151,10 @@ public class VolumeDialogImpl implements VolumeDialog, private final int mDialogShowAnimationDurationMs; private final int mDialogHideAnimationDurationMs; + private final int mDialogWidth; + private final int mDialogCornerRadius; private final int mRingerDrawerItemSize; + private final int mRingerRowsPadding; private final boolean mShowVibrate; private final int mRingerCount; private final boolean mShowLowMediaVolumeIcon; @@ -162,11 +169,25 @@ public class VolumeDialogImpl implements VolumeDialog, private Window mWindow; private CustomDialog mDialog; private ViewGroup mDialogView; + private ViewGroup mDialogRowsViewContainer; private ViewGroup mDialogRowsView; private ViewGroup mRinger; - @Nullable private View mRingerAndRowsContainer; - @Nullable private Drawable mRingerAndRowsContainerBackground; + /** + * Container for the top part of the dialog, which contains the ringer, the ringer drawer, the + * volume rows, and the ellipsis button. This does not include the live caption button. + */ + @Nullable private View mTopContainer; + + /** Container for the ringer icon, and for the (initially hidden) ringer drawer view. */ + @Nullable private View mRingerAndDrawerContainer; + + /** + * Background drawable for the ringer and drawer container. The background's top bound is + * initially inset by the height of the (hidden) ringer drawer. When the drawer is animated in, + * this top bound is animated to accommodate it. + */ + @Nullable private Drawable mRingerAndDrawerContainerBackground; private ViewGroup mSelectedRingerContainer; private ImageView mSelectedRingerIcon; @@ -196,6 +217,7 @@ public class VolumeDialogImpl implements VolumeDialog, private final ValueAnimator mAnimateUpBackgroundToMatchDrawer = ValueAnimator.ofFloat(1f, 0f); private boolean mIsRingerDrawerOpen = false; + private float mRingerDrawerClosedAmount = 1f; private ImageButton mRingerIcon; private ViewGroup mODICaptionsView; @@ -266,8 +288,14 @@ public class VolumeDialogImpl implements VolumeDialog, mDialogRowsView.invalidate(); }; } + mDialogWidth = mContext.getResources().getDimensionPixelSize( + R.dimen.volume_dialog_panel_width); + mDialogCornerRadius = mContext.getResources().getDimensionPixelSize( + R.dimen.volume_dialog_panel_width_half); mRingerDrawerItemSize = mContext.getResources().getDimensionPixelSize( R.dimen.volume_ringer_drawer_item_size); + mRingerRowsPadding = mContext.getResources().getDimensionPixelSize( + R.dimen.volume_dialog_ringer_rows_padding); mShowVibrate = mController.hasVibrator(); // Normal, mute, and possibly vibrate. @@ -309,37 +337,44 @@ public class VolumeDialogImpl implements VolumeDialog, mTouchableRegion.setEmpty(); - // Set the touchable region to the union of all child view bounds. We don't use touches on - // the volume dialog container itself, so this is fine. + // Set the touchable region to the union of all child view bounds and the live caption + // tooltip. We don't use touches on the volume dialog container itself, so this is fine. for (int i = 0; i < mDialogView.getChildCount(); i++) { - final View view = mDialogView.getChildAt(i); - final int[] locInWindow = new int[2]; - view.getLocationInWindow(locInWindow); - - float x = locInWindow[0]; - float y = locInWindow[1]; - - // The ringer and rows container has extra height at the top to fit the expanded ringer - // drawer. This area should not be touchable unless the ringer drawer is open. - if (view == mRingerAndRowsContainer && !mIsRingerDrawerOpen) { - if (!isLandscape()) { - y += getRingerDrawerOpenExtraSize(); - } else { - x += getRingerDrawerOpenExtraSize(); - } - } + unionViewBoundstoTouchableRegion(mDialogView.getChildAt(i)); + } - mTouchableRegion.op( - (int) x, - (int) y, - locInWindow[0] + view.getWidth(), - locInWindow[1] + view.getHeight(), - Region.Op.UNION); + if (mODICaptionsTooltipView != null && mODICaptionsTooltipView.getVisibility() == VISIBLE) { + unionViewBoundstoTouchableRegion(mODICaptionsTooltipView); } internalInsetsInfo.touchableRegion.set(mTouchableRegion); } + private void unionViewBoundstoTouchableRegion(final View view) { + final int[] locInWindow = new int[2]; + view.getLocationInWindow(locInWindow); + + float x = locInWindow[0]; + float y = locInWindow[1]; + + // The ringer and rows container has extra height at the top to fit the expanded ringer + // drawer. This area should not be touchable unless the ringer drawer is open. + if (view == mTopContainer && !mIsRingerDrawerOpen) { + if (!isLandscape()) { + y += getRingerDrawerOpenExtraSize(); + } else { + x += getRingerDrawerOpenExtraSize(); + } + } + + mTouchableRegion.op( + (int) x, + (int) y, + locInWindow[0] + view.getWidth(), + locInWindow[1] + view.getHeight(), + Region.Op.UNION); + } + private void initDialog() { mDialog = new CustomDialog(mContext); @@ -431,6 +466,46 @@ public class VolumeDialogImpl implements VolumeDialog, }); } + mDialogRowsViewContainer = mDialogView.findViewById(R.id.volume_dialog_rows_container); + mTopContainer = mDialogView.findViewById(R.id.volume_dialog_top_container); + mRingerAndDrawerContainer = mDialogView.findViewById( + R.id.volume_ringer_and_drawer_container); + + if (mRingerAndDrawerContainer != null) { + if (isLandscape()) { + // In landscape, we need to add padding to the bottom of the ringer drawer so that + // when it expands to the left, it doesn't overlap any additional volume rows. + mRingerAndDrawerContainer.setPadding( + mRingerAndDrawerContainer.getPaddingLeft(), + mRingerAndDrawerContainer.getPaddingTop(), + mRingerAndDrawerContainer.getPaddingRight(), + mRingerRowsPadding); + + // Since the ringer drawer is expanding to the left, outside of the background of + // the dialog, it needs its own rounded background drawable. We also need that + // background to be rounded on all sides. We'll use a background rounded on all four + // corners, and then extend the container's background later to fill in the bottom + // corners when the drawer is closed. + mRingerAndDrawerContainer.setBackgroundDrawable( + mContext.getDrawable(R.drawable.volume_background_top_rounded)); + } + + // Post to wait for layout so that the background bounds are set. + mRingerAndDrawerContainer.post(() -> { + final LayerDrawable ringerAndDrawerBg = + (LayerDrawable) mRingerAndDrawerContainer.getBackground(); + + // Retrieve the ShapeDrawable from within the background - this is what we will + // animate up and down when the drawer is opened/closed. + if (ringerAndDrawerBg != null && ringerAndDrawerBg.getNumberOfLayers() > 0) { + mRingerAndDrawerContainerBackground = ringerAndDrawerBg.getDrawable(0); + + updateBackgroundForDrawerClosedAmount(); + setTopContainerBackgroundDrawable(); + } + }); + } + mRinger = mDialog.findViewById(R.id.ringer); if (mRinger != null) { mRingerIcon = mRinger.findViewById(R.id.ringer_icon); @@ -510,6 +585,11 @@ public class VolumeDialogImpl implements VolumeDialog, Configuration.ORIENTATION_LANDSCAPE; } + private boolean isRtl() { + return mContext.getResources().getConfiguration().getLayoutDirection() + == LAYOUT_DIRECTION_RTL; + } + public void setStreamImportant(int stream, boolean important) { mHandler.obtainMessage(H.SET_STREAM_IMPORTANT, stream, important ? 1 : 0).sendToTarget(); } @@ -612,23 +692,6 @@ public class VolumeDialogImpl implements VolumeDialog, row.anim = null; - mRingerAndRowsContainer = mDialogView.findViewById( - R.id.volume_dialog_ringer_and_rows_container); - - if (mRingerAndRowsContainer != null) { - // Wait for layout so the background bounds are set, then set the background top to the - // ringer drawer closed position. - mRingerAndRowsContainer.post(() -> { - final LayerDrawable bgWrapper = - ((LayerDrawable) mRingerAndRowsContainer.getBackground()); - - if (bgWrapper != null) { - mRingerAndRowsContainerBackground = bgWrapper.getDrawable(0); - setRingerAndRowsBackgroundTop(1f /* closedAmount */); - } - }); - } - final LayerDrawable seekbarDrawable = (LayerDrawable) mContext.getDrawable(R.drawable.volume_row_seekbar); @@ -764,8 +827,10 @@ public class VolumeDialogImpl implements VolumeDialog, }); mRingerDrawerIconColorAnimator.setDuration(DRAWER_ANIMATION_DURATION_SHORT); - mAnimateUpBackgroundToMatchDrawer.addUpdateListener(valueAnimator -> - setRingerAndRowsBackgroundTop((float) valueAnimator.getAnimatedValue())); + mAnimateUpBackgroundToMatchDrawer.addUpdateListener(valueAnimator -> { + mRingerDrawerClosedAmount = (float) valueAnimator.getAnimatedValue(); + updateBackgroundForDrawerClosedAmount(); + }); } private ImageView getDrawerIconViewForMode(int mode) { @@ -792,6 +857,10 @@ public class VolumeDialogImpl implements VolumeDialog, /** Animates in the ringer drawer. */ private void showRingerDrawer() { + if (mIsRingerDrawerOpen) { + return; + } + // Show all ringer icons except the currently selected one, since we're going to animate the // ringer button to that position. mRingerDrawerVibrateIcon.setVisibility( @@ -874,6 +943,10 @@ public class VolumeDialogImpl implements VolumeDialog, return; } + if (!mIsRingerDrawerOpen) { + return; + } + // Hide the drawer icon for the selected ringer - it's visible in the ringer button and we // don't want to be able to see it while it animates away. getDrawerIconViewForMode(mState.ringerModeInternal).setVisibility(INVISIBLE); @@ -992,21 +1065,38 @@ public class VolumeDialogImpl implements VolumeDialog, } if (mODICaptionsTooltipView != null) { - mODICaptionsTooltipView.setAlpha(0.f); - mODICaptionsTooltipView.animate() - .alpha(1.f) - .setStartDelay(mDialogShowAnimationDurationMs) - .withEndAction(() -> { - if (D.BUG) Log.d(TAG, "tool:checkODICaptionsTooltip() putBoolean true"); - Prefs.putBoolean(mContext, - Prefs.Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, true); - mHasSeenODICaptionsTooltip = true; - if (mODICaptionsIcon != null) { - mODICaptionsIcon - .postOnAnimation(getSinglePressFor(mODICaptionsIcon)); - } - }) - .start(); + mODICaptionsTooltipView.setAlpha(0.0f); + + // We need to wait for layout and then center the caption view. Since the height of the + // dialog is now dynamic (with the variable ringer drawer height changing the height of + // the dialog), we need to do this here in code vs. in XML. + mHandler.post(() -> { + final int[] odiTooltipLocation = mODICaptionsTooltipView.getLocationOnScreen(); + final int[] odiButtonLocation = mODICaptionsIcon.getLocationOnScreen(); + + final float heightDiffForCentering = + (mODICaptionsTooltipView.getHeight() - mODICaptionsIcon.getHeight()) / 2f; + + mODICaptionsTooltipView.setTranslationY( + odiButtonLocation[1] - odiTooltipLocation[1] - heightDiffForCentering); + + mODICaptionsTooltipView.animate() + .alpha(1.0f) + .setStartDelay(mDialogShowAnimationDurationMs) + .withEndAction(() -> { + if (D.BUG) { + Log.d(TAG, "tool:checkODICaptionsTooltip() putBoolean true"); + } + Prefs.putBoolean(mContext, + Prefs.Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, true); + mHasSeenODICaptionsTooltip = true; + if (mODICaptionsIcon != null) { + mODICaptionsIcon + .postOnAnimation(getSinglePressFor(mODICaptionsIcon)); + } + }) + .start(); + }); } } @@ -1143,6 +1233,7 @@ public class VolumeDialogImpl implements VolumeDialog, mController.notifyVisible(true); mController.getCaptionsComponentState(false); checkODICaptionsTooltip(false); + updateBackgroundForDrawerClosedAmount(); } protected void rescheduleTimeoutH() { @@ -1258,15 +1349,65 @@ public class VolumeDialogImpl implements VolumeDialog, if (!mShowing) { trimObsoleteH(); } + + // Index of the last row that is actually visible. + int rightmostVisibleRowIndex = !isRtl() ? -1 : Short.MAX_VALUE; + // apply changes to all rows for (final VolumeRow row : mRows) { final boolean isActive = row == activeRow; final boolean shouldBeVisible = shouldBeVisibleH(row, activeRow); Util.setVisOrGone(row.view, shouldBeVisible); + + if (shouldBeVisible && mRingerAndDrawerContainerBackground != null) { + // For RTL, the rightmost row has the lowest index since child views are laid out + // from right to left. + rightmostVisibleRowIndex = + !isRtl() + ? Math.max(rightmostVisibleRowIndex, + mDialogRowsView.indexOfChild(row.view)) + : Math.min(rightmostVisibleRowIndex, + mDialogRowsView.indexOfChild(row.view)); + + // Add spacing between each of the visible rows - we'll remove the spacing from the + // last row after the loop. + final ViewGroup.LayoutParams layoutParams = row.view.getLayoutParams(); + if (layoutParams instanceof LinearLayout.LayoutParams) { + final LinearLayout.LayoutParams linearLayoutParams = + ((LinearLayout.LayoutParams) layoutParams); + if (!isRtl()) { + linearLayoutParams.setMarginEnd(mRingerRowsPadding); + } else { + linearLayoutParams.setMarginStart(mRingerRowsPadding); + } + } + + // Set the background on each of the rows. We'll remove this from the last row after + // the loop, since the last row's background is drawn by the main volume container. + row.view.setBackgroundDrawable( + mContext.getDrawable(R.drawable.volume_row_rounded_background)); + } + if (row.view.isShown()) { updateVolumeRowTintH(row, isActive); } } + + if (rightmostVisibleRowIndex > -1 && rightmostVisibleRowIndex < Short.MAX_VALUE) { + final View lastVisibleChild = mDialogRowsView.getChildAt(rightmostVisibleRowIndex); + final ViewGroup.LayoutParams layoutParams = lastVisibleChild.getLayoutParams(); + // Remove the spacing on the last row, and remove its background since the container is + // drawing a background for this row. + if (layoutParams instanceof LinearLayout.LayoutParams) { + final LinearLayout.LayoutParams linearLayoutParams = + ((LinearLayout.LayoutParams) layoutParams); + linearLayoutParams.setMarginStart(0); + linearLayoutParams.setMarginEnd(0); + lastVisibleChild.setBackgroundColor(Color.TRANSPARENT); + } + } + + updateBackgroundForDrawerClosedAmount(); } protected void updateRingerH() { @@ -1742,18 +1883,74 @@ public class VolumeDialogImpl implements VolumeDialog, return (mRingerCount - 1) * mRingerDrawerItemSize; } - /** - * Sets the top of the background drawable behind the container view for the ringer icon and the - * volume rows, depending on whether the ringer drawer is open or closed. + private void updateBackgroundForDrawerClosedAmount() { + if (mRingerAndDrawerContainerBackground == null) { + return; + } + + final Rect bounds = mRingerAndDrawerContainerBackground.copyBounds(); + if (!isLandscape()) { + bounds.top = (int) (mRingerDrawerClosedAmount * getRingerDrawerOpenExtraSize()); + } else { + bounds.left = (int) (mRingerDrawerClosedAmount * getRingerDrawerOpenExtraSize()); + } + mRingerAndDrawerContainerBackground.setBounds(bounds); + } + + /* + * The top container is responsible for drawing the solid color background behind the rightmost + * (primary) volume row. This is because the volume drawer animates in from below, initially + * overlapping the primary row. We need the drawer to draw below the row's SeekBar, since it + * looks strange to overlap it, but above the row's background color, since otherwise it will be + * clipped. + * + * Since we can't be both above and below the volume row view, we'll be below it, and render the + * background color in the container since they're both above that. */ - private void setRingerAndRowsBackgroundTop(float drawerClosedAmount) { - if (mRingerAndRowsContainerBackground == null) { + private void setTopContainerBackgroundDrawable() { + if (mTopContainer == null) { return; } - final Rect bounds = mRingerAndRowsContainerBackground.copyBounds(); - bounds.top = (int) (drawerClosedAmount * getRingerDrawerOpenExtraSize()); - mRingerAndRowsContainerBackground.setBounds(bounds); + final ColorDrawable solidDrawable = new ColorDrawable( + Utils.getColorAttrDefaultColor(mContext, com.android.internal.R.attr.colorSurface)); + + final LayerDrawable background = new LayerDrawable(new Drawable[] { solidDrawable }); + + // Size the solid color to match the primary volume row. In landscape, extend it upwards + // slightly so that it fills in the bottom corners of the ringer icon, whose background is + // rounded on all sides so that it can expand to the left, outside the dialog's background. + background.setLayerSize(0, mDialogWidth, + !isLandscape() + ? mDialogRowsView.getHeight() + : mDialogRowsView.getHeight() + mDialogCornerRadius); + // Inset the top so that the color only renders below the ringer drawer, which has its own + // background. In landscape, reduce the inset slightly since we are using the background to + // fill in the corners of the closed ringer drawer. + background.setLayerInsetTop(0, + !isLandscape() + ? mDialogRowsViewContainer.getTop() + : mDialogRowsViewContainer.getTop() - mDialogCornerRadius); + + // Set gravity to top-right, since additional rows will be added on the left. + background.setLayerGravity(0, Gravity.TOP | Gravity.RIGHT); + + // In landscape, the ringer drawer animates out to the left (instead of down). Since the + // drawer comes from the right (beyond the bounds of the dialog), we should clip it so it + // doesn't draw outside the dialog background. This isn't an issue in portrait, since the + // drawer animates downward, below the volume row. + if (isLandscape()) { + mRingerAndDrawerContainer.setOutlineProvider(new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + outline.setRoundRect( + 0, 0, view.getWidth(), view.getHeight(), mDialogCornerRadius); + } + }); + mRingerAndDrawerContainer.setClipToOutline(true); + } + + mTopContainer.setBackground(background); } private final VolumeDialogController.Callbacks mControllerCallbackH diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java new file mode 100644 index 000000000000..9d0cc6a00ec0 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2021 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.wallet.controller; + +import static com.android.systemui.wallet.controller.QuickAccessWalletController.WalletChangeEvent.DEFAULT_PAYMENT_APP_CHANGE; +import static com.android.systemui.wallet.controller.QuickAccessWalletController.WalletChangeEvent.WALLET_PREFERENCE_CHANGE; + +import android.content.Context; +import android.database.ContentObserver; +import android.provider.Settings; +import android.service.quickaccesswallet.GetWalletCardsRequest; +import android.service.quickaccesswallet.QuickAccessWalletClient; +import android.service.quickaccesswallet.QuickAccessWalletClientImpl; +import android.util.Log; + +import com.android.systemui.R; +import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.util.settings.SecureSettings; + +import java.util.concurrent.Executor; + +import javax.inject.Inject; + +/** + * Controller to handle communication between SystemUI and Quick Access Wallet Client. + */ +@SysUISingleton +public class QuickAccessWalletController { + + /** + * Event for the wallet status change, e.g. the default payment app change and the wallet + * preference change. + */ + public enum WalletChangeEvent { + DEFAULT_PAYMENT_APP_CHANGE, + WALLET_PREFERENCE_CHANGE, + } + + private static final String TAG = "QAWController"; + private final Context mContext; + private final Executor mExecutor; + private final SecureSettings mSecureSettings; + + private QuickAccessWalletClient mQuickAccessWalletClient; + private ContentObserver mWalletPreferenceObserver; + private ContentObserver mDefaultPaymentAppObserver; + private int mWalletPreferenceChangeEvents = 0; + private int mDefaultPaymentAppChangeEvents = 0; + private boolean mWalletEnabled = false; + + @Inject + public QuickAccessWalletController( + Context context, + @Main Executor executor, + SecureSettings secureSettings, + QuickAccessWalletClient quickAccessWalletClient) { + mContext = context; + mExecutor = executor; + mSecureSettings = secureSettings; + mQuickAccessWalletClient = quickAccessWalletClient; + } + + /** + * Returns true if the Quick Access Wallet service & feature is available. + */ + public boolean isWalletEnabled() { + return mWalletEnabled; + } + + /** + * Returns the current instance of {@link QuickAccessWalletClient} in the controller. + */ + public QuickAccessWalletClient getWalletClient() { + return mQuickAccessWalletClient; + } + + /** + * Setup the wallet change observers per {@link WalletChangeEvent} + * + * @param cardsRetriever a callback that retrieves the wallet cards + * @param events {@link WalletChangeEvent} need to be handled. + */ + public void setupWalletChangeObservers( + QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever, + WalletChangeEvent... events) { + for (WalletChangeEvent event : events) { + if (event == WALLET_PREFERENCE_CHANGE) { + setupWalletPreferenceObserver(); + } else if (event == DEFAULT_PAYMENT_APP_CHANGE) { + setupDefaultPaymentAppObserver(cardsRetriever); + } + } + } + + /** + * Unregister wallet change observers per {@link WalletChangeEvent} if needed. + * + */ + public void unregisterWalletChangeObservers(WalletChangeEvent... events) { + for (WalletChangeEvent event : events) { + if (event == WALLET_PREFERENCE_CHANGE && mWalletPreferenceObserver != null) { + mWalletPreferenceChangeEvents--; + if (mWalletPreferenceChangeEvents == 0) { + mSecureSettings.unregisterContentObserver(mWalletPreferenceObserver); + } + } else if (event == DEFAULT_PAYMENT_APP_CHANGE && mDefaultPaymentAppObserver != null) { + mDefaultPaymentAppChangeEvents--; + if (mDefaultPaymentAppChangeEvents == 0) { + mSecureSettings.unregisterContentObserver(mDefaultPaymentAppObserver); + } + } + } + } + + /** + * Update the "show wallet" preference. + */ + public void updateWalletPreference() { + mWalletEnabled = mQuickAccessWalletClient.isWalletServiceAvailable() + && mQuickAccessWalletClient.isWalletFeatureAvailable() + && mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked(); + } + + /** + * Query the wallet cards from {@link QuickAccessWalletClient}. + * + * @param cardsRetriever a callback to retrieve wallet cards. + */ + public void queryWalletCards( + QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever) { + if (!mWalletEnabled) { + Log.w(TAG, "QuickAccessWallet is unavailable, unable to query cards."); + return; + } + int cardWidth = + mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width); + int cardHeight = + mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_height); + int iconSizePx = mContext.getResources().getDimensionPixelSize(R.dimen.wallet_icon_size); + GetWalletCardsRequest request = + new GetWalletCardsRequest(cardWidth, cardHeight, iconSizePx, /* maxCards= */ 1); + mQuickAccessWalletClient.getWalletCards(mExecutor, request, cardsRetriever); + } + + /** + * Re-create the {@link QuickAccessWalletClient} of the controller. + */ + public void reCreateWalletClient() { + mQuickAccessWalletClient = QuickAccessWalletClient.create(mContext); + } + + private void setupDefaultPaymentAppObserver( + QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever) { + if (mDefaultPaymentAppObserver == null) { + mDefaultPaymentAppObserver = new ContentObserver(null /* handler */) { + @Override + public void onChange(boolean selfChange) { + mExecutor.execute(() -> { + reCreateWalletClient(); + updateWalletPreference(); + queryWalletCards(cardsRetriever); + }); + } + }; + + mSecureSettings.registerContentObserver( + Settings.Secure.getUriFor(Settings.Secure.NFC_PAYMENT_DEFAULT_COMPONENT), + false /* notifyForDescendants */, + mDefaultPaymentAppObserver); + } + mDefaultPaymentAppChangeEvents++; + } + + private void setupWalletPreferenceObserver() { + if (mWalletPreferenceObserver == null) { + mWalletPreferenceObserver = new ContentObserver(null /* handler */) { + @Override + public void onChange(boolean selfChange) { + mExecutor.execute(() -> { + updateWalletPreference(); + }); + } + }; + + mSecureSettings.registerContentObserver( + Settings.Secure.getUriFor(QuickAccessWalletClientImpl.SETTING_KEY), + false /* notifyForDescendants */, + mWalletPreferenceObserver); + } + mWalletPreferenceChangeEvents++; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java index 83aa01f8d393..c6123e77076d 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java @@ -24,6 +24,7 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.service.quickaccesswallet.QuickAccessWalletClient; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.Window; @@ -52,7 +53,7 @@ import javax.inject.Inject; */ public class WalletActivity extends LifecycleActivity { - private final QuickAccessWalletClient mQuickAccessWalletClient; + private static final String TAG = "WalletActivity"; private final KeyguardStateController mKeyguardStateController; private final KeyguardDismissUtil mKeyguardDismissUtil; private final ActivityStarter mActivityStarter; @@ -65,7 +66,6 @@ public class WalletActivity extends LifecycleActivity { @Inject public WalletActivity( - QuickAccessWalletClient quickAccessWalletClient, KeyguardStateController keyguardStateController, KeyguardDismissUtil keyguardDismissUtil, ActivityStarter activityStarter, @@ -74,7 +74,6 @@ public class WalletActivity extends LifecycleActivity { FalsingManager falsingManager, UserTracker userTracker, StatusBarKeyguardViewManager keyguardViewManager) { - mQuickAccessWalletClient = quickAccessWalletClient; mKeyguardStateController = keyguardStateController; mKeyguardDismissUtil = keyguardDismissUtil; mActivityStarter = activityStarter; @@ -103,10 +102,11 @@ public class WalletActivity extends LifecycleActivity { getActionBar().setHomeActionContentDescription(R.string.accessibility_desc_close); WalletView walletView = requireViewById(R.id.wallet_view); + QuickAccessWalletClient walletClient = QuickAccessWalletClient.create(this); mWalletScreenController = new WalletScreenController( this, walletView, - mQuickAccessWalletClient, + walletClient, mActivityStarter, mExecutor, mHandler, @@ -116,6 +116,10 @@ public class WalletActivity extends LifecycleActivity { walletView.getAppButton().setOnClickListener( v -> { + if (walletClient.createWalletIntent() == null) { + Log.w(TAG, "Unable to create wallet app intent."); + return; + } if (!mKeyguardStateController.isUnlocked() && mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { return; @@ -123,12 +127,12 @@ public class WalletActivity extends LifecycleActivity { if (mKeyguardStateController.isUnlocked()) { mActivityStarter.startActivity( - mQuickAccessWalletClient.createWalletIntent(), true); + walletClient.createWalletIntent(), true); finish(); } else { mKeyguardDismissUtil.executeWhenUnlocked(() -> { mActivityStarter.startActivity( - mQuickAccessWalletClient.createWalletIntent(), true); + walletClient.createWalletIntent(), true); finish(); return false; }, false, true); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java index 10322f287d50..06b0bb25e01c 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java @@ -40,8 +40,10 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.colorextraction.SysuiColorExtractor; +import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.shared.system.smartspace.SmartspaceTransitionController; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController; import com.android.systemui.statusbar.phone.KeyguardBypassController; @@ -86,6 +88,9 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { @Mock Resources mResources; + KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; + @Mock + SmartspaceTransitionController mSmartSpaceTransitionController; @Mock private ClockPlugin mClockPlugin; @Mock @@ -135,7 +140,10 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { mBatteryController, mKeyguardUpdateMonitor, mBypassController, - mSmartspaceController); + mSmartspaceController, + mKeyguardUnlockAnimationController, + mSmartSpaceTransitionController + ); when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE); when(mColorExtractor.getColors(anyInt())).thenReturn(mGradientColors); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java index 49f1655997ef..f9b6d4467e3c 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java @@ -22,6 +22,8 @@ import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import com.android.systemui.SysuiTestCase; +import com.android.systemui.keyguard.KeyguardUnlockAnimationController; +import com.android.systemui.shared.system.smartspace.SmartspaceTransitionController; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -50,6 +52,10 @@ public class KeyguardStatusViewControllerTest extends SysuiTestCase { ConfigurationController mConfigurationController; @Mock DozeParameters mDozeParameters; + @Mock + KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; + @Mock + SmartspaceTransitionController mSmartSpaceTransitionController; private KeyguardStatusViewController mController; @@ -64,7 +70,9 @@ public class KeyguardStatusViewControllerTest extends SysuiTestCase { mKeyguardStateController, mKeyguardUpdateMonitor, mConfigurationController, - mDozeParameters); + mDozeParameters, + mKeyguardUnlockAnimationController, + mSmartSpaceTransitionController); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java index d9a240f4273e..936ec8021f5e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java @@ -100,8 +100,6 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { private AccessibilityManager mAccessibilityManager; @Mock private SfVsyncFrameCallbackProvider mSfVsyncFrameProvider; - @Mock - private Handler mHandler; private TestableWindowManager mWindowManager; private ViewPropertyAnimator mViewPropertyAnimator; private MagnificationModeSwitch mMagnificationModeSwitch; @@ -152,12 +150,12 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { } @Test - public void showWindowModeButton_fullscreenMode_addViewAndSetImageResource() { - mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); + public void showFullscreenModeButton_addViewAndSetImageResource() { + mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); verify(mSpyImageView).setImageResource( - getIconResId(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW)); - verify(mWindowManager).addView(eq(mSpyImageView), any(WindowManager.LayoutParams.class)); + getIconResId(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN)); + assertEquals(mSpyImageView, mWindowManager.getAttachedView()); assertShowFadingAnimation(FADE_IN_ALPHA); assertShowFadingAnimation(FADE_OUT_ALPHA); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java index 5fa63bc3d061..ad99e4d5a772 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java @@ -59,6 +59,7 @@ import android.view.WindowManager; import android.view.accessibility.AccessibilityNodeInfo; import androidx.test.InstrumentationRegistry; +import androidx.test.filters.FlakyTest; import androidx.test.filters.LargeTest; import com.android.internal.graphics.SfVsyncFrameCallbackProvider; @@ -72,7 +73,6 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; -import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @@ -91,7 +91,7 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { @Mock private WindowMagnifierCallback mWindowMagnifierCallback; @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private SurfaceControl.Transaction mTransaction; + private SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction(); private TestableWindowManager mWindowManager; private SysUiState mSysUiState = new SysUiState(); private Resources mResources; @@ -138,6 +138,7 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { } @Test + @FlakyTest(bugId = 188889181) public void enableWindowMagnification_showControlAndNotifyBoundsChanged() { mInstrumentation.runOnMainSync(() -> { mWindowMagnificationController.enableWindowMagnification(Float.NaN, Float.NaN, @@ -145,16 +146,9 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { }); verify(mMirrorWindowControl).showControl(); - ArgumentCaptor<Rect> boundsCaptor = ArgumentCaptor.forClass(Rect.class); verify(mWindowMagnifierCallback, - timeout(LAYOUT_CHANGE_TIMEOUT_MS)).onWindowMagnifierBoundsChanged( - eq(mContext.getDisplayId()), boundsCaptor.capture()); - final Rect actualBounds = new Rect(); - final View mirrorView = mWindowManager.getAttachedView(); - assertNotNull(mirrorView); - mirrorView.getBoundsOnScreen(actualBounds); - assertEquals(actualBounds, boundsCaptor.getValue()); - + timeout(LAYOUT_CHANGE_TIMEOUT_MS).atLeastOnce()).onWindowMagnifierBoundsChanged( + eq(mContext.getDisplayId()), any(Rect.class)); } @Test @@ -203,6 +197,12 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { @Test public void setScale_enabled_expectedValueAndUpdateStateDescription() { + doAnswer(invocation -> { + final Runnable runnable = invocation.getArgument(0); + runnable.run(); + return null; + }).when(mHandler).postDelayed(any(Runnable.class), anyLong()); + mInstrumentation.runOnMainSync( () -> mWindowMagnificationController.enableWindowMagnification(2.0f, Float.NaN, Float.NaN)); @@ -210,9 +210,6 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { mInstrumentation.runOnMainSync(() -> mWindowMagnificationController.setScale(3.0f)); assertEquals(3.0f, mWindowMagnificationController.getScale(), 0); - ArgumentCaptor<Runnable> runnableArgumentCaptor = ArgumentCaptor.forClass(Runnable.class); - verify(mHandler).postDelayed(runnableArgumentCaptor.capture(), anyLong()); - runnableArgumentCaptor.getValue().run(); final View mirrorView = mWindowManager.getAttachedView(); assertNotNull(mirrorView); assertThat(mirrorView.getStateDescription().toString(), containsString("300")); diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt index 897d78b2ba0e..f2ef5c38e9b9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt @@ -51,7 +51,11 @@ class ActivityLaunchAnimatorTest : SysuiTestCase() { // We start in a new thread so that we can ensure that the callbacks are called in the main // thread. thread { - activityLaunchAnimator.startIntentWithAnimation(controller, animate, intentStarter) + activityLaunchAnimator.startIntentWithAnimation( + controller = controller, + animate = animate, + intentStarter = intentStarter + ) }.join() } @@ -135,11 +139,14 @@ class ActivityLaunchAnimatorTest : SysuiTestCase() { verify(controller).onLaunchAnimationStart(anyBoolean()) } - private fun fakeWindow() = RemoteAnimationTarget( - 0, RemoteAnimationTarget.MODE_OPENING, SurfaceControl(), false, Rect(), Rect(), 0, - Point(), Rect(), Rect(), WindowConfiguration(), false, SurfaceControl(), Rect(), - ActivityManager.RunningTaskInfo() - ) + private fun fakeWindow(): RemoteAnimationTarget { + val bounds = Rect(10 /* left */, 20 /* top */, 30 /* right */, 40 /* bottom */) + return RemoteAnimationTarget( + 0, RemoteAnimationTarget.MODE_OPENING, SurfaceControl(), false, Rect(), Rect(), 0, + Point(), Rect(), bounds, WindowConfiguration(), false, SurfaceControl(), Rect(), + ActivityManager.RunningTaskInfo() + ) + } } /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java index 711f293a0bf1..06f925397f0c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricViewTest.java @@ -26,6 +26,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import android.content.Context; +import android.hardware.biometrics.BiometricPrompt; import android.hardware.biometrics.PromptInfo; import android.os.Bundle; import android.test.suitebuilder.annotation.SmallTest; @@ -41,7 +42,6 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -195,8 +195,6 @@ public class AuthBiometricViewTest extends SysuiTestCase { assertEquals(AuthBiometricView.STATE_AUTHENTICATING, mBiometricView.mState); } - // TODO: b(/189031816) - @Ignore @Test public void testError_sendsActionError() { initDialog(mContext, false /* allowDeviceCredential */, mCallback, new MockInjector()); @@ -205,7 +203,7 @@ public class AuthBiometricViewTest extends SysuiTestCase { waitForIdleSync(); verify(mCallback).onAction(AuthBiometricView.Callback.ACTION_ERROR); - assertEquals(AuthBiometricView.STATE_ERROR, mBiometricView.mState); + assertEquals(AuthBiometricView.STATE_IDLE, mBiometricView.mState); } @Test @@ -241,8 +239,6 @@ public class AuthBiometricViewTest extends SysuiTestCase { verify(mCallback, never()).onAction(eq(AuthBiometricView.Callback.ACTION_USER_CANCELED)); } - // TODO: b(/189031816) - @Ignore @Test public void testRestoresState() { final boolean requireConfirmation = true; // set/init from AuthController @@ -258,6 +254,12 @@ public class AuthBiometricViewTest extends SysuiTestCase { public TextView getIndicatorView() { return indicatorView; } + + @Override + public int getDelayAfterError() { + // keep a real delay to test saving in the error state + return BiometricPrompt.HIDE_DIALOG_DELAY; + } }); final String failureMessage = "testFailureMessage"; diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java index bb2e55f877d4..db5648ab1ebc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java @@ -62,7 +62,6 @@ import android.testing.TestableLooper.RunWithLooper; import com.android.internal.R; import com.android.systemui.SysuiTestCase; -import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.CommandQueue; import org.junit.Before; @@ -96,8 +95,6 @@ public class AuthControllerTest extends SysuiTestCase { @Mock private CommandQueue mCommandQueue; @Mock - private StatusBarStateController mStatusBarStateController; - @Mock private ActivityTaskManager mActivityTaskManager; @Mock private FingerprintManager mFingerprintManager; @@ -152,7 +149,7 @@ public class AuthControllerTest extends SysuiTestCase { when(mFingerprintManager.getSensorPropertiesInternal()).thenReturn(props); mAuthController = new TestableAuthController(context, mCommandQueue, - mStatusBarStateController, mActivityTaskManager, mFingerprintManager, mFaceManager, + mActivityTaskManager, mFingerprintManager, mFaceManager, () -> mUdfpsController, () -> mSidefpsController); mAuthController.start(); @@ -561,13 +558,12 @@ public class AuthControllerTest extends SysuiTestCase { private PromptInfo mLastBiometricPromptInfo; TestableAuthController(Context context, CommandQueue commandQueue, - StatusBarStateController statusBarStateController, ActivityTaskManager activityTaskManager, FingerprintManager fingerprintManager, FaceManager faceManager, Provider<UdfpsController> udfpsControllerFactory, Provider<SidefpsController> sidefpsControllerFactory) { - super(context, commandQueue, statusBarStateController, activityTaskManager, + super(context, commandQueue, activityTaskManager, fingerprintManager, faceManager, udfpsControllerFactory, sidefpsControllerFactory); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt index 247748a98884..240fdf3a4e17 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt @@ -26,6 +26,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.commandline.CommandRegistry import com.android.systemui.statusbar.phone.KeyguardBypassController +import com.android.systemui.statusbar.phone.StatusBar import com.android.systemui.statusbar.policy.ConfigurationController import org.junit.Before import org.junit.Test @@ -44,6 +45,7 @@ import org.mockito.MockitoAnnotations @RunWith(AndroidTestingRunner::class) class AuthRippleControllerTest : SysuiTestCase() { private lateinit var controller: AuthRippleController + @Mock private lateinit var statusBar: StatusBar @Mock private lateinit var rippleView: AuthRippleView @Mock private lateinit var commandRegistry: CommandRegistry @Mock private lateinit var configurationController: ConfigurationController @@ -56,6 +58,7 @@ class AuthRippleControllerTest : SysuiTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) controller = AuthRippleController( + statusBar, context, authController, configurationController, @@ -72,7 +75,7 @@ class AuthRippleControllerTest : SysuiTestCase() { fun testFingerprintTrigger_Ripple() { // GIVEN fp exists, keyguard is visible, user doesn't need strong auth val fpsLocation = PointF(5f, 5f) - `when`(authController.udfpsSensorLocation).thenReturn(fpsLocation) + `when`(authController.fingerprintSensorLocation).thenReturn(fpsLocation) controller.onViewAttached() `when`(keyguardUpdateMonitor.isKeyguardVisible).thenReturn(true) `when`(keyguardUpdateMonitor.userNeedsStrongAuth()).thenReturn(false) @@ -193,7 +196,7 @@ class AuthRippleControllerTest : SysuiTestCase() { @Test fun testNullFingerprintSensorLocationDoesNothing() { - `when`(authController.udfpsSensorLocation).thenReturn(null) + `when`(authController.fingerprintSensorLocation).thenReturn(null) controller.onViewAttached() val captor = ArgumentCaptor.forClass(KeyguardUpdateMonitorCallback::class.java) diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt index d6b82f355e7c..2d19f7dd4706 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt @@ -55,7 +55,6 @@ import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers.anyLong import org.mockito.Mock -import org.mockito.Mockito.anyBoolean import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.verify @@ -329,11 +328,6 @@ public class MediaControlPanelTest : SysuiTestCase() { assertThat(dismiss.isEnabled).isEqualTo(true) dismiss.callOnClick() - val captor = ArgumentCaptor.forClass(ActivityStarter.OnDismissAction::class.java) - verify(keyguardDismissUtil).executeWhenUnlocked(captor.capture(), anyBoolean(), - eq(false)) - - captor.value.onDismiss() verify(mediaDataManager).dismissMediaData(eq(mediaKey), anyLong()) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt index c6aef4a18373..bf87a4a59c49 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt @@ -20,6 +20,7 @@ import android.graphics.Rect import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.view.ViewGroup +import android.widget.FrameLayout import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.controls.controller.ControlsControllerImplTest.Companion.eq @@ -33,6 +34,7 @@ import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.animation.UniqueObjectHostView +import junit.framework.Assert import org.junit.Assert.assertNotNull import org.junit.Before import org.junit.Rule @@ -65,8 +67,6 @@ class MediaHierarchyManagerTest : SysuiTestCase() { @Mock private lateinit var bypassController: KeyguardBypassController @Mock - private lateinit var mediaFrame: ViewGroup - @Mock private lateinit var keyguardStateController: KeyguardStateController @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController @@ -90,9 +90,11 @@ class MediaHierarchyManagerTest : SysuiTestCase() { @Rule val mockito = MockitoJUnit.rule() private lateinit var mediaHiearchyManager: MediaHierarchyManager + private lateinit var mediaFrame: ViewGroup @Before fun setup() { + mediaFrame = FrameLayout(context) `when`(mediaCarouselController.mediaFrame).thenReturn(mediaFrame) mediaHiearchyManager = MediaHierarchyManager( context, @@ -112,6 +114,9 @@ class MediaHierarchyManagerTest : SysuiTestCase() { `when`(statusBarStateController.state).thenReturn(StatusBarState.SHADE) `when`(mediaCarouselController.mediaCarouselScrollHandler) .thenReturn(mediaCarouselScrollHandler) + val observer = wakefullnessObserver.value + assertNotNull("lifecycle observer wasn't registered", observer) + observer.onFinishedWakingUp() // We'll use the viewmanager to verify a few calls below, let's reset this. clearInvocations(mediaCarouselController) } @@ -120,6 +125,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() { `when`(host.location).thenReturn(location) `when`(host.currentBounds).thenReturn(Rect()) `when`(host.hostView).thenReturn(UniqueObjectHostView(context)) + `when`(host.visible).thenReturn(true) mediaHiearchyManager.register(host) } @@ -160,6 +166,73 @@ class MediaHierarchyManagerTest : SysuiTestCase() { } @Test + fun testGoingToFullShade() { + // Let's set it onto Lock screen + `when`(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) + `when`(notificationLockscreenUserManager.shouldShowLockscreenNotifications()).thenReturn( + true) + statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) + clearInvocations(mediaCarouselController) + + // Let's transition all the way to full shade + mediaHiearchyManager.setTransitionToFullShadeAmount(100000f) + verify(mediaCarouselController).onDesiredLocationChanged( + eq(MediaHierarchyManager.LOCATION_QQS), + any(MediaHostState::class.java), + eq(false), + anyLong(), + anyLong()) + clearInvocations(mediaCarouselController) + + // Let's go back to the lock screen + mediaHiearchyManager.setTransitionToFullShadeAmount(0.0f) + verify(mediaCarouselController).onDesiredLocationChanged( + eq(MediaHierarchyManager.LOCATION_LOCKSCREEN), + any(MediaHostState::class.java), + eq(false), + anyLong(), + anyLong()) + + // Let's make sure alpha is set + mediaHiearchyManager.setTransitionToFullShadeAmount(2.0f) + Assert.assertTrue("alpha should not be 1.0f when cross fading", mediaFrame.alpha != 1.0f) + } + + @Test + fun testTransformationOnLockScreenIsFading() { + // Let's set it onto Lock screen + `when`(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) + `when`(notificationLockscreenUserManager.shouldShowLockscreenNotifications()).thenReturn( + true) + statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) + clearInvocations(mediaCarouselController) + + // Let's transition from lockscreen to qs + mediaHiearchyManager.qsExpansion = 1.0f + val transformType = mediaHiearchyManager.calculateTransformationType() + Assert.assertTrue("media isn't transforming to qs with a fade", + transformType == MediaHierarchyManager.TRANSFORMATION_TYPE_FADE) + } + + @Test + fun testTransformationOnLockScreenToQQSisFading() { + // Let's set it onto Lock screen + `when`(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) + `when`(notificationLockscreenUserManager.shouldShowLockscreenNotifications()).thenReturn( + true) + statusBarCallback.value.onStatePreChange(StatusBarState.SHADE, StatusBarState.KEYGUARD) + clearInvocations(mediaCarouselController) + + // Let's transition from lockscreen to qs + `when`(statusBarStateController.state).thenReturn(StatusBarState.SHADE_LOCKED) + statusBarCallback.value.onStatePreChange(StatusBarState.KEYGUARD, + StatusBarState.SHADE_LOCKED) + val transformType = mediaHiearchyManager.calculateTransformationType() + Assert.assertTrue("media isn't transforming to qqswith a fade", + transformType == MediaHierarchyManager.TRANSFORMATION_TYPE_FADE) + } + + @Test fun testCloseGutsRelayToCarousel() { mediaHiearchyManager.closeGuts() diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt index 96d1d94795f6..4e1627ff0343 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt @@ -89,6 +89,7 @@ class MediaResumeListenerTest : SysuiTestCase() { @Mock private lateinit var dumpManager: DumpManager @Captor lateinit var callbackCaptor: ArgumentCaptor<ResumeMediaBrowser.Callback> + @Captor lateinit var actionCaptor: ArgumentCaptor<Runnable> private lateinit var executor: FakeExecutor private lateinit var data: MediaData @@ -224,9 +225,6 @@ class MediaResumeListenerTest : SysuiTestCase() { // But we do not tell it to add new controls verify(mediaDataManager, never()) .addResumptionControls(anyInt(), any(), any(), any(), any(), any(), any()) - - // Finally, make sure the resume browser disconnected - verify(resumeBrowser).disconnect() } @Test @@ -267,4 +265,39 @@ class MediaResumeListenerTest : SysuiTestCase() { verify(mediaDataManager, times(3)).addResumptionControls(anyInt(), any(), any(), any(), any(), any(), eq(PACKAGE_NAME)) } + + @Test + fun testGetResumeAction_restarts() { + // Set up mocks to successfully find a MBS that returns valid media + val pm = mock(PackageManager::class.java) + whenever(mockContext.packageManager).thenReturn(pm) + val resolveInfo = ResolveInfo() + val serviceInfo = ServiceInfo() + serviceInfo.packageName = PACKAGE_NAME + resolveInfo.serviceInfo = serviceInfo + resolveInfo.serviceInfo.name = CLASS_NAME + val resumeInfo = listOf(resolveInfo) + whenever(pm.queryIntentServices(any(), anyInt())).thenReturn(resumeInfo) + + val description = MediaDescription.Builder().setTitle(TITLE).build() + val component = ComponentName(PACKAGE_NAME, CLASS_NAME) + whenever(resumeBrowser.testConnection()).thenAnswer { + callbackCaptor.value.addTrack(description, component, resumeBrowser) + } + + // When media data is loaded that has not been checked yet, and does have a MBS + val dataCopy = data.copy(resumeAction = null, hasCheckedForResume = false) + resumeListener.onMediaDataLoaded(KEY, null, dataCopy) + + // Then we test whether the service is valid and set the resume action + executor.runAllReady() + verify(resumeBrowser).testConnection() + verify(mediaDataManager).setResumeAction(eq(KEY), capture(actionCaptor)) + + // When the resume action is run + actionCaptor.value.run() + + // Then we call restart + verify(resumeBrowser).restart() + } }
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/ResumeMediaBrowserTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/ResumeMediaBrowserTest.kt index d26229edf71a..dfa7c66b38f9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/ResumeMediaBrowserTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/ResumeMediaBrowserTest.kt @@ -91,8 +91,9 @@ public class ResumeMediaBrowserTest : SysuiTestCase() { setupBrowserFailed() resumeBrowser.testConnection() - // Then it calls onError + // Then it calls onError and disconnects verify(callback).onError() + verify(browser).disconnect() } @Test @@ -111,8 +112,9 @@ public class ResumeMediaBrowserTest : SysuiTestCase() { setupBrowserConnectionNoResults() resumeBrowser.testConnection() - // Then it calls onError + // Then it calls onError and disconnects verify(callback).onError() + verify(browser).disconnect() } @Test @@ -132,8 +134,9 @@ public class ResumeMediaBrowserTest : SysuiTestCase() { setupBrowserFailed() resumeBrowser.findRecentMedia() - // Then it calls onError + // Then it calls onError and disconnects verify(callback).onError() + verify(browser).disconnect() } @Test @@ -143,8 +146,9 @@ public class ResumeMediaBrowserTest : SysuiTestCase() { whenever(browser.getRoot()).thenReturn(null) resumeBrowser.findRecentMedia() - // Then it calls onError + // Then it calls onError and disconnects verify(callback).onError() + verify(browser).disconnect() } @Test @@ -163,8 +167,9 @@ public class ResumeMediaBrowserTest : SysuiTestCase() { setupBrowserConnectionNoResults() resumeBrowser.findRecentMedia() - // Then it calls onError + // Then it calls onError and disconnects verify(callback).onError() + verify(browser).disconnect() } @Test @@ -173,8 +178,9 @@ public class ResumeMediaBrowserTest : SysuiTestCase() { setupBrowserConnectionNotPlayable() resumeBrowser.findRecentMedia() - // Then it calls onError + // Then it calls onError and disconnects verify(callback).onError() + verify(browser).disconnect() } @Test @@ -193,8 +199,9 @@ public class ResumeMediaBrowserTest : SysuiTestCase() { setupBrowserFailed() resumeBrowser.restart() - // Then it calls onError + // Then it calls onError and disconnects verify(callback).onError() + verify(browser).disconnect() } @Test @@ -202,13 +209,11 @@ public class ResumeMediaBrowserTest : SysuiTestCase() { // When restart is called and we connect successfully setupBrowserConnection() resumeBrowser.restart() + verify(callback).onConnected() // Then it creates a new controller and sends play command verify(transportControls).prepare() verify(transportControls).play() - - // Then it calls onConnected - verify(callback).onConnected() } /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java index 3b56f225ba04..67505c42ef9a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java @@ -69,6 +69,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.time.Duration; import java.util.Arrays; @RunWith(AndroidTestingRunner.class) @@ -185,6 +186,30 @@ public class PeopleTileViewHelperTest extends SysuiTestCase { } @Test + public void testLastInteractionTime() { + long now = System.currentTimeMillis(); + long fiveDaysAgo = now - Duration.ofDays(5).toMillis(); + String lastInteractionString = PeopleTileViewHelper.getLastInteractionString(mContext, + fiveDaysAgo); + assertThat(lastInteractionString).isEqualTo("5 days ago"); + + long lessThanOneDayAgo = now - Duration.ofHours(20).toMillis(); + lastInteractionString = PeopleTileViewHelper.getLastInteractionString(mContext, + lessThanOneDayAgo); + assertThat(lastInteractionString).isNull(); + + long overOneWeekAgo = now - Duration.ofDays(8).toMillis(); + lastInteractionString = PeopleTileViewHelper.getLastInteractionString(mContext, + overOneWeekAgo); + assertThat(lastInteractionString).isEqualTo("Over 1 week ago"); + + long overTwoWeeksAgo = now - Duration.ofDays(15).toMillis(); + lastInteractionString = PeopleTileViewHelper.getLastInteractionString(mContext, + overTwoWeeksAgo); + assertThat(lastInteractionString).isEqualTo("Over 2 weeks ago"); + } + + @Test public void testCreateRemoteViewsWithLastInteractionTime() { PeopleSpaceTile tileWithLastInteraction = PERSON_TILE_WITHOUT_NOTIFICATION.toBuilder().setLastInteractionTimestamp( diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java index 7533cf1310de..b09afab3d242 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java @@ -73,6 +73,7 @@ import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.settings.SecureSettings; +import com.android.systemui.wallet.controller.QuickAccessWalletController; import com.google.common.util.concurrent.MoreExecutors; @@ -119,6 +120,8 @@ public class QuickAccessWalletTileTest extends SysuiTestCase { @Mock private SecureSettings mSecureSettings; @Mock + private QuickAccessWalletController mController; + @Mock private FeatureFlags mFeatureFlags; @Captor ArgumentCaptor<Intent> mIntentCaptor; @@ -145,6 +148,8 @@ public class QuickAccessWalletTileTest extends SysuiTestCase { when(mQuickAccessWalletClient.getServiceLabel()).thenReturn(LABEL); when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true); when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true); + when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true); + when(mController.getWalletClient()).thenReturn(mQuickAccessWalletClient); mTile = new QuickAccessWalletTile( mHost, @@ -155,11 +160,11 @@ public class QuickAccessWalletTileTest extends SysuiTestCase { mStatusBarStateController, mActivityStarter, mQSLogger, - mQuickAccessWalletClient, mKeyguardStateController, mPackageManager, mSecureSettings, MoreExecutors.directExecutor(), + mController, mFeatureFlags); } @@ -175,6 +180,15 @@ public class QuickAccessWalletTileTest extends SysuiTestCase { } @Test + public void testWalletServiceUnavailable_recreateWalletClient() { + when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false); + + mTile.handleSetListening(true); + + verify(mController, times(1)).reCreateWalletClient(); + } + + @Test public void testIsAvailable_qawFeatureAvailable() { when(mPackageManager.hasSystemFeature(FEATURE_NFC_HOST_CARD_EMULATION)).thenReturn(true); when(mPackageManager.hasSystemFeature("org.chromium.arc")).thenReturn(false); @@ -330,17 +344,8 @@ public class QuickAccessWalletTileTest extends SysuiTestCase { public void testHandleSetListening_queryCards() { mTile.handleSetListening(true); - verify(mQuickAccessWalletClient) - .getWalletCards(any(), mRequestCaptor.capture(), mCallbackCaptor.capture()); + verify(mController).queryWalletCards(mCallbackCaptor.capture()); - GetWalletCardsRequest request = mRequestCaptor.getValue(); - assertEquals( - mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width), - request.getCardWidthPx()); - assertEquals( - mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_height), - request.getCardHeightPx()); - assertEquals(1, request.getMaxCards()); assertThat(mCallbackCaptor.getValue()).isInstanceOf( QuickAccessWalletClient.OnWalletCardsRetrievedCallback.class); } @@ -354,37 +359,6 @@ public class QuickAccessWalletTileTest extends SysuiTestCase { } @Test - public void testState_queryCards_hasCards_then_noCards() { - when(mKeyguardStateController.isUnlocked()).thenReturn(true); - GetWalletCardsResponse responseWithCards = - new GetWalletCardsResponse( - Collections.singletonList(createWalletCard(mContext)), 0); - GetWalletCardsResponse responseWithoutCards = - new GetWalletCardsResponse(Collections.EMPTY_LIST, 0); - - mTile.handleSetListening(true); - - verify(mQuickAccessWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture()); - - // query wallet cards, has cards - mCallbackCaptor.getValue().onWalletCardsRetrieved(responseWithCards); - mTestableLooper.processAllMessages(); - - assertNotNull(mTile.getState().sideViewCustomDrawable); - - mTile.handleSetListening(true); - - verify(mQuickAccessWalletClient, times(2)) - .getWalletCards(any(), any(), mCallbackCaptor.capture()); - - // query wallet cards, has no cards - mCallbackCaptor.getValue().onWalletCardsRetrieved(responseWithoutCards); - mTestableLooper.processAllMessages(); - - assertNull(mTile.getState().sideViewCustomDrawable); - } - - @Test public void testQueryCards_noCards_notUpdateSideViewDrawable() { setUpWalletCard(/* hasCard= */ false); @@ -398,7 +372,7 @@ public class QuickAccessWalletTileTest extends SysuiTestCase { mTile.handleSetListening(true); - verify(mQuickAccessWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture()); + verify(mController).queryWalletCards(mCallbackCaptor.capture()); mCallbackCaptor.getValue().onWalletCardRetrievalError(error); mTestableLooper.processAllMessages(); @@ -422,7 +396,7 @@ public class QuickAccessWalletTileTest extends SysuiTestCase { mTile.handleSetListening(true); - verify(mQuickAccessWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture()); + verify(mController).queryWalletCards(mCallbackCaptor.capture()); mCallbackCaptor.getValue().onWalletCardsRetrieved(response); mTestableLooper.processAllMessages(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt index 9b5c33d64eb9..116f807a888d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt @@ -511,6 +511,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { override fun setNextAlarm(image: Drawable?, description: String?) { } + + override fun setMediaTarget(target: SmartspaceTarget?) { + } }) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java index 6b4797fc5723..ee8d1209a5cb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java @@ -20,12 +20,15 @@ import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import static com.android.systemui.statusbar.StatusBarState.SHADE; +import static com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED; +import static com.android.systemui.statusbar.notification.ViewGroupFadeHelper.reset; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -39,7 +42,6 @@ import android.content.res.Resources; import android.hardware.biometrics.BiometricSourceType; import android.os.PowerManager; import android.os.UserManager; -import android.service.quickaccesswallet.QuickAccessWalletClient; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.util.DisplayMetrics; @@ -75,13 +77,17 @@ import com.android.systemui.biometrics.AuthController; import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.doze.DozeLog; +import com.android.systemui.fragments.FragmentHostManager; +import com.android.systemui.fragments.FragmentService; import com.android.systemui.media.KeyguardMediaController; import com.android.systemui.media.MediaDataManager; import com.android.systemui.media.MediaHierarchyManager; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.qs.QSDetailDisplayer; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.KeyguardAffordanceView; +import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.LockscreenShadeTransitionController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationShadeDepthController; @@ -105,6 +111,7 @@ import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.settings.SecureSettings; import com.android.systemui.util.time.FakeSystemClock; +import com.android.systemui.wallet.controller.QuickAccessWalletController; import com.android.wm.shell.animation.FlingAnimationUtils; import org.junit.Before; @@ -245,18 +252,28 @@ public class NotificationPanelViewTest extends SysuiTestCase { @Mock private LockIconViewController mLockIconViewController; @Mock - private QuickAccessWalletClient mQuickAccessWalletClient; - @Mock private KeyguardMediaController mKeyguardMediaController; @Mock private PrivacyDotViewController mPrivacyDotViewController; @Mock private SecureSettings mSecureSettings; + @Mock + private TapAgainViewController mTapAgainViewController; + @Mock + private KeyguardIndicationController mKeyguardIndicationController; + @Mock + private FragmentService mFragmentService; + @Mock + private FragmentHostManager mFragmentHostManager; + @Mock + private QuickAccessWalletController mQuickAccessWalletController; private SysuiStatusBarStateController mStatusBarStateController; private NotificationPanelViewController mNotificationPanelViewController; private View.AccessibilityDelegate mAccessibiltyDelegate; private NotificationsQuickSettingsContainer mNotificationContainerParent; + private List<View.OnAttachStateChangeListener> mOnAttachStateChangeListeners; + private FalsingManagerFake mFalsingManager = new FalsingManagerFake(); @Before public void setup() { @@ -297,6 +314,7 @@ public class NotificationPanelViewTest extends SysuiTestCase { mNotificationContainerParent.addView(newViewWithId(R.id.keyguard_status_view)); when(mView.findViewById(R.id.notification_container_parent)) .thenReturn(mNotificationContainerParent); + when(mFragmentService.getFragmentHostManager(mView)).thenReturn(mFragmentHostManager); FlingAnimationUtils.Builder flingAnimationUtilsBuilder = new FlingAnimationUtils.Builder( mDisplayMetrics); @@ -317,7 +335,7 @@ public class NotificationPanelViewTest extends SysuiTestCase { mKeyguardBypassController, mHeadsUpManager, mock(NotificationRoundnessManager.class), mStatusBarStateController, - new FalsingManagerFake(), + mFalsingManager, mLockscreenShadeTransitionController, new FalsingCollectorFake()); when(mKeyguardStatusViewComponentFactory.build(any())) @@ -331,11 +349,12 @@ public class NotificationPanelViewTest extends SysuiTestCase { when(mKeyguardStatusBarViewComponent.getKeyguardStatusBarViewController()) .thenReturn(mKeyguardStatusBarViewController); + reset(mView); mNotificationPanelViewController = new NotificationPanelViewController(mView, mResources, mLayoutInflater, coordinator, expansionHandler, mDynamicPrivacyController, mKeyguardBypassController, - new FalsingManagerFake(), new FalsingCollectorFake(), + mFalsingManager, new FalsingCollectorFake(), mNotificationLockscreenUserManager, mNotificationEntryManager, mKeyguardStateController, mStatusBarStateController, mDozeLog, mDozeParameters, mCommandQueue, mVibratorHelper, @@ -361,9 +380,11 @@ public class NotificationPanelViewTest extends SysuiTestCase { mAmbientState, mLockIconViewController, mFeatureFlags, - mQuickAccessWalletClient, mKeyguardMediaController, mPrivacyDotViewController, + mTapAgainViewController, + mFragmentService, + mQuickAccessWalletController, new FakeExecutor(new FakeSystemClock()), mSecureSettings); mNotificationPanelViewController.initDependencies( @@ -371,6 +392,13 @@ public class NotificationPanelViewTest extends SysuiTestCase { mNotificationShelfController); mNotificationPanelViewController.setHeadsUpManager(mHeadsUpManager); mNotificationPanelViewController.setBar(mPanelBar); + mNotificationPanelViewController.setKeyguardIndicationController( + mKeyguardIndicationController); + ArgumentCaptor<View.OnAttachStateChangeListener> onAttachStateChangeListenerArgumentCaptor = + ArgumentCaptor.forClass(View.OnAttachStateChangeListener.class); + verify(mView, atLeast(1)).addOnAttachStateChangeListener( + onAttachStateChangeListenerArgumentCaptor.capture()); + mOnAttachStateChangeListeners = onAttachStateChangeListenerArgumentCaptor.getAllValues(); ArgumentCaptor<View.AccessibilityDelegate> accessibilityDelegateArgumentCaptor = ArgumentCaptor.forClass(View.AccessibilityDelegate.class); @@ -616,6 +644,34 @@ public class NotificationPanelViewTest extends SysuiTestCase { verify(mKeyguardStateController).notifyPanelFlingEnd(); } + @Test + public void testDoubleTapRequired_Keyguard() { + FalsingManager.FalsingTapListener listener = getFalsingTapListener(); + mStatusBarStateController.setState(KEYGUARD); + + listener.onDoubleTapRequired(); + + verify(mKeyguardIndicationController).showTransientIndication(anyInt()); + } + + @Test + public void testDoubleTapRequired_ShadeLocked() { + FalsingManager.FalsingTapListener listener = getFalsingTapListener(); + mStatusBarStateController.setState(SHADE_LOCKED); + + listener.onDoubleTapRequired(); + + verify(mTapAgainViewController).show(); + } + + private FalsingManager.FalsingTapListener getFalsingTapListener() { + for (View.OnAttachStateChangeListener listener : mOnAttachStateChangeListeners) { + listener.onViewAttachedToWindow(mView); + } + assertThat(mFalsingManager.getTapListeners().size()).isEqualTo(1); + return mFalsingManager.getTapListeners().get(0); + } + private View newViewWithId(int id) { View view = new View(mContext); view.setId(id); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index a431a781dbb4..8b0b579bea54 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -1118,7 +1118,7 @@ public class ScrimControllerTest extends SysuiTestCase { public void testNotificationTransparency_inKeyguardState() { mScrimController.transitionTo(ScrimState.KEYGUARD); - assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.2f, /* expansion */ 0.8f); + assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.2f, /* expansion */ 0.4f); assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.8f, /* expansion */ 0.2f); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt new file mode 100644 index 000000000000..4796cd768980 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt @@ -0,0 +1,368 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone + +import android.graphics.Rect +import android.test.suitebuilder.annotation.SmallTest +import android.view.DisplayCutout +import android.view.WindowMetrics +import com.android.systemui.SysuiTestCase +import com.android.systemui.util.leak.RotationUtils +import com.android.systemui.util.leak.RotationUtils.ROTATION_LANDSCAPE +import com.android.systemui.util.leak.RotationUtils.ROTATION_NONE +import com.android.systemui.util.leak.RotationUtils.ROTATION_SEASCAPE +import com.android.systemui.util.leak.RotationUtils.ROTATION_UPSIDE_DOWN +import com.android.systemui.util.leak.RotationUtils.Rotation +import junit.framework.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.MockitoAnnotations + +@SmallTest +class StatusBarContentInsetsProviderTest : SysuiTestCase() { + @Mock private lateinit var dc: DisplayCutout + @Mock private lateinit var windowMetrics: WindowMetrics + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + } + + @Test + fun testGetBoundingRectForPrivacyChipForRotation_noCutout() { + val screenBounds = Rect(0, 0, 1080, 2160) + val roundedCornerPadding = 20 + val sbHeightPortrait = 100 + val sbHeightLandscape = 60 + val currentRotation = ROTATION_NONE + val chipWidth = 30 + val dotWidth = 10 + + `when`(windowMetrics.bounds).thenReturn(screenBounds) + + var isRtl = false + var targetRotation = ROTATION_NONE + var bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + null, + windowMetrics, + sbHeightPortrait, + roundedCornerPadding) + + var chipBounds = getPrivacyChipBoundingRectForInsets(bounds, dotWidth, chipWidth, isRtl) + /* 1080 - 20 (rounded corner) - 30 (chip), + * 0 (sb top) + * 1080 - 20 (rounded corner) + 10 ( dot), + * 100 (sb height portrait) + */ + var expected = Rect(1030, 0, 1070, 100) + assertRects(expected, chipBounds, currentRotation, targetRotation) + isRtl = true + chipBounds = getPrivacyChipBoundingRectForInsets(bounds, dotWidth, chipWidth, isRtl) + /* 0 + 20 (rounded corner) - 10 (dot), + * 0 (sb top) + * 0 + 20 (rounded corner) + 30 (chip), + * 100 (sb height portrait) + */ + expected = Rect(10, 0, 50, 100) + assertRects(expected, chipBounds, currentRotation, targetRotation) + + isRtl = false + targetRotation = ROTATION_LANDSCAPE + bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + dc, + windowMetrics, + sbHeightLandscape, + roundedCornerPadding) + + chipBounds = getPrivacyChipBoundingRectForInsets(bounds, dotWidth, chipWidth, isRtl) + /* 2160 - 20 (rounded corner) - 30 (chip), + * 0 (sb top) + * 2160 - 20 (rounded corner) + 10 ( dot), + * 60 (sb height landscape) + */ + expected = Rect(2110, 0, 2150, 60) + assertRects(expected, chipBounds, currentRotation, targetRotation) + isRtl = true + chipBounds = getPrivacyChipBoundingRectForInsets(bounds, dotWidth, chipWidth, isRtl) + /* 0 + 20 (rounded corner) - 10 (dot), + * 0 (sb top) + * 0 + 20 (rounded corner) + 30 (chip), + * 60 (sb height landscape) + */ + expected = Rect(10, 0, 50, 60) + assertRects(expected, chipBounds, currentRotation, targetRotation) + } + + @Test + fun testCalculateInsetsForRotationWithRotatedResources_topLeftCutout() { + // GIVEN a device in portrait mode with width < height and a display cutout in the top-left + val screenBounds = Rect(0, 0, 1080, 2160) + val dcBounds = Rect(0, 0, 100, 100) + val roundedCornerPadding = 20 + val sbHeightPortrait = 100 + val sbHeightLandscape = 60 + val currentRotation = ROTATION_NONE + + `when`(windowMetrics.bounds).thenReturn(screenBounds) + `when`(dc.boundingRects).thenReturn(listOf(dcBounds)) + + // THEN rotations which share a short side should use the greater value between rounded + // corner padding and the display cutout's size + var targetRotation = ROTATION_NONE + var expectedBounds = Rect(dcBounds.right, + 0, + screenBounds.right - roundedCornerPadding, + sbHeightPortrait) + + var bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + dc, + windowMetrics, + sbHeightPortrait, + roundedCornerPadding) + + assertRects(expectedBounds, bounds, currentRotation, targetRotation) + + targetRotation = ROTATION_LANDSCAPE + expectedBounds = Rect(dcBounds.height(), + 0, + screenBounds.height() - roundedCornerPadding, + sbHeightLandscape) + + bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + dc, + windowMetrics, + sbHeightLandscape, + roundedCornerPadding) + + assertRects(expectedBounds, bounds, currentRotation, targetRotation) + + // THEN the side that does NOT share a short side with the display cutout ignores the + // display cutout bounds + targetRotation = ROTATION_UPSIDE_DOWN + expectedBounds = Rect(roundedCornerPadding, + 0, + screenBounds.width() - roundedCornerPadding, + sbHeightPortrait) + + bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + dc, + windowMetrics, + sbHeightPortrait, + roundedCornerPadding) + + assertRects(expectedBounds, bounds, currentRotation, targetRotation) + + // Phone in portrait, seascape (rot_270) bounds + targetRotation = ROTATION_SEASCAPE + expectedBounds = Rect(roundedCornerPadding, + 0, + screenBounds.height() - dcBounds.height(), + sbHeightLandscape) + + bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + dc, + windowMetrics, + sbHeightLandscape, + roundedCornerPadding) + + assertRects(expectedBounds, bounds, currentRotation, targetRotation) + } + + @Test + fun testCalculateInsetsForRotationWithRotatedResources_nonCornerCutout() { + // GIVEN phone in portrait mode, where width < height and the cutout is not in the corner + // the assumption here is that if the cutout does NOT touch the corner then we have room to + // layout the status bar in the given space. + + val screenBounds = Rect(0, 0, 1080, 2160) + // cutout centered at the top + val dcBounds = Rect(490, 0, 590, 100) + val roundedCornerPadding = 20 + val sbHeightPortrait = 100 + val sbHeightLandscape = 60 + val currentRotation = ROTATION_NONE + + `when`(windowMetrics.bounds).thenReturn(screenBounds) + `when`(dc.boundingRects).thenReturn(listOf(dcBounds)) + + // THEN only the landscape/seascape rotations should avoid the cutout area because of the + // potential letterboxing + var targetRotation = ROTATION_NONE + var expectedBounds = Rect(roundedCornerPadding, + 0, + screenBounds.right - roundedCornerPadding, + sbHeightPortrait) + + var bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + dc, + windowMetrics, + sbHeightPortrait, + roundedCornerPadding) + + assertRects(expectedBounds, bounds, currentRotation, targetRotation) + + targetRotation = ROTATION_LANDSCAPE + expectedBounds = Rect(dcBounds.height(), + 0, + screenBounds.height() - roundedCornerPadding, + sbHeightLandscape) + + bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + dc, + windowMetrics, + sbHeightLandscape, + roundedCornerPadding) + + assertRects(expectedBounds, bounds, currentRotation, targetRotation) + + targetRotation = ROTATION_UPSIDE_DOWN + expectedBounds = Rect(roundedCornerPadding, + 0, + screenBounds.right - roundedCornerPadding, + sbHeightPortrait) + + bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + dc, + windowMetrics, + sbHeightPortrait, + roundedCornerPadding) + + assertRects(expectedBounds, bounds, currentRotation, targetRotation) + + targetRotation = ROTATION_SEASCAPE + expectedBounds = Rect(roundedCornerPadding, + 0, + screenBounds.height() - dcBounds.height(), + sbHeightLandscape) + + bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + dc, + windowMetrics, + sbHeightLandscape, + roundedCornerPadding) + + assertRects(expectedBounds, bounds, currentRotation, targetRotation) + } + + @Test + fun testCalculateInsetsForRotationWithRotatedResources_noCutout() { + // GIVEN device in portrait mode, where width < height and no cutout + val currentRotation = ROTATION_NONE + val screenBounds = Rect(0, 0, 1080, 2160) + val roundedCornerPadding = 20 + val sbHeightPortrait = 100 + val sbHeightLandscape = 60 + + `when`(windowMetrics.bounds).thenReturn(screenBounds) + + // THEN content insets should only use rounded corner padding + var targetRotation = ROTATION_NONE + var expectedBounds = Rect(roundedCornerPadding, + 0, + screenBounds.right - roundedCornerPadding, + sbHeightPortrait) + + var bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + null, /* no cutout */ + windowMetrics, + sbHeightPortrait, + roundedCornerPadding) + assertRects(expectedBounds, bounds, currentRotation, targetRotation) + + targetRotation = ROTATION_LANDSCAPE + expectedBounds = Rect(roundedCornerPadding, + 0, + screenBounds.height() - roundedCornerPadding, + sbHeightLandscape) + + bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + null, /* no cutout */ + windowMetrics, + sbHeightLandscape, + roundedCornerPadding) + assertRects(expectedBounds, bounds, currentRotation, targetRotation) + + targetRotation = ROTATION_UPSIDE_DOWN + expectedBounds = Rect(roundedCornerPadding, + 0, + screenBounds.width() - roundedCornerPadding, + sbHeightPortrait) + + bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + null, /* no cutout */ + windowMetrics, + sbHeightPortrait, + roundedCornerPadding) + assertRects(expectedBounds, bounds, currentRotation, targetRotation) + + targetRotation = ROTATION_LANDSCAPE + expectedBounds = Rect(roundedCornerPadding, + 0, + screenBounds.height() - roundedCornerPadding, + sbHeightLandscape) + + bounds = calculateInsetsForRotationWithRotatedResources( + currentRotation, + targetRotation, + null, /* no cutout */ + windowMetrics, + sbHeightLandscape, + roundedCornerPadding) + assertRects(expectedBounds, bounds, currentRotation, targetRotation) + } + + private fun assertRects( + expected: Rect, + actual: Rect, + @Rotation currentRotation: Int, + @Rotation targetRotation: Int + ) { + assertTrue( + "Rects must match. currentRotation=${RotationUtils.toString(currentRotation)}" + + " targetRotation=${RotationUtils.toString(targetRotation)}" + + " expected=$expected actual=$actual", + expected.equals(actual)) + } +}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java index be86af585fc5..407afbe1f33e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java @@ -269,7 +269,7 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { verify(mShadeController, atLeastOnce()).collapsePanel(); verify(mActivityLaunchAnimator).startPendingIntentWithAnimation(any(), - eq(false) /* animate */, any()); + eq(false) /* animate */, any(), any()); verify(mAssistManager).hideAssist(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java index 53a2efce9bb8..4b87ec895773 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java @@ -32,6 +32,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; +import com.android.systemui.shared.system.smartspace.SmartspaceTransitionController; import org.junit.Before; import org.junit.Test; @@ -49,12 +50,14 @@ public class KeyguardStateControllerTest extends SysuiTestCase { @Mock private LockPatternUtils mLockPatternUtils; private KeyguardStateController mKeyguardStateController; + @Mock + private SmartspaceTransitionController mSmartSpaceTransitionController; @Before public void setup() { MockitoAnnotations.initMocks(this); mKeyguardStateController = new KeyguardStateControllerImpl(mContext, - mKeyguardUpdateMonitor, mLockPatternUtils); + mKeyguardUpdateMonitor, mLockPatternUtils, mSmartSpaceTransitionController); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java index 714998702146..cfaffd08a1a7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java @@ -258,6 +258,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), anyInt())) .thenReturn(jsonString); when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_LOCK)).thenReturn(20); + when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_SYSTEM)).thenReturn(21); mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM); @@ -302,6 +303,63 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { } @Test + public void onWallpaperColorsChanged_ResetThemeWhenFromLatestWallpaper() { + // Should ask for a new theme when the colors of the last applied wallpaper change + WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED), + Color.valueOf(Color.BLUE), null); + + String jsonString = + "{\"android.theme.customization.system_palette\":\"override.package.name\"," + + "\"android.theme.customization.color_source\":\"home_wallpaper\"," + + "\"android.theme.customization.color_index\":\"2\"}"; + + when(mSecureSettings.getStringForUser( + eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), anyInt())) + .thenReturn(jsonString); + when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_LOCK)).thenReturn(1); + // SYSTEM wallpaper is the last applied one + when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_SYSTEM)).thenReturn(2); + + mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM); + + ArgumentCaptor<String> updatedSetting = ArgumentCaptor.forClass(String.class); + verify(mSecureSettings).putString( + eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), updatedSetting.capture()); + + verify(mThemeOverlayApplier) + .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + } + + @Test + public void onWallpaperColorsChanged_keepThemeIfNotLatestWallpaper() { + // Shouldn't ask for a new theme when the colors of the wallpaper that is not the last + // applied one change + WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED), + Color.valueOf(Color.BLUE), null); + + String jsonString = + "{\"android.theme.customization.system_palette\":\"override.package.name\"," + + "\"android.theme.customization.color_source\":\"home_wallpaper\"," + + "\"android.theme.customization.color_index\":\"2\"}"; + + when(mSecureSettings.getStringForUser( + eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), anyInt())) + .thenReturn(jsonString); + when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_LOCK)).thenReturn(1); + // SYSTEM wallpaper is the last applied one + when(mWallpaperManager.getWallpaperId(WallpaperManager.FLAG_SYSTEM)).thenReturn(2); + + mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_LOCK); + + verify(mSecureSettings, never()).putString( + eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), any()); + + + verify(mThemeOverlayApplier, never()) + .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + } + + @Test public void onProfileAdded_setsTheme() { mBroadcastReceiver.getValue().onReceive(null, new Intent(Intent.ACTION_MANAGED_PROFILE_ADDED)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java b/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java index 365c62cddbdf..9b177e1cd0e5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java @@ -17,7 +17,6 @@ package com.android.systemui.toast; import static android.view.accessibility.AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED; -import static android.widget.ToastPresenter.TEXT_TOAST_LAYOUT; import static com.google.common.truth.Truth.assertThat; @@ -31,13 +30,20 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.Application; import android.app.INotificationManager; import android.app.ITransientNotificationCallback; import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.os.Binder; +import android.os.Build; import android.os.Parcel; import android.os.Parcelable; +import android.os.RemoteException; +import android.os.UserHandle; import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -47,12 +53,11 @@ import android.view.accessibility.IAccessibilityManager; import android.widget.FrameLayout; import android.widget.TextView; import android.widget.Toast; -import android.widget.ToastPresenter; import androidx.test.filters.SmallTest; -import com.android.internal.R; import com.android.internal.util.IntPair; +import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; import com.android.systemui.shared.plugins.PluginManager; @@ -70,6 +75,7 @@ import org.mockito.stubbing.Answer; @SmallTest @RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper public class ToastUITest extends SysuiTestCase { private static final int ANDROID_UID = 1000; private static final int SYSTEMUI_UID = 10140; @@ -85,12 +91,14 @@ public class ToastUITest extends SysuiTestCase { private static final Binder WINDOW_TOKEN_2 = new Binder(); private static final String TEXT = "Hello World"; - private static final int MESSAGE_RES_ID = R.id.message; + private static final int MESSAGE_RES_ID = R.id.text; private Context mContextSpy; private ToastUI mToastUI; - @Mock private LayoutInflater mLayoutInflater; + private View mToastView; + @Mock private Application mApplication; @Mock private CommandQueue mCommandQueue; + @Mock private LayoutInflater mLayoutInflater; @Mock private WindowManager mWindowManager; @Mock private INotificationManager mNotificationManager; @Mock private IAccessibilityManager mAccessibilityManager; @@ -98,6 +106,7 @@ public class ToastUITest extends SysuiTestCase { @Mock private DumpManager mDumpManager; @Mock private ToastLogger mToastLogger; @Mock private FeatureFlags mFeatureFlags; + @Mock private PackageManager mPackageManager; @Mock private ITransientNotificationCallback mCallback; @Captor private ArgumentCaptor<View> mViewCaptor; @@ -106,29 +115,33 @@ public class ToastUITest extends SysuiTestCase { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - when(mLayoutInflater.inflate(eq(TEXT_TOAST_LAYOUT), any())).thenReturn( - ToastPresenter.getTextToastView(mContext, TEXT)); - when(mFeatureFlags.isToastStyleEnabled()).thenReturn(false); - + mToastView = LayoutInflater.from(mContext).inflate(R.layout.text_toast, null); + when(mLayoutInflater.inflate(anyInt(), eq(null))).thenReturn(mToastView); mContext.addMockSystemService(WindowManager.class, mWindowManager); mContextSpy = spy(mContext); + when(mContextSpy.getPackageManager()).thenReturn(mPackageManager); doReturn(mContextSpy).when(mContextSpy).createContextAsUser(any(), anyInt()); - - doReturn(mContextSpy).when(mContextSpy).createContextAsUser(any(), anyInt()); - mToastUI = new ToastUI(mContextSpy, mCommandQueue, mNotificationManager, - mAccessibilityManager, new ToastFactory(mLayoutInflater, mPluginManager, - mDumpManager, mFeatureFlags), mToastLogger); + mToastUI = new ToastUI( + mContextSpy, + mCommandQueue, + mNotificationManager, + mAccessibilityManager, + new ToastFactory( + mLayoutInflater, + mPluginManager, + mDumpManager), + mToastLogger); } @Test - public void testStart_addToastUIAsCallbackToCommandQueue() throws Exception { + public void testStart_addToastUIAsCallbackToCommandQueue() { mToastUI.start(); verify(mCommandQueue).addCallback(mToastUI); } @Test - public void testShowToast_addsCorrectViewToWindowManager() throws Exception { + public void testShowToast_addsCorrectViewToWindowManager() { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, null); @@ -138,7 +151,7 @@ public class ToastUITest extends SysuiTestCase { } @Test - public void testShowToast_addsViewWithCorrectLayoutParamsToWindowManager() throws Exception { + public void testShowToast_addsViewWithCorrectLayoutParamsToWindowManager() { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, null); @@ -217,9 +230,14 @@ public class ToastUITest extends SysuiTestCase { public void testHideToast_removesView() throws Exception { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, mCallback); - View view = verifyWmAddViewAndAttachToParent(); + final SystemUIToast toast = mToastUI.mToast; + View view = verifyWmAddViewAndAttachToParent(); mToastUI.hideToast(PACKAGE_NAME_1, TOKEN_1); + if (toast.getOutAnimation() != null) { + assertThat(toast.getOutAnimation().isRunning()).isTrue(); + toast.getOutAnimation().cancel(); // if applicable, try to finish anim early + } verify(mWindowManager).removeViewImmediate(view); } @@ -228,51 +246,81 @@ public class ToastUITest extends SysuiTestCase { public void testHideToast_finishesToken() throws Exception { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, mCallback); + final SystemUIToast toast = mToastUI.mToast; + verifyWmAddViewAndAttachToParent(); mToastUI.hideToast(PACKAGE_NAME_1, TOKEN_1); + if (toast.getOutAnimation() != null) { + assertThat(toast.getOutAnimation().isRunning()).isTrue(); + toast.getOutAnimation().cancel(); // if applicable, try to finish anim early + } verify(mNotificationManager).finishToken(PACKAGE_NAME_1, TOKEN_1); } @Test - public void testHideToast_callsCallback() throws Exception { + public void testHideToast_callsCallback() throws RemoteException { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, mCallback); + final SystemUIToast toast = mToastUI.mToast; + verifyWmAddViewAndAttachToParent(); mToastUI.hideToast(PACKAGE_NAME_1, TOKEN_1); + if (toast.getOutAnimation() != null) { + assertThat(toast.getOutAnimation().isRunning()).isTrue(); + toast.getOutAnimation().cancel(); + } verify(mCallback).onToastHidden(); } @Test - public void testHideToast_whenNotCurrentToastToken_doesNotHideToast() throws Exception { + public void testHideToast_whenNotCurrentToastToken_doesNotHideToast() throws RemoteException { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, mCallback); + final SystemUIToast toast = mToastUI.mToast; + verifyWmAddViewAndAttachToParent(); mToastUI.hideToast(PACKAGE_NAME_1, TOKEN_2); + if (toast.getOutAnimation() != null) { + assertThat(toast.getOutAnimation().isRunning()).isFalse(); + } + verify(mCallback, never()).onToastHidden(); } @Test - public void testHideToast_whenNotCurrentToastPackage_doesNotHideToast() throws Exception { + public void testHideToast_whenNotCurrentToastPackage_doesNotHideToast() throws RemoteException { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, mCallback); + final SystemUIToast toast = mToastUI.mToast; + verifyWmAddViewAndAttachToParent(); mToastUI.hideToast(PACKAGE_NAME_2, TOKEN_1); + if (toast.getOutAnimation() != null) { + assertThat(toast.getOutAnimation().isRunning()).isFalse(); + } + verify(mCallback, never()).onToastHidden(); } @Test - public void testShowToast_afterShowToast_hidesCurrentToast() throws Exception { + public void testShowToast_afterShowToast_hidesCurrentToast() throws RemoteException { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, mCallback); - View view = verifyWmAddViewAndAttachToParent(); + final SystemUIToast toast = mToastUI.mToast; + View view = verifyWmAddViewAndAttachToParent(); mToastUI.showToast(UID_2, PACKAGE_NAME_2, TOKEN_2, TEXT, WINDOW_TOKEN_2, Toast.LENGTH_LONG, null); + if (toast.getOutAnimation() != null) { + assertThat(toast.getOutAnimation().isRunning()).isTrue(); + toast.getOutAnimation().cancel(); // end early if applicable + } + verify(mWindowManager).removeViewImmediate(view); verify(mNotificationManager).finishToken(PACKAGE_NAME_1, TOKEN_1); verify(mCallback).onToastHidden(); @@ -287,9 +335,48 @@ public class ToastUITest extends SysuiTestCase { } @Test + public void testShowToast_targetsPreS_unlimitedLines_noAppIcon() + throws PackageManager.NameNotFoundException { + // GIVEN the application targets R + ApplicationInfo applicationInfo = new ApplicationInfo(); + applicationInfo.targetSdkVersion = Build.VERSION_CODES.R; + when(mPackageManager.getApplicationInfoAsUser(PACKAGE_NAME_1, 0, + UserHandle.getUserHandleForUid(UID_1).getIdentifier())).thenReturn(applicationInfo); + + // WHEN the package posts a toast + mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, + mCallback); + + // THEN the view can have unlimited lines + assertThat(((TextView) mToastUI.mToast.getView() + .findViewById(com.android.systemui.R.id.text)) + .getMaxLines()).isEqualTo(Integer.MAX_VALUE); + } + + @Test + public void testShowToast_targetsS_twoLineLimit_noAppIcon() + throws PackageManager.NameNotFoundException { + // GIVEN the application targets S + ApplicationInfo applicationInfo = new ApplicationInfo(); + applicationInfo.targetSdkVersion = Build.VERSION_CODES.S; + when(mPackageManager.getApplicationInfoAsUser(PACKAGE_NAME_1, 0, + UserHandle.getUserHandleForUid(UID_1).getIdentifier())).thenReturn(applicationInfo); + + // WHEN the package posts a toast + mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, + mCallback); + + // THEN the view is limited to 2 lines + assertThat(((TextView) mToastUI.mToast.getView() + .findViewById(com.android.systemui.R.id.text)) + .getMaxLines()).isEqualTo(2); + } + + @Test public void testHideToast_logs() { mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, mCallback); + verifyWmAddViewAndAttachToParent(); mToastUI.hideToast(PACKAGE_NAME_1, TOKEN_1); verify(mToastLogger).logOnHideToast(PACKAGE_NAME_1, TOKEN_1.toString()); } @@ -298,6 +385,7 @@ public class ToastUITest extends SysuiTestCase { public void testHideToast_error_noLog() { // no toast was shown, so this hide is invalid mToastUI.hideToast(PACKAGE_NAME_1, TOKEN_1); + assertThat(mToastUI.mToast).isNull(); verify(mToastLogger, never()).logOnHideToast(PACKAGE_NAME_1, TOKEN_1.toString()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/concurrency/FakeThreadFactory.java b/packages/SystemUI/tests/src/com/android/systemui/util/concurrency/FakeThreadFactory.java index 570e1d86574e..301a157bd42e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/concurrency/FakeThreadFactory.java +++ b/packages/SystemUI/tests/src/com/android/systemui/util/concurrency/FakeThreadFactory.java @@ -27,6 +27,7 @@ import java.util.concurrent.Executor; public class FakeThreadFactory implements ThreadFactory { private final FakeExecutor mFakeExecutor; private Handler mHandler; + private Looper mLooper; public FakeThreadFactory(FakeExecutor fakeExecutor) { mFakeExecutor = fakeExecutor; @@ -36,8 +37,17 @@ public class FakeThreadFactory implements ThreadFactory { mHandler = handler; } + public void setLooper(Looper looper) { + mLooper = looper; + } + + @Override + public Looper buildLooperOnNewThread(String threadName) { + return mLooper; + } + @Override - public Handler builderHandlerOnNewThread(String threadName) { + public Handler buildHandlerOnNewThread(String threadName) { return mHandler; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeKeyguardStateController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeKeyguardStateController.java index 5fb779adc5be..1aebf1c1c80d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeKeyguardStateController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeKeyguardStateController.java @@ -127,4 +127,9 @@ public class FakeKeyguardStateController implements KeyguardStateController { public void notifyPanelFlingEnd() { } + + @Override + public boolean canPerformSmartSpaceTransition() { + return false; + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java index 6166cd76e005..5c0efd36fcd1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java @@ -23,29 +23,37 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.NotificationManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.IntentFilter; +import android.content.pm.PackageManager; import android.media.AudioManager; +import android.media.IAudioService; import android.media.session.MediaSession; import android.os.Handler; import android.os.Process; +import android.os.Vibrator; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.view.accessibility.AccessibilityManager; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.keyguard.WakefulnessLifecycle; -import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.util.RingerModeLiveData; import com.android.systemui.util.RingerModeTracker; +import com.android.systemui.util.concurrency.FakeExecutor; +import com.android.systemui.util.concurrency.FakeThreadFactory; +import com.android.systemui.util.concurrency.ThreadFactory; +import com.android.systemui.util.time.FakeSystemClock; -import org.junit.After; 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; @@ -58,7 +66,6 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase { TestableVolumeDialogControllerImpl mVolumeController; VolumeDialogControllerImpl.C mCallback; - StatusBar mStatusBar; @Mock private BroadcastDispatcher mBroadcastDispatcher; @Mock @@ -67,6 +74,23 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase { private RingerModeLiveData mRingerModeLiveData; @Mock private RingerModeLiveData mRingerModeInternalLiveData; + private final FakeThreadFactory mThreadFactory = new FakeThreadFactory( + new FakeExecutor(new FakeSystemClock())); + @Mock + private AudioManager mAudioManager; + @Mock + private NotificationManager mNotificationManager; + @Mock + private Vibrator mVibrator; + @Mock + private IAudioService mIAudioService; + @Mock + private AccessibilityManager mAccessibilityManager; + @Mock + private PackageManager mPackageManager; + @Mock + private WakefulnessLifecycle mWakefullnessLifcycle; + @Before public void setup() throws Exception { @@ -77,19 +101,15 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase { // Initial non-set value when(mRingerModeLiveData.getValue()).thenReturn(-1); when(mRingerModeInternalLiveData.getValue()).thenReturn(-1); - mCallback = mock(VolumeDialogControllerImpl.C.class); - mStatusBar = mock(StatusBar.class); - mVolumeController = new TestableVolumeDialogControllerImpl(mContext, mCallback, mStatusBar, - mBroadcastDispatcher, mRingerModeTracker); + mThreadFactory.setLooper(TestableLooper.get(this).getLooper()); + mVolumeController = new TestableVolumeDialogControllerImpl(mContext, + mBroadcastDispatcher, mRingerModeTracker, mThreadFactory, mAudioManager, + mNotificationManager, Optional.of(mVibrator), mIAudioService, mAccessibilityManager, + mPackageManager, mWakefullnessLifcycle, mCallback); mVolumeController.setEnableDialogs(true, true); } - @After - public void tearDown() { - mVolumeController.destroy(); - } - @Test public void testRegisteredWithDispatcher() { verify(mBroadcastDispatcher).registerReceiverWithHandler(any(BroadcastReceiver.class), @@ -99,45 +119,36 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase { @Test public void testVolumeChangeW_deviceNotInteractiveAOD() { - when(mStatusBar.isDeviceInteractive()).thenReturn(false); - when(mStatusBar.getWakefulnessState()).thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE); + mVolumeController.setDeviceInteractive(false); + when(mWakefullnessLifcycle.getWakefulness()).thenReturn( + WakefulnessLifecycle.WAKEFULNESS_AWAKE); mVolumeController.onVolumeChangedW(0, AudioManager.FLAG_SHOW_UI); verify(mCallback, never()).onShowRequested(Events.SHOW_REASON_VOLUME_CHANGED); } @Test public void testVolumeChangeW_deviceInteractive() { - when(mStatusBar.isDeviceInteractive()).thenReturn(true); - when(mStatusBar.getWakefulnessState()).thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE); + mVolumeController.setDeviceInteractive(true); + when(mWakefullnessLifcycle.getWakefulness()).thenReturn( + WakefulnessLifecycle.WAKEFULNESS_AWAKE); mVolumeController.onVolumeChangedW(0, AudioManager.FLAG_SHOW_UI); verify(mCallback, times(1)).onShowRequested(Events.SHOW_REASON_VOLUME_CHANGED); } @Test public void testVolumeChangeW_deviceInteractive_StartedSleeping() { - when(mStatusBar.isDeviceInteractive()).thenReturn(true); - when(mStatusBar.getWakefulnessState()).thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE); + mVolumeController.setDeviceInteractive(true); + when(mWakefullnessLifcycle.getWakefulness()).thenReturn( + WakefulnessLifecycle.WAKEFULNESS_AWAKE); mVolumeController.onVolumeChangedW(0, AudioManager.FLAG_SHOW_UI); - when(mStatusBar.isDeviceInteractive()).thenReturn(false); - when(mStatusBar.getWakefulnessState()).thenReturn( + mVolumeController.setDeviceInteractive(false); + when(mWakefullnessLifcycle.getWakefulness()).thenReturn( WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP); mVolumeController.onVolumeChangedW(0, AudioManager.FLAG_SHOW_UI); verify(mCallback, times(1)).onShowRequested(Events.SHOW_REASON_VOLUME_CHANGED); } @Test - public void testVolumeChangeW_nullStatusBar() { - VolumeDialogControllerImpl.C callback = mock(VolumeDialogControllerImpl.C.class); - TestableVolumeDialogControllerImpl - nullStatusBarTestableDialog = - new TestableVolumeDialogControllerImpl( - mContext, callback, null, mBroadcastDispatcher, mRingerModeTracker); - nullStatusBarTestableDialog.setEnableDialogs(true, true); - nullStatusBarTestableDialog.onVolumeChangedW(0, AudioManager.FLAG_SHOW_UI); - verify(callback, times(1)).onShowRequested(Events.SHOW_REASON_VOLUME_CHANGED); - } - - @Test public void testOnRemoteVolumeChanged_newStream_noNullPointer() { MediaSession.Token token = new MediaSession.Token(Process.myUid(), null); mVolumeController.mMediaSessionsCallbacksW.onRemoteVolumeChanged(token, 0); @@ -155,22 +166,51 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase { verify(mRingerModeInternalLiveData).observeForever(any()); } - @Test - public void testRingerModeOnDestroy_observersRemoved() { - mVolumeController.destroy(); - - verify(mRingerModeLiveData).removeObserver(any()); - verify(mRingerModeInternalLiveData).removeObserver(any()); - } - static class TestableVolumeDialogControllerImpl extends VolumeDialogControllerImpl { - TestableVolumeDialogControllerImpl(Context context, C callback, StatusBar s, - BroadcastDispatcher broadcastDispatcher, RingerModeTracker ringerModeTracker) { - super( - context, broadcastDispatcher, - s == null ? Optional.empty() : Optional.of(() -> s), ringerModeTracker); + private final WakefulnessLifecycle.Observer mWakefullessLifecycleObserver; + + TestableVolumeDialogControllerImpl( + Context context, + BroadcastDispatcher broadcastDispatcher, + RingerModeTracker ringerModeTracker, + ThreadFactory theadFactory, + AudioManager audioManager, + NotificationManager notificationManager, + Optional<Vibrator> optionalVibrator, + IAudioService iAudioService, + AccessibilityManager accessibilityManager, + PackageManager packageManager, + WakefulnessLifecycle wakefulnessLifecycle, + C callback) { + super(context, broadcastDispatcher, ringerModeTracker, theadFactory, audioManager, + notificationManager, optionalVibrator, iAudioService, accessibilityManager, + packageManager, wakefulnessLifecycle); mCallbacks = callback; + + ArgumentCaptor<WakefulnessLifecycle.Observer> observerCaptor = + ArgumentCaptor.forClass(WakefulnessLifecycle.Observer.class); + verify(wakefulnessLifecycle).addObserver(observerCaptor.capture()); + mWakefullessLifecycleObserver = observerCaptor.getValue(); + } + + public void setDeviceInteractive(boolean interactive) { + if (interactive) { + mWakefullessLifecycleObserver.onStartedWakingUp(); + } else { + mWakefullessLifecycleObserver.onFinishedGoingToSleep(); + } } } +// static class TestableVolumeDialogControllerImpl extends VolumeDialogControllerImpl { +// TestableVolumeDialogControllerImpl(Context context, C callback, +// BroadcastDispatcher broadcastDispatcher, RingerModeTracker ringerModeTracker, +// ThreadFactory threadFactory) { +// super( +// context, broadcastDispatcher, +// s == null ? Optional.empty() : Optional.of(() -> s), ringerModeTracker); +// mCallbacks = callback; +// } +// } + } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java new file mode 100644 index 000000000000..33666bc5b462 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2021 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.wallet.controller; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.service.quickaccesswallet.GetWalletCardsRequest; +import android.service.quickaccesswallet.QuickAccessWalletClient; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; + +import androidx.test.filters.SmallTest; + +import com.android.systemui.R; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.util.settings.SecureSettings; + +import com.google.common.util.concurrent.MoreExecutors; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper +@SmallTest +public class QuickAccessWalletControllerTest extends SysuiTestCase { + + @Mock + private QuickAccessWalletClient mQuickAccessWalletClient; + @Mock + private SecureSettings mSecureSettings; + @Mock + private QuickAccessWalletClient.OnWalletCardsRetrievedCallback mCardsRetriever; + @Captor + private ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor; + + private QuickAccessWalletController mController; + private TestableLooper mTestableLooper; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mTestableLooper = TestableLooper.get(this); + when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true); + when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true); + when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true); + + mController = new QuickAccessWalletController( + mContext, + MoreExecutors.directExecutor(), + mSecureSettings, + mQuickAccessWalletClient); + } + + @Test + public void walletEnabled() { + mController.updateWalletPreference(); + + assertTrue(mController.isWalletEnabled()); + } + + @Test + public void walletServiceUnavailable_walletNotEnabled() { + when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false); + + mController.updateWalletPreference(); + + assertFalse(mController.isWalletEnabled()); + } + + @Test + public void walletFeatureUnavailable_walletNotEnabled() { + when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false); + + mController.updateWalletPreference(); + + assertFalse(mController.isWalletEnabled()); + } + + @Test + public void walletFeatureWhenLockedUnavailable_walletNotEnabled() { + when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(false); + + mController.updateWalletPreference(); + + assertFalse(mController.isWalletEnabled()); + } + + @Test + public void getWalletClient_NoRecreation_sameClient() { + assertSame(mQuickAccessWalletClient, mController.getWalletClient()); + } + + @Test + public void getWalletClient_reCreateClient_notSameClient() { + mController.reCreateWalletClient(); + + assertNotSame(mQuickAccessWalletClient, mController.getWalletClient()); + } + + @Test + public void queryWalletCards_walletNotEnabled_notQuery() { + when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false); + + mController.queryWalletCards(mCardsRetriever); + + verify(mQuickAccessWalletClient, never()).getWalletCards(any(), any(), any()); + } + + @Test + public void queryWalletCards_walletEnabled_queryCards() { + mController.updateWalletPreference(); + mController.queryWalletCards(mCardsRetriever); + + verify(mQuickAccessWalletClient) + .getWalletCards( + eq(MoreExecutors.directExecutor()), + mRequestCaptor.capture(), + eq(mCardsRetriever)); + + GetWalletCardsRequest request = mRequestCaptor.getValue(); + assertEquals(1, mRequestCaptor.getValue().getMaxCards()); + assertEquals( + mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width), + request.getCardWidthPx()); + assertEquals( + mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_height), + request.getCardHeightPx()); + } +} diff --git a/services/Android.bp b/services/Android.bp index 1dd219264575..c83a697a71c1 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -72,17 +72,6 @@ filegroup { visibility: ["//visibility:private"], } -filegroup { - name: "services-all-sources", - srcs: [ - ":services-non-updatable-sources", - ":service-media-s-sources", - ":service-permission-sources", - ":service-statsd-sources", - ], - visibility: ["//visibility:private"], -} - java_library { name: "Slogf", srcs: ["core/java/com/android/server/utils/Slogf.java"], @@ -141,7 +130,6 @@ java_library { libs: [ "android.hidl.manager-V1.0-java", "framework-tethering.stubs.module_lib", - "service-art.stubs.system_server", ], // Uncomment to enable output of certain warnings (deprecated, unchecked) diff --git a/services/core/java/com/android/server/PersistentDataBlockService.java b/services/core/java/com/android/server/PersistentDataBlockService.java index 6e7771d9c4c1..e336b6bafac4 100644 --- a/services/core/java/com/android/server/PersistentDataBlockService.java +++ b/services/core/java/com/android/server/PersistentDataBlockService.java @@ -39,11 +39,9 @@ import com.android.internal.annotations.GuardedBy; import libcore.io.IoUtils; import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; @@ -377,11 +375,16 @@ public class PersistentDataBlockService extends SystemService { try { FileChannel channel = getBlockOutputChannel(); - ByteBuffer buf = ByteBuffer.allocate(DIGEST_SIZE_BYTES + HEADER_SIZE); + int header_size = DIGEST_SIZE_BYTES + HEADER_SIZE; + ByteBuffer buf = ByteBuffer.allocate(header_size); buf.put(new byte[DIGEST_SIZE_BYTES]); buf.putInt(PARTITION_TYPE_MARKER); buf.putInt(0); channel.write(buf); + // corrupt the payload explicitly + int payload_size = (int) getBlockDeviceSize() - header_size; + buf = ByteBuffer.allocate(payload_size); + channel.write(buf); channel.force(true); } catch (IOException e) { Slog.e(TAG, "failed to format block", e); diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java index dc8f84a2f243..85eadf5a5137 100644 --- a/services/core/java/com/android/server/UiModeManagerService.java +++ b/services/core/java/com/android/server/UiModeManagerService.java @@ -754,8 +754,7 @@ final class UiModeManagerService extends SystemService { } @Override - public void setApplicationNightMode(@UiModeManager.NightMode int mode) - throws RemoteException { + public void setApplicationNightMode(@UiModeManager.NightMode int mode) { switch (mode) { case UiModeManager.MODE_NIGHT_NO: case UiModeManager.MODE_NIGHT_YES: @@ -776,14 +775,10 @@ final class UiModeManagerService extends SystemService { default: configNightMode = Configuration.UI_MODE_NIGHT_UNDEFINED; } - try { - final ActivityTaskManagerInternal.PackageConfigurationUpdater updater = - mActivityTaskManager.createPackageConfigurationUpdater(); - updater.setNightMode(configNightMode); - updater.commit(); - } catch (RemoteException e) { - throw e; - } + final ActivityTaskManagerInternal.PackageConfigurationUpdater updater = + mActivityTaskManager.createPackageConfigurationUpdater(); + updater.setNightMode(configNightMode); + updater.commit(); } @Override diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java index e7e3ce9d2d61..7e2274b65f55 100644 --- a/services/core/java/com/android/server/VcnManagementService.java +++ b/services/core/java/com/android/server/VcnManagementService.java @@ -64,6 +64,7 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.ArrayMap; +import android.util.LocalLog; import android.util.Log; import android.util.Slog; @@ -148,6 +149,11 @@ import java.util.concurrent.TimeUnit; // TODO(b/180451994): ensure all incoming + outgoing calls have a cleared calling identity public class VcnManagementService extends IVcnManagementService.Stub { @NonNull private static final String TAG = VcnManagementService.class.getSimpleName(); + private static final long DUMP_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(5); + private static final int LOCAL_LOG_LINE_COUNT = 128; + + // Public for use in all other VCN classes + @NonNull public static final LocalLog LOCAL_LOG = new LocalLog(LOCAL_LOG_LINE_COUNT); public static final boolean VDBG = false; // STOPSHIP: if true @@ -241,13 +247,13 @@ public class VcnManagementService extends IVcnManagementService.Stub { try { configBundle = mConfigDiskRwHelper.readFromDisk(); } catch (IOException e1) { - Slog.e(TAG, "Failed to read configs from disk; retrying", e1); + logErr("Failed to read configs from disk; retrying", e1); // Retry immediately. The IOException may have been transient. try { configBundle = mConfigDiskRwHelper.readFromDisk(); } catch (IOException e2) { - Slog.wtf(TAG, "Failed to read configs from disk", e2); + logWtf("Failed to read configs from disk", e2); return; } } @@ -439,7 +445,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { synchronized (mLock) { final TelephonySubscriptionSnapshot oldSnapshot = mLastSnapshot; mLastSnapshot = snapshot; - Slog.d(TAG, "new snapshot: " + mLastSnapshot); + logDbg("new snapshot: " + mLastSnapshot); // Start any VCN instances as necessary for (Entry<ParcelUuid, VcnConfig> entry : mConfigs.entrySet()) { @@ -542,7 +548,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { @GuardedBy("mLock") private void startVcnLocked(@NonNull ParcelUuid subscriptionGroup, @NonNull VcnConfig config) { - Slog.d(TAG, "Starting VCN config for subGrp: " + subscriptionGroup); + logDbg("Starting VCN config for subGrp: " + subscriptionGroup); // TODO(b/176939047): Support multiple VCNs active at the same time, or limit to one active // VCN. @@ -567,7 +573,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { @GuardedBy("mLock") private void startOrUpdateVcnLocked( @NonNull ParcelUuid subscriptionGroup, @NonNull VcnConfig config) { - Slog.d(TAG, "Starting or updating VCN config for subGrp: " + subscriptionGroup); + logDbg("Starting or updating VCN config for subGrp: " + subscriptionGroup); if (mVcns.containsKey(subscriptionGroup)) { final Vcn vcn = mVcns.get(subscriptionGroup); @@ -593,7 +599,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { if (!config.getProvisioningPackageName().equals(opPkgName)) { throw new IllegalArgumentException("Mismatched caller and VcnConfig creator"); } - Slog.d(TAG, "VCN config updated for subGrp: " + subscriptionGroup); + logDbg("VCN config updated for subGrp: " + subscriptionGroup); mContext.getSystemService(AppOpsManager.class) .checkPackage(mDeps.getBinderCallingUid(), config.getProvisioningPackageName()); @@ -619,7 +625,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { public void clearVcnConfig(@NonNull ParcelUuid subscriptionGroup, @NonNull String opPkgName) { requireNonNull(subscriptionGroup, "subscriptionGroup was null"); requireNonNull(opPkgName, "opPkgName was null"); - Slog.d(TAG, "VCN config cleared for subGrp: " + subscriptionGroup); + logDbg("VCN config cleared for subGrp: " + subscriptionGroup); mContext.getSystemService(AppOpsManager.class) .checkPackage(mDeps.getBinderCallingUid(), opPkgName); @@ -682,7 +688,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { VcnConfig::toPersistableBundle); mConfigDiskRwHelper.writeToDisk(bundle); } catch (IOException e) { - Slog.e(TAG, "Failed to save configs to disk", e); + logErr("Failed to save configs to disk", e); throw new ServiceSpecificException(0, "Failed to save configs"); } } @@ -792,7 +798,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { for (int subId : networkCapabilities.getSubscriptionIds()) { // Verify that all subscriptions point to the same group if (subGrp != null && !subGrp.equals(snapshot.getGroupForSubId(subId))) { - Slog.wtf(TAG, "Got multiple subscription groups for a single network"); + logWtf("Got multiple subscription groups for a single network"); } subGrp = snapshot.getGroupForSubId(subId); @@ -858,10 +864,8 @@ public class VcnManagementService extends IVcnManagementService.Stub { final VcnUnderlyingNetworkPolicy policy = new VcnUnderlyingNetworkPolicy( mTrackingNetworkCallback.requiresRestartForCarrierWifi(result), result); - if (VDBG) { - Slog.d(TAG, "getUnderlyingNetworkPolicy() called for caps: " + networkCapabilities + logVdbg("getUnderlyingNetworkPolicy() called for caps: " + networkCapabilities + "; and lp: " + linkProperties + "; result = " + policy); - } return policy; }); } @@ -953,14 +957,14 @@ public class VcnManagementService extends IVcnManagementService.Stub { || vcnStatus == VCN_STATUS_CODE_SAFE_MODE) { resultStatus = vcnStatus; } else { - Slog.wtf(TAG, "Unknown VCN status: " + vcnStatus); + logWtf("Unknown VCN status: " + vcnStatus); resultStatus = VCN_STATUS_CODE_NOT_CONFIGURED; } try { cbInfo.mCallback.onVcnStatusChanged(resultStatus); } catch (RemoteException e) { - Slog.d(TAG, "VcnStatusCallback threw on VCN status change", e); + logDbg("VcnStatusCallback threw on VCN status change", e); } } } finally { @@ -988,6 +992,43 @@ public class VcnManagementService extends IVcnManagementService.Stub { } } + private void logVdbg(String msg) { + if (VDBG) { + Slog.v(TAG, msg); + LOCAL_LOG.log(TAG + " VDBG: " + msg); + } + } + + private void logDbg(String msg) { + Slog.d(TAG, msg); + LOCAL_LOG.log(TAG + " DBG: " + msg); + } + + private void logDbg(String msg, Throwable tr) { + Slog.d(TAG, msg, tr); + LOCAL_LOG.log(TAG + " DBG: " + msg + tr); + } + + private void logErr(String msg) { + Slog.e(TAG, msg); + LOCAL_LOG.log(TAG + " ERR: " + msg); + } + + private void logErr(String msg, Throwable tr) { + Slog.e(TAG, msg, tr); + LOCAL_LOG.log(TAG + " ERR: " + msg + tr); + } + + private void logWtf(String msg) { + Slog.wtf(TAG, msg); + LOCAL_LOG.log(TAG + " WTF: " + msg); + } + + private void logWtf(String msg, Throwable tr) { + Slog.wtf(TAG, msg, tr); + LOCAL_LOG.log(TAG + " WTF: " + msg + tr); + } + /** * Dumps the state of the VcnManagementService for logging and debugging purposes. * @@ -997,48 +1038,44 @@ public class VcnManagementService extends IVcnManagementService.Stub { protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { mContext.enforceCallingOrSelfPermission(DUMP, TAG); - final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); + final IndentingPrintWriter pw = new IndentingPrintWriter(writer, "| "); - pw.println("VcnManagementService dump:"); - pw.increaseIndent(); + // Post to handler thread to prevent ConcurrentModificationExceptions, and avoid lock-hell. + mHandler.runWithScissors(() -> { + mNetworkProvider.dump(pw); + pw.println(); - pw.println("mNetworkProvider:"); - pw.increaseIndent(); - mNetworkProvider.dump(pw); - pw.decreaseIndent(); - pw.println(); + mTrackingNetworkCallback.dump(pw); + pw.println(); - pw.println("mTrackingNetworkCallback:"); - pw.increaseIndent(); - mTrackingNetworkCallback.dump(pw); - pw.decreaseIndent(); - pw.println(); + synchronized (mLock) { + mLastSnapshot.dump(pw); + pw.println(); - synchronized (mLock) { - pw.println("mLastSnapshot:"); - pw.increaseIndent(); - mLastSnapshot.dump(pw); - pw.decreaseIndent(); - pw.println(); + pw.println("mConfigs:"); + pw.increaseIndent(); + for (Entry<ParcelUuid, VcnConfig> entry : mConfigs.entrySet()) { + pw.println(entry.getKey() + ": " + + entry.getValue().getProvisioningPackageName()); + } + pw.decreaseIndent(); + pw.println(); - pw.println("mConfigs:"); - pw.increaseIndent(); - for (Entry<ParcelUuid, VcnConfig> entry : mConfigs.entrySet()) { - pw.println(entry.getKey() + ": " + entry.getValue().getProvisioningPackageName()); + pw.println("mVcns:"); + pw.increaseIndent(); + for (Vcn vcn : mVcns.values()) { + vcn.dump(pw); + } + pw.decreaseIndent(); + pw.println(); } - pw.decreaseIndent(); - pw.println(); - pw.println("mVcns:"); + pw.println("Local log:"); pw.increaseIndent(); - for (Vcn vcn : mVcns.values()) { - vcn.dump(pw); - } + LOCAL_LOG.dump(pw); pw.decreaseIndent(); pw.println(); - } - - pw.decreaseIndent(); + }, DUMP_TIMEOUT_MILLIS); } // TODO(b/180452282): Make name more generic and implement directly with VcnManagementService diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 562f8f449833..71d6a48b89ee 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -1706,14 +1706,6 @@ public final class ActiveServices { + String.format("0x%08X", manifestType) + " in service element of manifest file"); } - // If the foreground service is not started from TOP process, do not allow it to - // have while-in-use location/camera/microphone access. - if (!r.mAllowWhileInUsePermissionInFgs) { - Slog.w(TAG, - "Foreground service started from background can not have " - + "location/camera/microphone access: service " - + r.shortInstanceName); - } } boolean alreadyStartedOp = false; @@ -1802,6 +1794,14 @@ public final class ActiveServices { r.appInfo.uid, r.intent.getIntent(), r, r.userId,false); } } + // If the foreground service is not started from TOP process, do not allow it to + // have while-in-use location/camera/microphone access. + if (!r.mAllowWhileInUsePermissionInFgs) { + Slog.w(TAG, + "Foreground service started from background can not have " + + "location/camera/microphone access: service " + + r.shortInstanceName); + } logFgsBackgroundStart(r); if (r.mAllowStartForeground == REASON_DENIED && isBgFgsRestrictionEnabled(r)) { final String msg = "Service.startForeground() not allowed due to " @@ -2569,10 +2569,6 @@ public final class ActiveServices { s.setAllowedBgActivityStartsByBinding(true); } - if ((flags & Context.BIND_ALLOW_FOREGROUND_SERVICE_STARTS_FROM_BACKGROUND) != 0) { - s.setAllowedBgFgsStartsByBinding(true); - } - if ((flags & Context.BIND_NOT_APP_COMPONENT_USAGE) != 0) { s.isNotAppComponentUsage = true; } @@ -4129,9 +4125,6 @@ public final class ActiveServices { if ((c.flags & Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS) != 0) { s.updateIsAllowedBgActivityStartsByBinding(); } - if ((c.flags & Context.BIND_ALLOW_FOREGROUND_SERVICE_STARTS_FROM_BACKGROUND) != 0) { - s.updateIsAllowedBgFgsStartsByBinding(); - } if (s.app != null) { updateServiceClientActivitiesLocked(s.app.mServices, c, true); } @@ -5856,8 +5849,6 @@ public final class ActiveServices { final ProcessStateRecord state = app.mState; if (state.isAllowedStartFgsState()) { return getReasonCodeFromProcState(state.getAllowStartFgsState()); - } else if (state.areBackgroundFgsStartsAllowedByToken()) { - return REASON_FGS_BINDING; } else { final ActiveInstrumentation instr = app.getActiveInstrumentation(); if (instr != null diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5f9576120cc5..3e6a0a8ec80d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1236,7 +1236,7 @@ public class ActivityManagerService extends IActivityManager.Stub * The temp-allowlist that is allowed to start FGS from background. */ @CompositeRWLock({"this", "mProcLock"}) - final FgsTempAllowList<Integer, FgsTempAllowListItem> mFgsStartTempAllowList = + final FgsTempAllowList<FgsTempAllowListItem> mFgsStartTempAllowList = new FgsTempAllowList(); static final FgsTempAllowListItem FAKE_TEMP_ALLOW_LIST_ITEM = new FgsTempAllowListItem( @@ -1246,7 +1246,7 @@ public class ActivityManagerService extends IActivityManager.Stub * List of uids that are allowed to have while-in-use permission when FGS is started from * background. */ - private final FgsTempAllowList<Integer, String> mFgsWhileInUseTempAllowList = + private final FgsTempAllowList<String> mFgsWhileInUseTempAllowList = new FgsTempAllowList(); /** @@ -2589,6 +2589,7 @@ public class ActivityManagerService extends IActivityManager.Stub addServiceToMap(mAppBindArgs, Context.POWER_SERVICE); addServiceToMap(mAppBindArgs, Context.USER_SERVICE); addServiceToMap(mAppBindArgs, "mount"); + addServiceToMap(mAppBindArgs, Context.PLATFORM_COMPAT_SERVICE); } return mAppBindArgs; } @@ -4324,8 +4325,8 @@ public class ActivityManagerService extends IActivityManager.Stub if (pid > 0 && pid != MY_PID) { killProcessQuiet(pid); //TODO: killProcessGroup(app.info.uid, pid); - mProcessList.noteAppKill(app, ApplicationExitInfo.REASON_INITIALIZATION_FAILURE, - ApplicationExitInfo.SUBREASON_UNKNOWN, "attach failed"); + // We can't log the app kill info for this process since we don't + // know who it is, so just skip the logging. } else { try { thread.scheduleExit(); @@ -9371,22 +9372,17 @@ public class ActivityManagerService extends IActivityManager.Stub pw.println(" mFgsStartTempAllowList:"); final long currentTimeNow = System.currentTimeMillis(); final long elapsedRealtimeNow = SystemClock.elapsedRealtime(); - final Set<Integer> uids = new ArraySet<>(mFgsStartTempAllowList.keySet()); - for (Integer uid : uids) { - final Pair<Long, FgsTempAllowListItem> entry = mFgsStartTempAllowList.get(uid); - if (entry == null) { - continue; - } + mFgsStartTempAllowList.forEach((uid, entry) -> { pw.print(" " + UserHandle.formatUid(uid) + ": "); - entry.second.dump(pw); pw.println(); - pw.print("ms expiration="); + entry.second.dump(pw); + pw.print(" expiration="); // Convert entry.mExpirationTime, which is an elapsed time since boot, // to a time since epoch (i.e. System.currentTimeMillis()-based time.) final long expirationInCurrentTime = currentTimeNow - elapsedRealtimeNow + entry.first; TimeUtils.dumpTimeWithDelta(pw, expirationInCurrentTime, currentTimeNow); pw.println(); - } + }); } if (mDebugApp != null || mOrigDebugApp != null || mDebugTransient || mOrigWaitForDebugger) { @@ -15344,10 +15340,19 @@ public class ActivityManagerService extends IActivityManager.Stub mDeviceIdleTempAllowlist = appids; if (adding) { if (type == TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED) { + // Note, the device idle temp-allowlist are by app-ids, but here + // mFgsStartTempAllowList contains UIDs. mFgsStartTempAllowList.add(changingUid, durationMs, new FgsTempAllowListItem(durationMs, reasonCode, reason, callingUid)); } + } else { + // Note in the removing case, we need to remove all the UIDs matching + // the appId, because DeviceIdle's temp-allowlist are based on AppIds, + // not UIDs. + // For eacmple, "cmd deviceidle tempallowlist -r PACKAGE" will + // not only remove this app for user 0, but for all users. + mFgsStartTempAllowList.removeAppId(UserHandle.getAppId(changingUid)); } setAppIdTempAllowlistStateLSP(changingUid, adding); } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 85e8315ec9e8..4e6e91ac7b5d 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -139,7 +139,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub .onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE) .replaceWith("?"); - private static final int MAX_LOW_POWER_STATS_SIZE = 8192; + private static final int MAX_LOW_POWER_STATS_SIZE = 16384; private static final int POWER_STATS_QUERY_TIMEOUT_MILLIS = 2000; private static final String EMPTY = "Empty"; @@ -771,9 +771,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub default: throw new UnsupportedOperationException("Unknown tagId=" + atomTag); } - // TODO(b/187223764): busTime won't be needed once end_session is a field in BUS. - final long busTime = System.currentTimeMillis(); - final byte[] statsProto = bus.getStatsProto(busTime); + final byte[] statsProto = bus.getStatsProto(); data.add(FrameworkStatsLog.buildStatsEvent(atomTag, statsProto)); diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 1ddd899505b0..966e746b3c73 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -927,7 +927,7 @@ public final class CachedAppOptimizer { + " received sync transactions while frozen, killing"); app.killLocked("Sync transaction while in frozen state", ApplicationExitInfo.REASON_OTHER, - ApplicationExitInfo.SUBREASON_INVALID_STATE, true); + ApplicationExitInfo.SUBREASON_FREEZER_BINDER_TRANSACTION, true); processKilled = true; } @@ -940,7 +940,7 @@ public final class CachedAppOptimizer { + app.processName + ". Killing it. Exception: " + e); app.killLocked("Unable to query binder frozen stats", ApplicationExitInfo.REASON_OTHER, - ApplicationExitInfo.SUBREASON_INVALID_STATE, true); + ApplicationExitInfo.SUBREASON_FREEZER_BINDER_IOCTL, true); processKilled = true; } @@ -957,7 +957,7 @@ public final class CachedAppOptimizer { + ". Killing it"); app.killLocked("Unable to unfreeze", ApplicationExitInfo.REASON_OTHER, - ApplicationExitInfo.SUBREASON_INVALID_STATE, true); + ApplicationExitInfo.SUBREASON_FREEZER_BINDER_IOCTL, true); return; } @@ -1342,7 +1342,7 @@ public final class CachedAppOptimizer { synchronized (mAm) { proc.killLocked("Unable to freeze binder interface", ApplicationExitInfo.REASON_OTHER, - ApplicationExitInfo.SUBREASON_INVALID_STATE, true); + ApplicationExitInfo.SUBREASON_FREEZER_BINDER_IOCTL, true); } }); } diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java index f32423f75324..b325ea3b21b3 100644 --- a/services/core/java/com/android/server/am/CoreSettingsObserver.java +++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java @@ -159,6 +159,10 @@ final class CoreSettingsObserver extends ContentObserver { DeviceConfig.NAMESPACE_WIDGET, WidgetFlags.MAGNIFIER_ASPECT_RATIO, WidgetFlags.KEY_MAGNIFIER_ASPECT_RATIO, float.class, WidgetFlags.MAGNIFIER_ASPECT_RATIO_DEFAULT)); + sDeviceConfigEntries.add(new DeviceConfigEntry<>( + DeviceConfig.NAMESPACE_WIDGET, WidgetFlags.ANALOG_CLOCK_SECONDS_HAND_FPS, + WidgetFlags.KEY_ANALOG_CLOCK_SECONDS_HAND_FPS, int.class, + WidgetFlags.ANALOG_CLOCK_SECONDS_HAND_FPS_DEFAULT)); // add other device configs here... } diff --git a/services/core/java/com/android/server/am/FgsTempAllowList.java b/services/core/java/com/android/server/am/FgsTempAllowList.java index 847e82f07899..c28655655765 100644 --- a/services/core/java/com/android/server/am/FgsTempAllowList.java +++ b/services/core/java/com/android/server/am/FgsTempAllowList.java @@ -20,11 +20,12 @@ import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import android.annotation.Nullable; import android.os.SystemClock; -import android.util.ArrayMap; +import android.os.UserHandle; import android.util.Pair; import android.util.Slog; +import android.util.SparseArray; -import java.util.Set; +import java.util.function.BiConsumer; /** * List of keys that have expiration time. @@ -33,19 +34,18 @@ import java.util.Set; * * <p>This is used for both FGS-BG-start restriction, and FGS-while-in-use permissions check.</p> * - * <p>Note: the underlying data structure is an {@link ArrayMap}, for performance reason, it is only - * suitable to hold up to hundreds of entries.</p> - * @param <K> type of the key. + * <p>Note: the underlying data structure is an {@link SparseArray}, for performance reason, + * it is only suitable to hold up to hundreds of entries.</p> * @param <E> type of the additional optional info. */ -public class FgsTempAllowList<K, E> { +public class FgsTempAllowList<E> { private static final int DEFAULT_MAX_SIZE = 100; /** * The value is Pair type, Pair.first is the expirationTime(an elapsedRealtime), * Pair.second is the optional information entry about this key. */ - private final ArrayMap<K, Pair<Long, E>> mTempAllowList = new ArrayMap<>(); + private final SparseArray<Pair<Long, E>> mTempAllowList = new SparseArray<>(); private int mMaxSize = DEFAULT_MAX_SIZE; private final Object mLock = new Object(); @@ -70,15 +70,14 @@ public class FgsTempAllowList<K, E> { /** * Add a key and its duration with optional info into the temp allowlist. - * @param key * @param durationMs temp-allowlisted duration in milliseconds. * @param entry additional optional information of this key, could be null. */ - public void add(K key, long durationMs, @Nullable E entry) { + public void add(int uid, long durationMs, @Nullable E entry) { synchronized (mLock) { if (durationMs <= 0) { Slog.e(TAG_AM, "FgsTempAllowList bad duration:" + durationMs + " key: " - + key); + + uid); return; } // The temp allowlist should be a short list with only a few entries in it. @@ -94,10 +93,10 @@ public class FgsTempAllowList<K, E> { } } } - final Pair<Long, E> existing = mTempAllowList.get(key); + final Pair<Long, E> existing = mTempAllowList.get(uid); final long expirationTime = now + durationMs; if (existing == null || existing.first < expirationTime) { - mTempAllowList.put(key, new Pair(expirationTime, entry)); + mTempAllowList.put(uid, new Pair(expirationTime, entry)); } } } @@ -105,13 +104,12 @@ public class FgsTempAllowList<K, E> { /** * If the key has not expired (AKA allowed), return its non-null value. * If the key has expired, return null. - * @param key * @return */ @Nullable - public Pair<Long, E> get(K key) { + public Pair<Long, E> get(int uid) { synchronized (mLock) { - final int index = mTempAllowList.indexOfKey(key); + final int index = mTempAllowList.indexOfKey(uid); if (index < 0) { return null; } else if (mTempAllowList.valueAt(index).first < SystemClock.elapsedRealtime()) { @@ -126,23 +124,48 @@ public class FgsTempAllowList<K, E> { /** * If the key has not expired (AKA allowed), return true. * If the key has expired, return false. - * @param key - * @return */ - public boolean isAllowed(K key) { - Pair<Long, E> entry = get(key); + public boolean isAllowed(int uid) { + Pair<Long, E> entry = get(uid); return entry != null; } - public void remove(K key) { + /** + * Remove a given UID. + */ + public void removeUid(int uid) { synchronized (mLock) { - mTempAllowList.remove(key); + mTempAllowList.remove(uid); } } - public Set<K> keySet() { + /** + * Remove by appId. + */ + public void removeAppId(int appId) { synchronized (mLock) { - return mTempAllowList.keySet(); + // Find all UIDs matching the appId. + for (int i = mTempAllowList.size() - 1; i >= 0; i--) { + final int uid = mTempAllowList.keyAt(i); + if (UserHandle.getAppId(uid) == appId) { + mTempAllowList.removeAt(i); + } + } + } + } + + /** + * Iterate over the entries. + */ + public void forEach(BiConsumer<Integer, Pair<Long, E>> callback) { + synchronized (mLock) { + for (int i = 0; i < mTempAllowList.size(); i++) { + final int uid = mTempAllowList.keyAt(i); + final Pair<Long, E> entry = mTempAllowList.valueAt(i); + if (entry != null) { + callback.accept(uid, entry); + } + } } } } diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 0ffaccfa0e89..457fe0f88aa7 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -3074,7 +3074,7 @@ public final class ProcessList { UidRecord.CHANGE_GONE); EventLogTags.writeAmUidStopped(uid); mActiveUids.remove(uid); - mService.mFgsStartTempAllowList.remove(record.info.uid); + mService.mFgsStartTempAllowList.removeUid(record.info.uid); mService.noteUidProcessState(uid, ActivityManager.PROCESS_STATE_NONEXISTENT, ActivityManager.PROCESS_CAPABILITY_NONE); } diff --git a/services/core/java/com/android/server/am/ProcessStateRecord.java b/services/core/java/com/android/server/am/ProcessStateRecord.java index d83e13cb2e41..1fb5572cc5fe 100644 --- a/services/core/java/com/android/server/am/ProcessStateRecord.java +++ b/services/core/java/com/android/server/am/ProcessStateRecord.java @@ -26,7 +26,6 @@ import static com.android.server.am.ProcessRecord.TAG; import android.annotation.ElapsedRealtimeLong; import android.app.ActivityManager; import android.content.ComponentName; -import android.os.Binder; import android.os.SystemClock; import android.util.ArraySet; import android.util.Slog; @@ -302,9 +301,6 @@ final class ProcessStateRecord { @GuardedBy("mService") private int mAllowStartFgsState = PROCESS_STATE_NONEXISTENT; - @GuardedBy("mService") - private final ArraySet<Binder> mBackgroundFgsStartTokens = new ArraySet<>(); - /** * Whether or not this process has been in forced-app-standby state. */ @@ -1101,21 +1097,6 @@ final class ProcessStateRecord { } @GuardedBy("mService") - void addAllowBackgroundFgsStartsToken(Binder entity) { - mBackgroundFgsStartTokens.add(entity); - } - - @GuardedBy("mService") - void removeAllowBackgroundFgsStartsToken(Binder entity) { - mBackgroundFgsStartTokens.remove(entity); - } - - @GuardedBy("mService") - boolean areBackgroundFgsStartsAllowedByToken() { - return !mBackgroundFgsStartTokens.isEmpty(); - } - - @GuardedBy("mService") void resetAllowStartFgsState() { mAllowStartFgsState = PROCESS_STATE_NONEXISTENT; } diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java index fd59e852ddd7..dbb2f65b0680 100644 --- a/services/core/java/com/android/server/am/ServiceRecord.java +++ b/services/core/java/com/android/server/am/ServiceRecord.java @@ -149,10 +149,6 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN @GuardedBy("ams") private List<IBinder> mBgActivityStartsByStartOriginatingTokens = new ArrayList<>(); - // any current binding to this service has BIND_ALLOW_FOREGROUND_SERVICE_STARTS_FROM_BACKGROUND - // flag? if true, the process can start FGS from background. - boolean mIsAllowedBgFgsStartsByBinding; - // allow while-in-use permissions in foreground service or not. // while-in-use permissions in FGS started from background might be restricted. boolean mAllowWhileInUsePermissionInFgs; @@ -445,10 +441,6 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN pw.print(prefix); pw.print("mIsAllowedBgActivityStartsByStart="); pw.println(mIsAllowedBgActivityStartsByStart); } - if (mIsAllowedBgFgsStartsByBinding) { - pw.print(prefix); pw.print("mIsAllowedBgFgsStartsByBinding="); - pw.println(mIsAllowedBgFgsStartsByBinding); - } pw.print(prefix); pw.print("allowWhileInUsePermissionInFgs="); pw.println(mAllowWhileInUsePermissionInFgs); pw.print(prefix); pw.print("recentCallingPackage="); @@ -634,11 +626,6 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN } else { proc.removeAllowBackgroundActivityStartsToken(this); } - if (mIsAllowedBgFgsStartsByBinding) { - proc.mState.addAllowBackgroundFgsStartsToken(this); - } else { - proc.mState.removeAllowBackgroundFgsStartsToken(this); - } } if (app != null && app != proc) { // If the old app is allowed to start bg activities because of a service start, leave it @@ -726,34 +713,11 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN setAllowedBgActivityStartsByBinding(isAllowedByBinding); } - void updateIsAllowedBgFgsStartsByBinding() { - boolean isAllowedByBinding = false; - for (int conni = connections.size() - 1; conni >= 0; conni--) { - ArrayList<ConnectionRecord> cr = connections.valueAt(conni); - for (int i = 0; i < cr.size(); i++) { - if ((cr.get(i).flags - & Context.BIND_ALLOW_FOREGROUND_SERVICE_STARTS_FROM_BACKGROUND) != 0) { - isAllowedByBinding = true; - break; - } - } - if (isAllowedByBinding) { - break; - } - } - setAllowedBgFgsStartsByBinding(isAllowedByBinding); - } - void setAllowedBgActivityStartsByBinding(boolean newValue) { mIsAllowedBgActivityStartsByBinding = newValue; updateParentProcessBgActivityStartsToken(); } - void setAllowedBgFgsStartsByBinding(boolean newValue) { - mIsAllowedBgFgsStartsByBinding = newValue; - updateParentProcessBgFgsStartsToken(); - } - /** * Called when the service is started with allowBackgroundActivityStarts set. We allow * it for background activity starts, setting up a callback to remove this ability after a @@ -846,17 +810,6 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN } } - private void updateParentProcessBgFgsStartsToken() { - if (app == null) { - return; - } - if (mIsAllowedBgFgsStartsByBinding) { - app.mState.addAllowBackgroundFgsStartsToken(this); - } else { - app.mState.removeAllowBackgroundFgsStartsToken(this); - } - } - /** * Returns the originating token if that's the only reason background activity starts are * allowed. In order for that to happen the service has to be allowed only due to starts, since diff --git a/services/core/java/com/android/server/biometrics/BiometricStrengthController.java b/services/core/java/com/android/server/biometrics/BiometricStrengthController.java index 270621cf30ca..768dc368f601 100644 --- a/services/core/java/com/android/server/biometrics/BiometricStrengthController.java +++ b/services/core/java/com/android/server/biometrics/BiometricStrengthController.java @@ -48,16 +48,9 @@ public class BiometricStrengthController { */ private static final String KEY_BIOMETRIC_STRENGTHS = "biometric_strengths"; - /** - * Default (no-op) value of the flag KEY_BIOMETRIC_STRENGTHS - */ - public static final String DEFAULT_BIOMETRIC_STRENGTHS = null; - private DeviceConfig.OnPropertiesChangedListener mDeviceConfigListener = properties -> { - for (String name : properties.getKeyset()) { - if (KEY_BIOMETRIC_STRENGTHS.equals(name)) { - updateStrengths(); - } + if (properties.getKeyset().contains(KEY_BIOMETRIC_STRENGTHS)) { + updateStrengths(); } }; @@ -75,7 +68,17 @@ public class BiometricStrengthController { * has been changed. */ public void updateStrengths() { - final Map<Integer, Integer> idToStrength = getIdToStrengthMap(); + final String newValue = DeviceConfig.getString(DeviceConfig.NAMESPACE_BIOMETRICS, + KEY_BIOMETRIC_STRENGTHS, "null"); + if ("null".equals(newValue) || newValue.isEmpty()) { + revertStrengths(); + } else { + updateStrengths(newValue); + } + } + + private void updateStrengths(String flags) { + final Map<Integer, Integer> idToStrength = getIdToStrengthMap(flags); if (idToStrength == null) { return; } @@ -91,12 +94,18 @@ public class BiometricStrengthController { } } + private void revertStrengths() { + for (BiometricSensor sensor : mService.mSensors) { + Slog.d(TAG, "updateStrengths: revert sensorId=" + sensor.id + " to oemStrength=" + + sensor.oemStrength); + sensor.updateStrength(sensor.oemStrength); + } + } + /** * @return a map of <ID, Strength> */ - private Map<Integer, Integer> getIdToStrengthMap() { - final String flags = DeviceConfig.getString(DeviceConfig.NAMESPACE_BIOMETRICS, - KEY_BIOMETRIC_STRENGTHS, DEFAULT_BIOMETRIC_STRENGTHS); + private static Map<Integer, Integer> getIdToStrengthMap(String flags) { if (flags == null || flags.isEmpty()) { Slog.d(TAG, "Flags are null or empty"); return null; diff --git a/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java b/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java index 6482a2eead42..99f4e2cb280c 100644 --- a/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java @@ -82,7 +82,20 @@ public abstract class BaseClientMonitor extends LoggableMonitor private final int mCookie; boolean mAlreadyDone; - @NonNull protected Callback mCallback; + // Use an empty callback by default since delayed operations can receive events + // before they are started and cause NPE in subclasses that access this field directly. + @NonNull protected Callback mCallback = new Callback() { + @Override + public void onClientStarted(@NonNull BaseClientMonitor clientMonitor) { + Slog.e(TAG, "mCallback onClientStarted: called before set (should not happen)"); + } + + @Override + public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, + boolean success) { + Slog.e(TAG, "mCallback onClientFinished: called before set (should not happen)"); + } + }; /** * @return A ClientMonitorEnum constant defined in biometrics.proto diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java index 6ad4308d7608..573c20fe041b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java @@ -120,10 +120,13 @@ final class AidlConversionUtils { return BiometricFaceConstants.FACE_ACQUIRED_SENSOR_DIRTY; case AcquiredInfo.VENDOR: return BiometricFaceConstants.FACE_ACQUIRED_VENDOR; - case AcquiredInfo.UNKNOWN: case AcquiredInfo.FIRST_FRAME_RECEIVED: + return BiometricFaceConstants.FACE_ACQUIRED_FIRST_FRAME_RECEIVED; case AcquiredInfo.DARK_GLASSES_DETECTED: + return BiometricFaceConstants.FACE_ACQUIRED_DARK_GLASSES_DETECTED; case AcquiredInfo.MOUTH_COVERING_DETECTED: + return BiometricFaceConstants.FACE_ACQUIRED_MOUTH_COVERING_DETECTED; + case AcquiredInfo.UNKNOWN: default: return BiometricFaceConstants.FACE_ACQUIRED_UNKNOWN; } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java index 0e6a0f72206c..2f71f44b6bef 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java @@ -148,6 +148,16 @@ public class Sensor { } @Override + public int getInterfaceVersion() { + return this.VERSION; + } + + @Override + public String getInterfaceHash() { + return this.HASH; + } + + @Override public void onChallengeGenerated(long challenge) { mHandler.post(() -> { final BaseClientMonitor client = mScheduler.getCurrentClient(); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/TestHal.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/TestHal.java index bf3f7b45dc4a..525e508f2b6d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/TestHal.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/TestHal.java @@ -35,6 +35,16 @@ public class TestHal extends IFace.Stub { private static final String TAG = "face.aidl.TestHal"; @Override + public int getInterfaceVersion() { + return this.VERSION; + } + + @Override + public String getInterfaceHash() { + return this.HASH; + } + + @Override public SensorProps[] getSensorProps() { Slog.w(TAG, "getSensorProps"); return new SensorProps[0]; @@ -46,6 +56,16 @@ public class TestHal extends IFace.Stub { return new ISession.Stub() { @Override + public int getInterfaceVersion() { + return this.VERSION; + } + + @Override + public String getInterfaceHash() { + return this.HASH; + } + + @Override public void generateChallenge() throws RemoteException { Slog.w(TAG, "generateChallenge"); cb.onChallengeGenerated(0L); @@ -71,6 +91,14 @@ public class TestHal extends IFace.Stub { public void cancel() throws RemoteException { cb.onError(Error.CANCELED, 0 /* vendorCode */); } + @Override + public int getInterfaceVersion() { + return this.VERSION; + } + @Override + public String getInterfaceHash() { + return this.HASH; + } }; } @@ -82,6 +110,14 @@ public class TestHal extends IFace.Stub { public void cancel() throws RemoteException { cb.onError(Error.CANCELED, 0 /* vendorCode */); } + @Override + public int getInterfaceVersion() { + return this.VERSION; + } + @Override + public String getInterfaceHash() { + return this.HASH; + } }; } @@ -93,6 +129,14 @@ public class TestHal extends IFace.Stub { public void cancel() throws RemoteException { cb.onError(Error.CANCELED, 0 /* vendorCode */); } + @Override + public int getInterfaceVersion() { + return this.VERSION; + } + @Override + public String getInterfaceHash() { + return this.HASH; + } }; } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java index 10137b5a28c9..b3b818fd6d3d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java @@ -151,6 +151,16 @@ class Sensor { } @Override + public int getInterfaceVersion() { + return this.VERSION; + } + + @Override + public String getInterfaceHash() { + return this.HASH; + } + + @Override public void onChallengeGenerated(long challenge) { mHandler.post(() -> { final BaseClientMonitor client = mScheduler.getCurrentClient(); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java index abc3597a5183..e7719239d844 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/TestHal.java @@ -33,6 +33,16 @@ public class TestHal extends IFingerprint.Stub { private static final String TAG = "fingerprint.aidl.TestHal"; @Override + public int getInterfaceVersion() { + return this.VERSION; + } + + @Override + public String getInterfaceHash() { + return this.HASH; + } + + @Override public SensorProps[] getSensorProps() { Slog.w(TAG, "getSensorProps"); return new SensorProps[0]; @@ -44,6 +54,16 @@ public class TestHal extends IFingerprint.Stub { return new ISession.Stub() { @Override + public int getInterfaceVersion() { + return this.VERSION; + } + + @Override + public String getInterfaceHash() { + return this.HASH; + } + + @Override public void generateChallenge() throws RemoteException { Slog.w(TAG, "generateChallenge"); cb.onChallengeGenerated(0L); @@ -63,6 +83,14 @@ public class TestHal extends IFingerprint.Stub { public void cancel() throws RemoteException { cb.onError(Error.CANCELED, 0 /* vendorCode */); } + @Override + public int getInterfaceVersion() { + return this.VERSION; + } + @Override + public String getInterfaceHash() { + return this.HASH; + } }; } @@ -74,6 +102,14 @@ public class TestHal extends IFingerprint.Stub { public void cancel() throws RemoteException { cb.onError(Error.CANCELED, 0 /* vendorCode */); } + @Override + public int getInterfaceVersion() { + return this.VERSION; + } + @Override + public String getInterfaceHash() { + return this.HASH; + } }; } @@ -85,6 +121,14 @@ public class TestHal extends IFingerprint.Stub { public void cancel() throws RemoteException { cb.onError(Error.CANCELED, 0 /* vendorCode */); } + @Override + public int getInterfaceVersion() { + return this.VERSION; + } + @Override + public String getInterfaceHash() { + return this.HASH; + } }; } diff --git a/services/core/java/com/android/server/compat/CompatChange.java b/services/core/java/com/android/server/compat/CompatChange.java index d29a0c715e95..0f97b9042ebe 100644 --- a/services/core/java/com/android/server/compat/CompatChange.java +++ b/services/core/java/com/android/server/compat/CompatChange.java @@ -26,9 +26,7 @@ import android.compat.annotation.ChangeId; import android.compat.annotation.Disabled; import android.compat.annotation.EnabledSince; import android.compat.annotation.Overridable; -import android.content.Context; import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; import com.android.internal.compat.AndroidBuildClassifier; import com.android.internal.compat.CompatibilityChangeInfo; @@ -161,15 +159,17 @@ public final class CompatChange extends CompatibilityChangeInfo { * * @param packageName Package name to tentatively enable the change for. * @param override The package override to be set + * @param allowedState Whether the override is allowed. + * @param versionCode The version code of the package. */ void addPackageOverride(String packageName, PackageOverride override, - OverrideAllowedState allowedState, Context context) { + OverrideAllowedState allowedState, @Nullable Long versionCode) { if (getLoggingOnly()) { throw new IllegalArgumentException( "Can't add overrides for a logging only change " + toString()); } mRawOverrides.put(packageName, override); - recheckOverride(packageName, allowedState, context); + recheckOverride(packageName, allowedState, versionCode); } /** @@ -179,32 +179,24 @@ public final class CompatChange extends CompatibilityChangeInfo { * overrides, check if they need to be demoted to deferred.</p> * * @param packageName Package name to apply deferred overrides for. - * @param allowed Whether the override is allowed. + * @param allowedState Whether the override is allowed. + * @param versionCode The version code of the package. * * @return {@code true} if the recheck yielded a result that requires invalidating caches * (a deferred override was consolidated or a regular override was removed). */ boolean recheckOverride(String packageName, OverrideAllowedState allowedState, - Context context) { + @Nullable Long versionCode) { boolean allowed = (allowedState.state == OverrideAllowedState.ALLOWED); - Long version = null; - try { - ApplicationInfo applicationInfo = context.getPackageManager().getApplicationInfo( - packageName, 0); - version = applicationInfo.longVersionCode; - } catch (PackageManager.NameNotFoundException e) { - // Do nothing - } - // If the app is not installed or no longer has raw overrides, evaluate to false - if (version == null || !hasRawOverride(packageName) || !allowed) { + if (versionCode == null || !hasRawOverride(packageName) || !allowed) { removePackageOverrideInternal(packageName); return false; } // Evaluate the override based on its version - int overrideValue = mRawOverrides.get(packageName).evaluate(version); + int overrideValue = mRawOverrides.get(packageName).evaluate(versionCode); switch (overrideValue) { case VALUE_UNDEFINED: removePackageOverrideInternal(packageName); @@ -229,11 +221,13 @@ public final class CompatChange extends CompatibilityChangeInfo { * <p>Note, this method is not thread safe so callers must ensure thread safety. * * @param pname Package name to reset to defaults for. + * @param allowedState Whether the override is allowed. + * @param versionCode The version code of the package. */ boolean removePackageOverride(String pname, OverrideAllowedState allowedState, - Context context) { + @Nullable Long versionCode) { if (mRawOverrides.remove(pname) != null) { - recheckOverride(pname, allowedState, context); + recheckOverride(pname, allowedState, versionCode); return true; } return false; diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java index 924756889408..909ed11e9d69 100644 --- a/services/core/java/com/android/server/compat/CompatConfig.java +++ b/services/core/java/com/android/server/compat/CompatConfig.java @@ -16,11 +16,13 @@ package com.android.server.compat; +import android.annotation.Nullable; import android.app.compat.ChangeIdStateCache; import android.app.compat.PackageOverride; import android.compat.Compatibility.ChangeConfig; import android.content.Context; import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.os.Environment; import android.text.TextUtils; import android.util.LongArray; @@ -51,7 +53,6 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -249,6 +250,7 @@ final class CompatConfig { OverrideAllowedState allowedState = mOverrideValidator.getOverrideAllowedState(changeId, packageName); allowedState.enforce(changeId, packageName); + Long versionCode = getVersionCodeOrNull(packageName); synchronized (mChanges) { CompatChange c = mChanges.get(changeId); if (c == null) { @@ -256,7 +258,7 @@ final class CompatConfig { c = new CompatChange(changeId); addChange(c); } - c.addPackageOverride(packageName, overrides, allowedState, mContext); + c.addPackageOverride(packageName, overrides, allowedState, versionCode); invalidateCache(); } return alreadyKnown; @@ -336,6 +338,7 @@ final class CompatConfig { * It does not invalidate the cache nor save the overrides. */ private boolean removeOverrideUnsafe(long changeId, String packageName) { + Long versionCode = getVersionCodeOrNull(packageName); synchronized (mChanges) { CompatChange c = mChanges.get(changeId); if (c != null) { @@ -343,7 +346,7 @@ final class CompatConfig { mOverrideValidator.getOverrideAllowedState(changeId, packageName); if (c.hasPackageOverride(packageName)) { allowedState.enforce(changeId, packageName); - c.removePackageOverride(packageName, allowedState, mContext); + c.removePackageOverride(packageName, allowedState, versionCode); invalidateCache(); return true; } @@ -653,26 +656,33 @@ final class CompatConfig { * Rechecks all the existing overrides for a package. */ void recheckOverrides(String packageName) { - // Local cache of compat changes. Holding a lock on mChanges for the whole duration of the - // method will cause a deadlock. - List<CompatChange> changes; + Long versionCode = getVersionCodeOrNull(packageName); synchronized (mChanges) { - changes = new ArrayList<>(mChanges.size()); + boolean shouldInvalidateCache = false; for (int idx = 0; idx < mChanges.size(); ++idx) { - changes.add(mChanges.valueAt(idx)); + CompatChange c = mChanges.valueAt(idx); + if (!c.hasPackageOverride(packageName)) { + continue; + } + OverrideAllowedState allowedState = + mOverrideValidator.getOverrideAllowedStateForRecheck(c.getId(), + packageName); + shouldInvalidateCache |= c.recheckOverride(packageName, allowedState, versionCode); } - } - boolean shouldInvalidateCache = false; - for (CompatChange c: changes) { - if (!c.hasPackageOverride(packageName)) { - continue; + if (shouldInvalidateCache) { + invalidateCache(); } - OverrideAllowedState allowedState = - mOverrideValidator.getOverrideAllowedStateForRecheck(c.getId(), packageName); - shouldInvalidateCache |= c.recheckOverride(packageName, allowedState, mContext); } - if (shouldInvalidateCache) { - invalidateCache(); + } + + @Nullable + private Long getVersionCodeOrNull(String packageName) { + try { + ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo( + packageName, 0); + return applicationInfo.longVersionCode; + } catch (PackageManager.NameNotFoundException e) { + return null; } } diff --git a/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java b/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java index aa3e5795b684..a34d7226136a 100644 --- a/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java +++ b/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java @@ -72,8 +72,11 @@ public class SystemEmergencyHelper extends EmergencyHelper { @Override public boolean isInEmergency(long extensionTimeMs) { + boolean isInExtensionTime = mEmergencyCallEndRealtimeMs != Long.MIN_VALUE + && (SystemClock.elapsedRealtime() - mEmergencyCallEndRealtimeMs) < extensionTimeMs; + return mIsInEmergencyCall - || ((SystemClock.elapsedRealtime() - mEmergencyCallEndRealtimeMs) < extensionTimeMs) + || isInExtensionTime || mTelephonyManager.getEmergencyCallbackMode() || mTelephonyManager.isInEmergencySmsMode(); } diff --git a/services/core/java/com/android/server/locksettings/RebootEscrowManager.java b/services/core/java/com/android/server/locksettings/RebootEscrowManager.java index 3f2b8fffcc54..b714c6d73613 100644 --- a/services/core/java/com/android/server/locksettings/RebootEscrowManager.java +++ b/services/core/java/com/android/server/locksettings/RebootEscrowManager.java @@ -33,6 +33,9 @@ import android.annotation.UserIdInt; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.UserInfo; +import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkCapabilities; import android.os.Handler; import android.os.SystemClock; import android.os.SystemProperties; @@ -126,6 +129,7 @@ class RebootEscrowManager { ERROR_UNLOCK_ALL_USERS, ERROR_PROVIDER_MISMATCH, ERROR_KEYSTORE_FAILURE, + ERROR_NO_NETWORK, }) @Retention(RetentionPolicy.SOURCE) @interface RebootEscrowErrorCode { @@ -139,6 +143,7 @@ class RebootEscrowManager { static final int ERROR_UNLOCK_ALL_USERS = 5; static final int ERROR_PROVIDER_MISMATCH = 6; static final int ERROR_KEYSTORE_FAILURE = 7; + static final int ERROR_NO_NETWORK = 8; private @RebootEscrowErrorCode int mLoadEscrowDataErrorCode = ERROR_NONE; @@ -235,6 +240,23 @@ class RebootEscrowManager { "server_based_ror_enabled", false); } + public boolean isNetworkConnected() { + final ConnectivityManager connectivityManager = + mContext.getSystemService(ConnectivityManager.class); + if (connectivityManager == null) { + return false; + } + + Network activeNetwork = connectivityManager.getActiveNetwork(); + NetworkCapabilities networkCapabilities = + connectivityManager.getNetworkCapabilities(activeNetwork); + return networkCapabilities != null + && networkCapabilities.hasCapability( + NetworkCapabilities.NET_CAPABILITY_INTERNET) + && networkCapabilities.hasCapability( + NetworkCapabilities.NET_CAPABILITY_VALIDATED); + } + public Context getContext() { return mContext; } @@ -363,7 +385,11 @@ class RebootEscrowManager { } Slog.w(TAG, "Failed to load reboot escrow data after " + attemptNumber + " attempts"); - mLoadEscrowDataErrorCode = ERROR_RETRY_COUNT_EXHAUSTED; + if (mInjector.serverBasedResumeOnReboot() && !mInjector.isNetworkConnected()) { + mLoadEscrowDataErrorCode = ERROR_NO_NETWORK; + } else { + mLoadEscrowDataErrorCode = ERROR_RETRY_COUNT_EXHAUSTED; + } onGetRebootEscrowKeyFailed(users, attemptNumber); } @@ -471,6 +497,8 @@ class RebootEscrowManager { mLoadEscrowDataErrorCode = ERROR_UNKNOWN; } + Slog.i(TAG, "Reporting RoR recovery metrics, success: " + success + ", service type: " + + serviceType + ", error code: " + mLoadEscrowDataErrorCode); // TODO(179105110) report the duration since boot complete. mInjector.reportMetric(success, mLoadEscrowDataErrorCode, serviceType, attemptCount, escrowDurationInSeconds, vbmetaDigestStatus, -1); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 0bc28405eab3..0dd9b292b386 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -4221,6 +4221,7 @@ public class NotificationManagerService extends SystemService { } } + /** Notifications returned here will have allowlistToken stripped from them. */ private StatusBarNotification sanitizeSbn(String pkg, int userId, StatusBarNotification sbn) { if (sbn.getUserId() == userId) { @@ -4228,11 +4229,16 @@ public class NotificationManagerService extends SystemService { // We could pass back a cloneLight() but clients might get confused and // try to send this thing back to notify() again, which would not work // very well. + Notification notification = sbn.getNotification().clone(); + // Remove background token before returning notification to untrusted app, this + // ensures the app isn't able to perform background operations that are + // associated with notification interactions. + notification.setAllowlistToken(null); return new StatusBarNotification( sbn.getPackageName(), sbn.getOpPkg(), sbn.getId(), sbn.getTag(), sbn.getUid(), sbn.getInitialPid(), - sbn.getNotification().clone(), + notification, sbn.getUser(), sbn.getOverrideGroupKey(), sbn.getPostTime()); } } @@ -8469,7 +8475,9 @@ public class NotificationManagerService extends SystemService { for (int i = 0; i < newUris.size(); i++) { final Uri uri = newUris.valueAt(i); if (oldUris == null || !oldUris.contains(uri)) { - Slog.d(TAG, key + ": granting " + uri); + if (DBG) { + Slog.d(TAG, key + ": granting " + uri); + } grantUriPermission(permissionOwner, uri, newRecord.getUid(), targetPkg, targetUserId); } diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index 7b1fa1496bc4..06ff69176bb7 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -58,10 +58,12 @@ import com.android.server.compat.CompatChange; import com.android.server.om.OverlayReferenceMapper; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.utils.Snappable; +import com.android.server.utils.SnapshotCache; import com.android.server.utils.Snapshots; import com.android.server.utils.Watchable; import com.android.server.utils.WatchableImpl; import com.android.server.utils.WatchedArrayMap; +import com.android.server.utils.WatchedSparseBooleanMatrix; import com.android.server.utils.Watcher; import java.io.PrintWriter; @@ -158,12 +160,21 @@ public class AppsFilter implements Watchable, Snappable { * initial scam and is null until {@link #onSystemReady()} is called. */ @GuardedBy("mCacheLock") - private volatile SparseArray<SparseBooleanArray> mShouldFilterCache; + private volatile WatchedSparseBooleanMatrix mShouldFilterCache; /** * A cached snapshot. */ - private volatile AppsFilter mSnapshot = null; + private final SnapshotCache<AppsFilter> mSnapshot; + + private SnapshotCache<AppsFilter> makeCache() { + return new SnapshotCache<AppsFilter>(this, this) { + @Override + public AppsFilter createSnapshot() { + AppsFilter s = new AppsFilter(mSource); + return s; + }}; + } /** * Watchable machinery @@ -211,7 +222,6 @@ public class AppsFilter implements Watchable, Snappable { */ @Override public void dispatchChange(@Nullable Watchable what) { - mSnapshot = null; mWatchable.dispatchChange(what); } @@ -236,6 +246,7 @@ public class AppsFilter implements Watchable, Snappable { overlayProvider); mStateProvider = stateProvider; mBackgroundExecutor = backgroundExecutor; + mSnapshot = makeCache(); } /** @@ -258,8 +269,14 @@ public class AppsFilter implements Watchable, Snappable { mSystemSigningDetails = orig.mSystemSigningDetails; mProtectedBroadcasts = orig.mProtectedBroadcasts; mShouldFilterCache = orig.mShouldFilterCache; + if (mShouldFilterCache != null) { + synchronized (orig.mCacheLock) { + mShouldFilterCache = mShouldFilterCache.snapshot(); + } + } mBackgroundExecutor = null; + mSnapshot = new SnapshotCache.Sealed<>(); } /** @@ -268,13 +285,7 @@ public class AppsFilter implements Watchable, Snappable { * condition causes the cached snapshot to be cleared asynchronously to this method. */ public AppsFilter snapshot() { - AppsFilter s = mSnapshot; - if (s == null) { - s = new AppsFilter(this); - s.mWatchable.seal(); - mSnapshot = s; - } - return s; + return mSnapshot.snapshot(); } /** @@ -636,12 +647,7 @@ public class AppsFilter implements Watchable, Snappable { if (mShouldFilterCache != null) { // update the cache in a one-off manner since we've got all the information we // need. - SparseBooleanArray visibleUids = mShouldFilterCache.get(recipientUid); - if (visibleUids == null) { - visibleUids = new SparseBooleanArray(); - mShouldFilterCache.put(recipientUid, visibleUids); - } - visibleUids.put(visibleUid, false); + mShouldFilterCache.put(recipientUid, visibleUid, false); } } if (changed) { @@ -813,23 +819,21 @@ public class AppsFilter implements Watchable, Snappable { if (mShouldFilterCache == null) { return; } - for (int i = mShouldFilterCache.size() - 1; i >= 0; i--) { + for (int i = 0; i < mShouldFilterCache.size(); i++) { if (UserHandle.getAppId(mShouldFilterCache.keyAt(i)) == appId) { mShouldFilterCache.removeAt(i); - continue; - } - SparseBooleanArray targetSparseArray = mShouldFilterCache.valueAt(i); - for (int j = targetSparseArray.size() - 1; j >= 0; j--) { - if (UserHandle.getAppId(targetSparseArray.keyAt(j)) == appId) { - targetSparseArray.removeAt(j); - } + // The key was deleted so the list of keys has shifted left. That means i + // is now pointing at the next key to be examined. The decrement here and + // the loop increment together mean that i will be unchanged in the need + // iteration and will correctly point to the next key to be examined. + i--; } } } private void updateEntireShouldFilterCache() { mStateProvider.runWithState((settings, users) -> { - SparseArray<SparseBooleanArray> cache = + WatchedSparseBooleanMatrix cache = updateEntireShouldFilterCacheInner(settings, users); synchronized (mCacheLock) { mShouldFilterCache = cache; @@ -837,10 +841,10 @@ public class AppsFilter implements Watchable, Snappable { }); } - private SparseArray<SparseBooleanArray> updateEntireShouldFilterCacheInner( + private WatchedSparseBooleanMatrix updateEntireShouldFilterCacheInner( ArrayMap<String, PackageSetting> settings, UserInfo[] users) { - SparseArray<SparseBooleanArray> cache = - new SparseArray<>(users.length * settings.size()); + WatchedSparseBooleanMatrix cache = + new WatchedSparseBooleanMatrix(users.length * settings.size()); for (int i = settings.size() - 1; i >= 0; i--) { updateShouldFilterCacheForPackage(cache, null /*skipPackage*/, settings.valueAt(i), settings, users, i); @@ -864,7 +868,7 @@ public class AppsFilter implements Watchable, Snappable { packagesCache.put(settings.keyAt(i), pkg); } }); - SparseArray<SparseBooleanArray> cache = + WatchedSparseBooleanMatrix cache = updateEntireShouldFilterCacheInner(settingsCopy, usersRef[0]); boolean[] changed = new boolean[1]; // We have a cache, let's make sure the world hasn't changed out from under us. @@ -916,7 +920,7 @@ public class AppsFilter implements Watchable, Snappable { } } - private void updateShouldFilterCacheForPackage(SparseArray<SparseBooleanArray> cache, + private void updateShouldFilterCacheForPackage(WatchedSparseBooleanMatrix cache, @Nullable String skipPackageName, PackageSetting subjectSetting, ArrayMap<String, PackageSetting> allSettings, UserInfo[] allUsers, int maxIndex) { for (int i = Math.min(maxIndex, allSettings.size() - 1); i >= 0; i--) { @@ -935,17 +939,11 @@ public class AppsFilter implements Watchable, Snappable { for (int ou = 0; ou < userCount; ou++) { int otherUser = allUsers[ou].id; int subjectUid = UserHandle.getUid(subjectUser, subjectSetting.appId); - if (!cache.contains(subjectUid)) { - cache.put(subjectUid, new SparseBooleanArray(appxUidCount)); - } int otherUid = UserHandle.getUid(otherUser, otherSetting.appId); - if (!cache.contains(otherUid)) { - cache.put(otherUid, new SparseBooleanArray(appxUidCount)); - } - cache.get(subjectUid).put(otherUid, + cache.put(subjectUid, otherUid, shouldFilterApplicationInternal( subjectUid, subjectSetting, otherSetting, otherUser)); - cache.get(otherUid).put(subjectUid, + cache.put(otherUid, subjectUid, shouldFilterApplicationInternal( otherUid, otherSetting, subjectSetting, subjectUser)); } @@ -1198,22 +1196,20 @@ public class AppsFilter implements Watchable, Snappable { } synchronized (mCacheLock) { if (mShouldFilterCache != null) { // use cache - SparseBooleanArray shouldFilterTargets = mShouldFilterCache.get(callingUid); - final int targetUid = UserHandle.getUid(userId, targetPkgSetting.appId); - if (shouldFilterTargets == null) { + final int callingIndex = mShouldFilterCache.indexOfKey(callingUid); + if (callingIndex < 0) { Slog.wtf(TAG, "Encountered calling uid with no cached rules: " + callingUid); return true; } - int indexOfTargetUid = shouldFilterTargets.indexOfKey(targetUid); - if (indexOfTargetUid < 0) { + final int targetUid = UserHandle.getUid(userId, targetPkgSetting.appId); + final int targetIndex = mShouldFilterCache.indexOfKey(targetUid); + if (targetIndex < 0) { Slog.w(TAG, "Encountered calling -> target with no cached rules: " + callingUid + " -> " + targetUid); return true; } - if (!shouldFilterTargets.valueAt(indexOfTargetUid)) { - return false; - } + return mShouldFilterCache.valueAt(callingIndex, targetIndex); } else { if (!shouldFilterApplicationInternal( callingUid, callingSetting, targetPkgSetting, userId)) { diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index de9add0d0b37..b135e88f40c7 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -1207,8 +1207,16 @@ public class LauncherAppsService extends SystemService { final long ident = Binder.clearCallingIdentity(); try { String packageName = component.getPackageName(); + int uId = -1; + try { + uId = mContext.getPackageManager().getApplicationInfo( + packageName, PackageManager.MATCH_ANY_USER).uid; + } catch (PackageManager.NameNotFoundException e) { + Log.d(TAG, "package not found: " + e); + } intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", packageName, null)); + intent.putExtra("uId", uId); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.setSourceBounds(sourceBounds); } finally { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index ae58efa0d330..14861c2ddf4c 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -8472,7 +8472,7 @@ public class PackageManagerService extends IPackageManager.Stub libInfo.getPackageName(), libInfo.getAllCodePaths(), libInfo.getName(), libInfo.getLongVersion(), libInfo.getType(), libInfo.getDeclaringPackage(), - getPackagesUsingSharedLibraryLPr(libInfo, flags, userId), + getPackagesUsingSharedLibraryLPr(libInfo, flags, callingUid, userId), (libInfo.getDependencies() == null ? null : new ArrayList<>(libInfo.getDependencies())), @@ -8544,9 +8544,11 @@ public class PackageManagerService extends IPackageManager.Stub libraryInfo.getPath(), libraryInfo.getPackageName(), libraryInfo.getAllCodePaths(), libraryInfo.getName(), libraryInfo.getLongVersion(), libraryInfo.getType(), - libraryInfo.getDeclaringPackage(), getPackagesUsingSharedLibraryLPr( - libraryInfo, flags, userId), libraryInfo.getDependencies() == null - ? null : new ArrayList<>(libraryInfo.getDependencies()), + libraryInfo.getDeclaringPackage(), + getPackagesUsingSharedLibraryLPr( + libraryInfo, flags, callingUid, userId), + libraryInfo.getDependencies() == null + ? null : new ArrayList<>(libraryInfo.getDependencies()), libraryInfo.isNative()); if (result == null) { @@ -8562,7 +8564,7 @@ public class PackageManagerService extends IPackageManager.Stub @GuardedBy("mLock") private List<VersionedPackage> getPackagesUsingSharedLibraryLPr( - SharedLibraryInfo libInfo, int flags, int userId) { + SharedLibraryInfo libInfo, int flags, int callingUid, int userId) { List<VersionedPackage> versionedPackages = null; final int packageCount = mSettings.getPackagesLocked().size(); for (int i = 0; i < packageCount; i++) { @@ -8585,6 +8587,9 @@ public class PackageManagerService extends IPackageManager.Stub if (ps.usesStaticLibrariesVersions[libIdx] != libInfo.getLongVersion()) { continue; } + if (shouldFilterApplicationLocked(ps, callingUid, userId)) { + continue; + } if (versionedPackages == null) { versionedPackages = new ArrayList<>(); } @@ -8597,6 +8602,9 @@ public class PackageManagerService extends IPackageManager.Stub } else if (ps.pkg != null) { if (ArrayUtils.contains(ps.pkg.getUsesLibraries(), libName) || ArrayUtils.contains(ps.pkg.getUsesOptionalLibraries(), libName)) { + if (shouldFilterApplicationLocked(ps, callingUid, userId)) { + continue; + } if (versionedPackages == null) { versionedPackages = new ArrayList<>(); } @@ -14321,7 +14329,7 @@ public class PackageManagerService extends IPackageManager.Stub // Remove the shared library overlays from its dependent packages. for (int currentUserId : UserManagerService.getInstance().getUserIds()) { final List<VersionedPackage> dependents = getPackagesUsingSharedLibraryLPr( - libraryInfo, 0, currentUserId); + libraryInfo, 0, Process.SYSTEM_UID, currentUserId); if (dependents == null) { continue; } @@ -20684,7 +20692,7 @@ public class PackageManagerService extends IPackageManager.Stub continue; } List<VersionedPackage> libClientPackages = getPackagesUsingSharedLibraryLPr( - libraryInfo, MATCH_KNOWN_PACKAGES, currUserId); + libraryInfo, MATCH_KNOWN_PACKAGES, Process.SYSTEM_UID, currUserId); if (!ArrayUtils.isEmpty(libClientPackages)) { Slog.w(TAG, "Not removing package " + pkg.getManifestPackageName() + " hosting lib " + libraryInfo.getName() + " version " @@ -26795,7 +26803,7 @@ public class PackageManagerService extends IPackageManager.Stub continue; } final List<VersionedPackage> dependents = getPackagesUsingSharedLibraryLPr( - info, 0, userId); + info, 0, Process.SYSTEM_UID, userId); if (dependents == null) { continue; } diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 4963d64797e5..4ebf4768a973 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -121,6 +121,7 @@ import java.io.PrintWriter; import java.net.URISyntaxException; import java.security.SecureRandom; import java.util.ArrayList; +import java.util.Arrays; import java.util.Base64; import java.util.Collection; import java.util.Collections; @@ -253,6 +254,8 @@ class PackageManagerShellCommand extends ShellCommand { return runSuspend(true); case "unsuspend": return runSuspend(false); + case "set-distracting-restriction": + return runSetDistractingRestriction(); case "grant": return runGrantRevokePermission(true); case "revoke": @@ -2207,6 +2210,57 @@ class PackageManagerShellCommand extends ShellCommand { return 0; } + private int runSetDistractingRestriction() { + final PrintWriter pw = getOutPrintWriter(); + int userId = UserHandle.USER_SYSTEM; + String opt; + int flags = 0; + while ((opt = getNextOption()) != null) { + switch (opt) { + case "--user": + userId = UserHandle.parseUserArg(getNextArgRequired()); + break; + case "--flag": + final String flag = getNextArgRequired(); + switch (flag) { + case "hide-notifications": + flags |= PackageManager.RESTRICTION_HIDE_NOTIFICATIONS; + break; + case "hide-from-suggestions": + flags |= PackageManager.RESTRICTION_HIDE_FROM_SUGGESTIONS; + break; + default: + pw.println("Unrecognized flag: " + flag); + return 1; + } + break; + default: + pw.println("Error: Unknown option: " + opt); + return 1; + } + } + + final List<String> packageNames = getRemainingArgs(); + if (packageNames.isEmpty()) { + pw.println("Error: package name not specified"); + return 1; + } + try { + final int translatedUserId = translateUserId(userId, UserHandle.USER_NULL, + "set-distracting"); + final String[] errored = mInterface.setDistractingPackageRestrictionsAsUser( + packageNames.toArray(new String[]{}), flags, translatedUserId); + if (errored.length > 0) { + pw.println("Could not set restriction for: " + Arrays.toString(errored)); + return 1; + } + return 0; + } catch (RemoteException | IllegalArgumentException e) { + pw.println(e.toString()); + return 1; + } + } + private int runSuspend(boolean suspendedState) { final PrintWriter pw = getOutPrintWriter(); int userId = UserHandle.USER_SYSTEM; @@ -3688,6 +3742,16 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" unsuspend [--user USER_ID] PACKAGE [PACKAGE...]"); pw.println(" Unsuspends the specified package(s) (as user)."); pw.println(""); + pw.println(" set-distracting-restriction [--user USER_ID] [--flag FLAG ...]"); + pw.println(" PACKAGE [PACKAGE...]"); + pw.println(" Sets the specified restriction flags to given package(s) (for user)."); + pw.println(" Flags are:"); + pw.println(" hide-notifications: Hides notifications from this package"); + pw.println(" hide-from-suggestions: Hides this package from suggestions"); + pw.println(" (by the launcher, etc.)"); + pw.println(" Any existing flags are overwritten, which also means that if no flags are"); + pw.println(" specified then all existing flags will be cleared."); + pw.println(""); pw.println(" grant [--user USER_ID] PACKAGE PERMISSION"); pw.println(" revoke [--user USER_ID] PACKAGE PERMISSION"); pw.println(" These commands either grant or revoke permissions to apps. The permissions"); diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index a7bac20976cd..bad7e5c27b7b 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -720,7 +720,8 @@ final class DefaultPermissionGrantPolicy { for (String voiceInteractPackageName : voiceInteractPackageNames) { grantPermissionsToSystemPackage(pm, voiceInteractPackageName, userId, CONTACTS_PERMISSIONS, CALENDAR_PERMISSIONS, MICROPHONE_PERMISSIONS, - PHONE_PERMISSIONS, SMS_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS); + PHONE_PERMISSIONS, SMS_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS, + NEARBY_DEVICES_PERMISSIONS); } } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 983b5b17bb92..9c25159faef1 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -192,6 +192,7 @@ import android.view.autofill.AutofillManagerInternal; import com.android.internal.R; import com.android.internal.accessibility.AccessibilityShortcutController; +import com.android.internal.app.AssistUtils; import com.android.internal.inputmethod.SoftInputShowHideReason; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; @@ -650,7 +651,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { case MSG_LAUNCH_ASSIST: final int deviceId = msg.arg1; final Long eventTime = (Long) msg.obj; - launchAssistAction(null /* hint */, deviceId, eventTime); + launchAssistAction(null /* hint */, deviceId, eventTime, + AssistUtils.INVOCATION_TYPE_UNKNOWN); break; case MSG_LAUNCH_VOICE_ASSIST_WITH_WAKE_LOCK: launchVoiceAssistWithWakeLock(); @@ -1108,7 +1110,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { performHapticFeedback(HapticFeedbackConstants.ASSISTANT_BUTTON, false, "Power - Long Press - Go To Assistant"); final int powerKeyDeviceId = Integer.MIN_VALUE; - launchAssistAction(null, powerKeyDeviceId, eventTime); + launchAssistAction(null, powerKeyDeviceId, eventTime, + AssistUtils.INVOCATION_TYPE_POWER_BUTTON_LONG_PRESS); break; } } @@ -1541,7 +1544,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { launchAllAppsAction(); break; case LONG_PRESS_HOME_ASSIST: - launchAssistAction(null, deviceId, eventTime); + launchAssistAction(null, deviceId, eventTime, + AssistUtils.INVOCATION_TYPE_HOME_BUTTON_LONG_PRESS); break; case LONG_PRESS_HOME_NOTIFICATION_PANEL: toggleNotificationPanel(); @@ -2772,7 +2776,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } else if (mPendingMetaAction) { launchAssistAction(Intent.EXTRA_ASSIST_INPUT_HINT_KEYBOARD, event.getDeviceId(), - event.getEventTime()); + event.getEventTime(), AssistUtils.INVOCATION_TYPE_UNKNOWN); mPendingMetaAction = false; } } @@ -3036,7 +3040,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { // various parts of the UI. /** Asks the status bar to startAssist(), usually a full "assistant" interface */ - private void launchAssistAction(String hint, int deviceId, long eventTime) { + private void launchAssistAction(String hint, int deviceId, long eventTime, + int invocationType) { sendCloseSystemWindows(SYSTEM_DIALOG_REASON_ASSIST); if (!isUserSetupComplete()) { // Disable opening assist window during setup @@ -3053,6 +3058,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { args.putBoolean(hint, true); } args.putLong(Intent.EXTRA_TIME, eventTime); + args.putInt(AssistUtils.INVOCATION_TYPE_KEY, invocationType); ((SearchManager) mContext.createContextAsUser(UserHandle.of(mCurrentUserId), 0) .getSystemService(Context.SEARCH_SERVICE)).launchAssist(args); diff --git a/services/core/java/com/android/server/power/WakeLockLog.java b/services/core/java/com/android/server/power/WakeLockLog.java index d6060fa419b9..88c9850966f1 100644 --- a/services/core/java/com/android/server/power/WakeLockLog.java +++ b/services/core/java/com/android/server/power/WakeLockLog.java @@ -16,16 +16,12 @@ package com.android.server.power; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; import android.os.PowerManager; import android.text.TextUtils; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BackgroundThread; -import com.android.internal.os.SomeArgs; import java.io.PrintWriter; import java.text.SimpleDateFormat; @@ -74,8 +70,6 @@ final class WakeLockLog { private static final boolean DEBUG = false; - private static final int MSG_ON_WAKE_LOCK_EVENT = 1; - private static final int TYPE_TIME_RESET = 0x0; private static final int TYPE_ACQUIRE = 0x1; private static final int TYPE_RELEASE = 0x2; @@ -130,7 +124,6 @@ final class WakeLockLog { private final Injector mInjector; private final TheLog mLog; private final TagDatabase mTagDatabase; - private final Handler mHandler; private final SimpleDateFormat mDumpsysDateFormat; WakeLockLog() { @@ -140,7 +133,6 @@ final class WakeLockLog { @VisibleForTesting WakeLockLog(Injector injector) { mInjector = injector; - mHandler = new WakeLockLogHandler(injector.getLooper()); mTagDatabase = new TagDatabase(injector); EntryByteTranslator translator = new EntryByteTranslator(mTagDatabase); mLog = new TheLog(injector, translator, mTagDatabase); @@ -172,7 +164,7 @@ final class WakeLockLog { * Dumps all the wake lock data currently saved in the wake lock log to the specified * {@code PrintWriter}. * - * @param The {@code PrintWriter} to write to. + * @param pw The {@code PrintWriter} to write to. */ public void dump(PrintWriter pw) { dump(pw, false); @@ -221,9 +213,6 @@ final class WakeLockLog { /** * Adds a new entry to the log based on the specified wake lock parameters. * - * Grabs the current time for the event and then posts the rest of the logic (actually - * adding it to the log) to a background thread. - * * @param eventType The type of event (ACQUIRE, RELEASE); * @param tag The wake lock's identifying tag. * @param ownerUid The owner UID of the wake lock. @@ -239,15 +228,11 @@ final class WakeLockLog { } final long time = mInjector.currentTimeMillis(); - - SomeArgs args = SomeArgs.obtain(); - args.arg1 = tagNameReducer(tag); - args.argi1 = eventType; - args.argi2 = ownerUid; - args.argi3 = eventType == TYPE_ACQUIRE ? translateFlagsFromPowerManager(flags) : 0; - args.argi4 = (int) ((time >> 32) & 0xFFFFFFFFL); - args.argi5 = (int) (time & 0xFFFFFFFFL); - mHandler.obtainMessage(MSG_ON_WAKE_LOCK_EVENT, args).sendToTarget(); + final int translatedFlags = eventType == TYPE_ACQUIRE + ? translateFlagsFromPowerManager(flags) + : 0; + handleWakeLockEventInternal(eventType, tagNameReducer(tag), ownerUid, translatedFlags, + time); } /** @@ -273,8 +258,8 @@ final class WakeLockLog { * flags, {@code WakeLockLog.FLAG_*}, and a log-level, {@code WakeLockLog.LEVEL_*}. * * @param flags Wake lock flags including {@code PowerManager.*_WAKE_LOCK} - * {@link PowerManager.ACQUIRE_CAUSES_WAKEUP}, and - * {@link PowerManager.ON_AFTER_RELEASE}. + * {@link PowerManager#ACQUIRE_CAUSES_WAKEUP}, and + * {@link PowerManager#ON_AFTER_RELEASE}. * @return The compressed flags value. */ int translateFlagsFromPowerManager(int flags) { @@ -328,9 +313,9 @@ final class WakeLockLog { } String reduciblePrefix = null; - for (int tp = 0; tp < REDUCED_TAG_PREFIXES.length; tp++) { - if (tag.startsWith(REDUCED_TAG_PREFIXES[tp])) { - reduciblePrefix = REDUCED_TAG_PREFIXES[tp]; + for (String reducedTagPrefix : REDUCED_TAG_PREFIXES) { + if (tag.startsWith(reducedTagPrefix)) { + reduciblePrefix = reducedTagPrefix; break; } } @@ -339,7 +324,7 @@ final class WakeLockLog { final StringBuilder sb = new StringBuilder(); // add prefix first - sb.append(tag.substring(0, reduciblePrefix.length())); + sb.append(tag, 0, reduciblePrefix.length()); // Stop looping on final marker final int end = Math.max(tag.lastIndexOf("/"), tag.lastIndexOf(".")); @@ -604,7 +589,7 @@ final class WakeLockLog { * @return The number of bytes written to buffer, or required to write to the buffer. */ int toBytes(LogEntry entry, byte[] bytes, long timeReference) { - int sizeNeeded = -1; + final int sizeNeeded; switch (entry.type) { case TYPE_ACQUIRE: { sizeNeeded = 3; @@ -696,8 +681,9 @@ final class WakeLockLog { * {@link EntryByteTranslator} to convert byte {@link LogEntry} to bytes within the buffer. * * This class also implements the logic around TIME_RESET events. Since the LogEntries store - * their time (8-bit) relative to the previous event, this class can add {@link TYPE_TIME_RESET} - * LogEntries as necessary to allow a LogEntry's relative time to fit within that range. + * their time (8-bit) relative to the previous event, this class can add + * {@link #TYPE_TIME_RESET} LogEntries as necessary to allow a LogEntry's relative time to fit + * within that range. */ static class TheLog { private final EntryByteTranslator mTranslator; @@ -711,7 +697,7 @@ final class WakeLockLog { /** * Second temporary buffer used when reading and writing bytes from the buffer. * A second temporary buffer is necessary since additional items can be read concurrently - * from {@link mTempBuffer}. E.g., Adding an entry to a full buffer requires removing + * from {@link #mTempBuffer}. E.g., Adding an entry to a full buffer requires removing * other entries from the buffer. */ private final byte[] mReadWriteTempBuffer = new byte[MAX_LOG_ENTRY_BYTE_SIZE]; @@ -832,7 +818,7 @@ final class WakeLockLog { * Returns an {@link Iterator} of {@link LogEntry}s for all the entries in the log. * * If the log is modified while the entries are being read, the iterator will throw a - * {@link ConcurrentModificationExceptoin}. + * {@link ConcurrentModificationException}. * * @param tempEntry A temporary {@link LogEntry} instance to use so that new instances * aren't allocated with every call to {@code Iterator.next}. @@ -1063,7 +1049,7 @@ final class WakeLockLog { * instanced into bytes. * * If a new tag is added when the database is full, the oldest tag is removed. The oldest tag - * is calcualted using {@link TagData.lastUsedTime}. + * is calculated using {@link TagData#lastUsedTime}. */ static class TagDatabase { private final int mInvalidIndex; @@ -1086,9 +1072,9 @@ final class WakeLockLog { int byteEstimate = 0; int tagSize = 0; int tags = 0; - for (int i = 0; i < mArray.length; i++) { + for (TagData tagData : mArray) { byteEstimate += 8; // reference pointer - TagData data = mArray[i]; + TagData data = tagData; if (data != null) { entries++; byteEstimate += data.getByteSize(); @@ -1280,10 +1266,6 @@ final class WakeLockLog { @Override public String toString() { - StringBuilder sb = new StringBuilder(); - if (DEBUG) { - sb.append("(").append(index).append(")"); - } return "[" + ownerUid + " ; " + tag + "]"; } @@ -1308,10 +1290,6 @@ final class WakeLockLog { * Injector used by {@link WakeLockLog} for testing purposes. */ public static class Injector { - public Looper getLooper() { - return BackgroundThread.get().getLooper(); - } - public int getTagDatabaseSize() { return TAG_DATABASE_SIZE; } @@ -1328,28 +1306,4 @@ final class WakeLockLog { return DATE_FORMAT; } } - - private class WakeLockLogHandler extends Handler { - WakeLockLogHandler(Looper looper) { - super(looper); - } - - @Override - public void handleMessage(Message message) { - switch(message.what) { - case MSG_ON_WAKE_LOCK_EVENT: - final SomeArgs args = (SomeArgs) message.obj; - final String tag = (String) args.arg1; - final int eventType = args.argi1; - final int ownerUid = args.argi2; - final int flags = args.argi3; - final long time = (((long) args.argi4) << 32) + (args.argi5 & 0xFFFFFFFFL); - args.recycle(); - handleWakeLockEventInternal(eventType, tag, ownerUid, flags, time); - break; - default: - break; - } - } - } } diff --git a/services/core/java/com/android/server/rotationresolver/RemoteRotationResolverService.java b/services/core/java/com/android/server/rotationresolver/RemoteRotationResolverService.java index 35aff8dc70ce..a58291425d4c 100644 --- a/services/core/java/com/android/server/rotationresolver/RemoteRotationResolverService.java +++ b/services/core/java/com/android/server/rotationresolver/RemoteRotationResolverService.java @@ -126,14 +126,12 @@ class RemoteRotationResolverService extends ServiceConnector.Impl<IRotationResol void cancelInternal() { - synchronized (mLock) { - if (mIsFulfilled) { - return; - } - mIsFulfilled = true; - } Handler.getMain().post(() -> { synchronized (mLock) { + if (mIsFulfilled) { + return; + } + mIsFulfilled = true; try { if (mCancellation != null) { mCancellation.cancel(); diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index a82c91e2352b..dc868b325900 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -126,6 +126,7 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.os.connectivity.WifiActivityEnergyInfo; +import android.os.incremental.IncrementalManager; import android.os.storage.DiskInfo; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; @@ -426,6 +427,7 @@ public class StatsPullAtomService extends SystemService { private final Object mHealthHalLock = new Object(); private final Object mAttributedAppOpsLock = new Object(); private final Object mSettingsStatsLock = new Object(); + private final Object mInstalledIncrementalPackagesLock = new Object(); public StatsPullAtomService(Context context) { super(context); @@ -695,6 +697,10 @@ public class StatsPullAtomService extends SystemService { synchronized (mSettingsStatsLock) { return pullSettingsStatsLocked(atomTag, data); } + case FrameworkStatsLog.INSTALLED_INCREMENTAL_PACKAGE: + synchronized (mInstalledIncrementalPackagesLock) { + return pullInstalledIncrementalPackagesLocked(atomTag, data); + } default: throw new UnsupportedOperationException("Unknown tagId=" + atomTag); } @@ -877,6 +883,7 @@ public class StatsPullAtomService extends SystemService { registerBatteryVoltage(); registerBatteryCycleCount(); registerSettingsStats(); + registerInstalledIncrementalPackages(); } private void initAndRegisterNetworkStatsPullers() { @@ -3949,6 +3956,31 @@ public class StatsPullAtomService extends SystemService { return StatsManager.PULL_SUCCESS; } + private void registerInstalledIncrementalPackages() { + int tagId = FrameworkStatsLog.INSTALLED_INCREMENTAL_PACKAGE; + mStatsManager.setPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + DIRECT_EXECUTOR, + mStatsCallbackImpl + ); + } + + int pullInstalledIncrementalPackagesLocked(int atomTag, List<StatsEvent> pulledData) { + final PackageManager pm = mContext.getPackageManager(); + if (!pm.hasSystemFeature(PackageManager.FEATURE_INCREMENTAL_DELIVERY)) { + // Incremental is not enabled on this device. The result list will be empty. + return StatsManager.PULL_SUCCESS; + } + List<PackageInfo> installedPackages = pm.getInstalledPackages(0); + for (PackageInfo pi : installedPackages) { + if (IncrementalManager.isIncrementalPath(pi.applicationInfo.getBaseCodePath())) { + pulledData.add(FrameworkStatsLog.buildStatsEvent(atomTag, pi.applicationInfo.uid)); + } + } + return StatsManager.PULL_SUCCESS; + } + // Thermal event received from vendor thermal management subsystem private static final class ThermalEventListener extends IThermalEventListener.Stub { @Override diff --git a/services/core/java/com/android/server/utils/WatchedSparseBooleanMatrix.java b/services/core/java/com/android/server/utils/WatchedSparseBooleanMatrix.java new file mode 100644 index 000000000000..42a2f81bf9a7 --- /dev/null +++ b/services/core/java/com/android/server/utils/WatchedSparseBooleanMatrix.java @@ -0,0 +1,562 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.utils; + +import android.annotation.Nullable; +import android.annotation.Size; + +import com.android.internal.util.ArrayUtils; +import com.android.internal.util.GrowingArrayUtils; + +import java.util.Arrays; + +/** + * A {@link WatchedSparseBooleanMatrix} is an compact NxN array of booleans. The rows and + * columns of the array are indexed by integers, which need not be contiguous. The matrix + * is square and the row and column indices are identical. This matrix is intended to be + * very memory efficient. + * + * The matrix contains a map from indices to columns: this map requires 2*N integers. The + * boolean array is bit-packed and requires N*N/8 bytes. The memory required for an + * order-N matrix is therefore 2*N*4 + N*N bytes. + * + * See {@link SparseBooleanArray} for a discussion of sparse arrays. + */ +public class WatchedSparseBooleanMatrix extends WatchableImpl implements Snappable { + + /** + * The matrix is implemented through four arrays. The matrix of booleans is stored in + * a one-dimensional {@code mValues} array. {@code mValues} is always of size + * {@code mOrder * mOrder}. Elements of {@code mValues} are addressed with + * arithmetic: the offset of the element {@code {row, col}} is at + * {@code row * mOrder + col}. The term "storage index" applies to {@code mValues}. + * A storage index designates a row (column) in the underlying storage. This is not + * the same as the row seen by client code. + * + * Client code addresses the matrix through indices. These are integers that need not + * be contiguous. Client indices are mapped to storage indices through two linear + * integer arrays. {@code mKeys} is a sorted list of client indices. + * {@code mIndices} is a parallel array that contains storage indices. The storage + * index of a client index {@code k} is {@code mIndices[i]}, where + * {@code mKeys[i] == k}. + * + * A final array, {@code mInUse} records if storage indices are free or in use. This + * array is of size {@code mOrder}. A client index is deleted by removing it from + * {@code mKeys} and {@code mIndices} and then setting the original storage index + * false in {@code mInUse}. + * + * Some notes: + * <ul> + * <li> The matrix never shrinks. + * <li> Equality is a very, very expesive operation. + * </ul> + */ + + /** + * mOrder is always a multiple of this value. A minimal matrix therefore holds 2^12 + * values and requires 1024 bytes. + */ + private static final int STEP = 64; + + /** + * The order of the matrix storage, including any padding. The matrix is always + * square. mOrder is always greater than or equal to mSize. + */ + private int mOrder; + + /** + * The number of client keys. This is always less than or equal to mOrder. It is the + * order of the matrix as seen by the client. + */ + private int mSize; + + /** + * The in-use list. + */ + private boolean[] mInUse; + + /** + * The array of client keys (indices), in sorted order. + */ + private int[] mKeys; + + /** + * The mapping from a client key to an storage index. If client key K is at index N + * in mKeys, then the storage index for K is at mMap[N]. + */ + private int[] mMap; + + /** + * The boolean array. This array is always {@code mOrder x mOrder} in size. + */ + private boolean[] mValues; + + /** + * A convenience function called when the elements are added to or removed from the storage. + * The watchable is always {@link this}. + */ + private void onChanged() { + dispatchChange(this); + } + + /** + * Creates a new WatchedSparseBooleanMatrix containing no mappings. + */ + public WatchedSparseBooleanMatrix() { + this(STEP); + } + + /** + * Creates a new SparseBooleanMatrix containing no mappings that will not require any + * additional memory allocation to store the specified number of mappings. The + * capacity is always rounded up to a non-zero multiple of STEP. + */ + public WatchedSparseBooleanMatrix(int initialCapacity) { + mOrder = initialCapacity; + if (mOrder < STEP) { + mOrder = STEP; + } + if (mOrder % STEP != 0) { + mOrder = ((initialCapacity / STEP) + 1) * STEP; + } + if (mOrder < STEP || (mOrder % STEP != 0)) { + throw new RuntimeException("mOrder is " + mOrder + " initCap is " + initialCapacity); + } + + mInUse = new boolean[mOrder]; + mKeys = ArrayUtils.newUnpaddedIntArray(mOrder); + mMap = ArrayUtils.newUnpaddedIntArray(mOrder); + mValues = new boolean[mOrder * mOrder]; + mSize = 0; + } + + /** + * A copy constructor that can be used for snapshotting. + */ + private WatchedSparseBooleanMatrix(WatchedSparseBooleanMatrix r) { + mOrder = r.mOrder; + mSize = r.mSize; + mKeys = r.mKeys.clone(); + mMap = r.mMap.clone(); + mInUse = r.mInUse.clone(); + mValues = r.mValues.clone(); + } + + /** + * Return a copy of this object. + */ + public WatchedSparseBooleanMatrix snapshot() { + return new WatchedSparseBooleanMatrix(this); + } + + /** + * Gets the boolean mapped from the specified key, or <code>false</code> + * if no such mapping has been made. + */ + public boolean get(int row, int col) { + return get(row, col, false); + } + + /** + * Gets the boolean mapped from the specified key, or the specified value + * if no such mapping has been made. + */ + public boolean get(int row, int col, boolean valueIfKeyNotFound) { + int r = indexOfKey(row, false); + int c = indexOfKey(col, false); + if (r >= 0 && c >= 0) { + return valueAt(r, c); + } else { + return valueIfKeyNotFound; + } + } + + /** + * Adds a mapping from the specified keys to the specified value, replacing the + * previous mapping from the specified keys if there was one. + */ + public void put(int row, int col, boolean value) { + int r = indexOfKey(row); + int c = indexOfKey(col); + if (r < 0 || c < 0) { + // One or both of the keys has not be installed yet. Install them now. + // Installing either key may shift the other key. The safest course is to + // install the keys that are not present and then recompute both indices. + if (r < 0) { + r = indexOfKey(row, true); + } + if (c < 0) { + c = indexOfKey(col, true); + } + r = indexOfKey(row); + c = indexOfKey(col); + } + if (r >= 0 && c >= 0) { + setValueAt(r, c, value); + onChanged(); + } else { + throw new RuntimeException("matrix overflow"); + } + } + + /** + * Removes the mapping from the specified key, if there was any. Note that deletion + * applies to a single index, not to an element. The matrix never shrinks but the + * space will be reused the next time an index is added. + */ + public void deleteKey(int key) { + int i = indexOfKey(key, false); + if (i >= 0) { + removeAt(i); + } + } + + /** + * Removes the mapping at the specified index. The matrix does not shrink. This + * throws ArrayIndexOutOfBounds if the index out outside the range {@code 0..size()-1}. + */ + public void removeAt(int index) { + validateIndex(index); + mInUse[mMap[index]] = false; + System.arraycopy(mKeys, index + 1, mKeys, index, mSize - (index + 1)); + System.arraycopy(mMap, index + 1, mMap, index, mSize - (index + 1)); + mSize--; + onChanged(); + } + + /** + * Returns the number of key-value mappings that this WatchedSparseBooleanMatrix + * currently stores. + */ + public int size() { + return mSize; + } + + /** + * Removes all key-value mappings from this WatchedSparseBooleanMatrix. + */ + public void clear() { + mSize = 0; + Arrays.fill(mInUse, false); + onChanged(); + } + + /** + * Given an index in the range <code>0...size()-1</code>, returns the key from the + * <code>index</code>th key-value mapping that this WatchedSparseBooleanMatrix stores. + * + * <p>The keys corresponding to indices in ascending order are guaranteed to be in + * ascending order, e.g., <code>keyAt(0)</code> will return the smallest key and + * <code>keyAt(size()-1)</code> will return the largest key.</p> + * + * <p>{@link ArrayIndexOutOfBoundsException} is thrown for indices outside of the + * range <code>0...size()-1</code></p> + */ + public int keyAt(int index) { + validateIndex(index); + return mKeys[index]; + } + + /** + * Given a row and column, each in the range <code>0...size()-1</code>, returns the + * value from the <code>index</code>th key-value mapping that this WatchedSparseBooleanMatrix + * stores. + */ + public boolean valueAt(int rowIndex, int colIndex) { + validateIndex(rowIndex, colIndex); + int r = mMap[rowIndex]; + int c = mMap[colIndex]; + int element = r * mOrder + c; + return mValues[element]; + } + + /** + * Directly set the value at a particular index. + */ + public void setValueAt(int rowIndex, int colIndex, boolean value) { + validateIndex(rowIndex, colIndex); + int r = mMap[rowIndex]; + int c = mMap[colIndex]; + int element = r * mOrder + c; + mValues[element] = value; + onChanged(); + } + + /** + * Returns the index for which {@link #keyAt} would return the specified key, or a + * negative number if the specified key is not mapped. + */ + public int indexOfKey(int key) { + return binarySearch(mKeys, mSize, key); + } + + /** + * Return true if the matrix knows the user index. + */ + public boolean contains(int key) { + return indexOfKey(key) >= 0; + } + + /** + * Fetch the index of a key. If the key does not exist and grow is true, then add the + * key. If the does not exist and grow is false, return -1. + */ + private int indexOfKey(int key, boolean grow) { + int i = binarySearch(mKeys, mSize, key); + if (i < 0 && grow) { + i = ~i; + if (mSize >= mOrder) { + // Preemptively grow the matrix, which also grows the free list. + growMatrix(); + } + int newIndex = nextFree(); + mKeys = GrowingArrayUtils.insert(mKeys, mSize, i, key); + mMap = GrowingArrayUtils.insert(mMap, mSize, i, newIndex); + mSize++; + // Initialize the row and column corresponding to the new index. + for (int n = 0; n < mSize; n++) { + mValues[n * mOrder + newIndex] = false; + mValues[newIndex * mOrder + n] = false; + } + onChanged(); + } + return i; + } + + /** + * Validate the index. This can throw. + */ + private void validateIndex(int index) { + if (index >= mSize) { + // The array might be slightly bigger than mSize, in which case, indexing won't fail. + throw new ArrayIndexOutOfBoundsException(index); + } + } + + /** + * Validate two indices. + */ + private void validateIndex(int row, int col) { + validateIndex(row); + validateIndex(col); + } + + /** + * Find an unused storage index, mark it in-use, and return it. + */ + private int nextFree() { + for (int i = 0; i < mInUse.length; i++) { + if (!mInUse[i]) { + mInUse[i] = true; + return i; + } + } + throw new RuntimeException(); + } + + /** + * Expand the 2D array. This also extends the free list. + */ + private void growMatrix() { + int newOrder = mOrder + STEP; + + boolean[] newInuse = Arrays.copyOf(mInUse, newOrder); + + boolean[] newValues = new boolean[newOrder * newOrder]; + for (int i = 0; i < mOrder; i++) { + int row = mOrder * i; + int newRow = newOrder * i; + for (int j = 0; j < mOrder; j++) { + int index = row + j; + int newIndex = newRow + j; + newValues[newIndex] = mValues[index]; + } + } + + mInUse = newInuse; + mValues = newValues; + mOrder = newOrder; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + int hashCode = mSize; + for (int i = 0; i < mSize; i++) { + hashCode = 31 * hashCode + mKeys[i]; + hashCode = 31 * hashCode + mMap[i]; + } + for (int i = 0; i < mSize; i++) { + int row = mMap[i] * mOrder; + for (int j = 0; j < mSize; j++) { + int element = mMap[j] + row; + hashCode = 31 * hashCode + (mValues[element] ? 1 : 0); + } + } + return hashCode; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(@Nullable Object that) { + if (this == that) { + return true; + } + + if (!(that instanceof WatchedSparseBooleanMatrix)) { + return false; + } + + WatchedSparseBooleanMatrix other = (WatchedSparseBooleanMatrix) that; + if (mSize != other.mSize) { + return false; + } + + for (int i = 0; i < mSize; i++) { + if (mKeys[i] != other.mKeys[i]) { + return false; + } + if (mMap[i] != other.mMap[i]) { + return false; + } + } + for (int i = 0; i < mSize; i++) { + int row = mMap[i] * mOrder; + for (int j = 0; j < mSize; j++) { + int element = mMap[j] + row; + if (mValues[element] != other.mValues[element]) { + return false; + } + } + } + return true; + } + + /** + * Return the matrix meta information. This is always three strings long. + */ + private @Size(3) String[] matrixToStringMeta() { + String[] result = new String[3]; + + StringBuilder k = new StringBuilder(); + for (int i = 0; i < mSize; i++) { + k.append(mKeys[i]); + if (i < mSize - 1) { + k.append(" "); + } + } + result[0] = k.substring(0); + + StringBuilder m = new StringBuilder(); + for (int i = 0; i < mSize; i++) { + m.append(mMap[i]); + if (i < mSize - 1) { + m.append(" "); + } + } + result[1] = m.substring(0); + + StringBuilder u = new StringBuilder(); + for (int i = 0; i < mOrder; i++) { + u.append(mInUse[i] ? "1" : "0"); + } + result[2] = u.substring(0); + return result; + } + + /** + * Return the matrix as an array of strings. There is one string per row. Each + * string has a '1' or a '0' in the proper column. + */ + private String[] matrixToStringRaw() { + String[] result = new String[mOrder]; + for (int i = 0; i < mOrder; i++) { + int row = i * mOrder; + StringBuilder line = new StringBuilder(mOrder); + for (int j = 0; j < mOrder; j++) { + int element = row + j; + line.append(mValues[element] ? "1" : "0"); + } + result[i] = line.substring(0); + } + return result; + } + + private String[] matrixToStringCooked() { + String[] result = new String[mSize]; + for (int i = 0; i < mSize; i++) { + int row = mMap[i] * mOrder; + StringBuilder line = new StringBuilder(mSize); + for (int j = 0; j < mSize; j++) { + int element = row + mMap[j]; + line.append(mValues[element] ? "1" : "0"); + } + result[i] = line.substring(0); + } + return result; + } + + public String[] matrixToString(boolean raw) { + String[] meta = matrixToStringMeta(); + String[] data; + if (raw) { + data = matrixToStringRaw(); + } else { + data = matrixToStringCooked(); + } + String[] result = new String[meta.length + data.length]; + System.arraycopy(meta, 0, result, 0, meta.length); + System.arraycopy(data, 0, result, meta.length, data.length); + return result; + } + + /** + * {@inheritDoc} + * + * <p>This implementation creates a string that describes the size of the array. A + * string with all the values could easily exceed 1Mb. + */ + @Override + public String toString() { + return "{" + mSize + "x" + mSize + "}"; + } + + // Copied from android.util.ContainerHelpers, which is not visible outside the + // android.util package. + private static int binarySearch(int[] array, int size, int value) { + int lo = 0; + int hi = size - 1; + + while (lo <= hi) { + final int mid = (lo + hi) >>> 1; + final int midVal = array[mid]; + + if (midVal < value) { + lo = mid + 1; + } else if (midVal > value) { + hi = mid - 1; + } else { + return mid; // value found + } + } + return ~lo; // value not present + } +} diff --git a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java index 5565ccb6cf7c..fca706b707fa 100644 --- a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java +++ b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java @@ -39,7 +39,6 @@ import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.TelephonyManager; import android.util.ArrayMap; import android.util.ArraySet; -import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; @@ -222,12 +221,10 @@ public class TelephonySubscriptionTracker extends BroadcastReceiver { if (SubscriptionManager.isValidSubscriptionId(subId)) { final PersistableBundle carrierConfigs = mCarrierConfigManager.getConfigForSubId(subId); if (mDeps.isConfigForIdentifiedCarrier(carrierConfigs)) { - Slog.v(TAG, String.format("SubId %s ready for SlotId %s", subId, slotId)); mReadySubIdsBySlotId.put(slotId, subId); handleSubscriptionsChanged(); } } else { - Slog.v(TAG, "Slot unloaded: " + slotId); mReadySubIdsBySlotId.remove(slotId); handleSubscriptionsChanged(); } diff --git a/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java b/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java index fb4c6236a9a0..732035951462 100644 --- a/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java +++ b/services/core/java/com/android/server/vcn/UnderlyingNetworkTracker.java @@ -20,6 +20,8 @@ import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.telephony.TelephonyCallback.ActiveDataSubscriptionIdListener; +import static com.android.server.VcnManagementService.LOCAL_LOG; + import android.annotation.NonNull; import android.annotation.Nullable; import android.net.ConnectivityManager; @@ -40,6 +42,7 @@ import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; import android.util.ArrayMap; import android.util.Slog; +import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; @@ -106,6 +109,17 @@ public class UnderlyingNetworkTracker { @VisibleForTesting(visibility = Visibility.PRIVATE) static final int PRIORITY_ANY = Integer.MAX_VALUE; + private static final SparseArray<String> PRIORITY_TO_STRING_MAP = new SparseArray<>(); + + static { + PRIORITY_TO_STRING_MAP.put( + PRIORITY_OPPORTUNISTIC_CELLULAR, "PRIORITY_OPPORTUNISTIC_CELLULAR"); + PRIORITY_TO_STRING_MAP.put(PRIORITY_WIFI_IN_USE, "PRIORITY_WIFI_IN_USE"); + PRIORITY_TO_STRING_MAP.put(PRIORITY_WIFI_PROSPECTIVE, "PRIORITY_WIFI_PROSPECTIVE"); + PRIORITY_TO_STRING_MAP.put(PRIORITY_MACRO_CELLULAR, "PRIORITY_MACRO_CELLULAR"); + PRIORITY_TO_STRING_MAP.put(PRIORITY_ANY, "PRIORITY_ANY"); + } + @NonNull private final VcnContext mVcnContext; @NonNull private final ParcelUuid mSubscriptionGroup; @NonNull private final Set<Integer> mRequiredUnderlyingNetworkCapabilities; @@ -403,12 +417,12 @@ public class UnderlyingNetworkTracker { } private void reevaluateNetworks() { - TreeSet<UnderlyingNetworkRecord> sorted = - new TreeSet<>( - UnderlyingNetworkRecord.getComparator( - mSubscriptionGroup, mLastSnapshot, mCurrentRecord, mCarrierConfig)); - sorted.addAll(mRouteSelectionCallback.getUnderlyingNetworks()); + if (mRouteSelectionCallback == null) { + return; // UnderlyingNetworkTracker has quit. + } + TreeSet<UnderlyingNetworkRecord> sorted = + mRouteSelectionCallback.getSortedUnderlyingNetworks(); UnderlyingNetworkRecord candidate = sorted.isEmpty() ? null : sorted.first(); if (Objects.equals(mCurrentRecord, candidate)) { return; @@ -421,7 +435,7 @@ public class UnderlyingNetworkTracker { private static boolean isOpportunistic( @NonNull TelephonySubscriptionSnapshot snapshot, Set<Integer> subIds) { if (snapshot == null) { - Slog.wtf(TAG, "Got null snapshot"); + logWtf("Got null snapshot"); return false; } @@ -454,17 +468,23 @@ public class UnderlyingNetworkTracker { private final Map<Network, UnderlyingNetworkRecord.Builder> mUnderlyingNetworkRecordBuilders = new ArrayMap<>(); - private List<UnderlyingNetworkRecord> getUnderlyingNetworks() { - final List<UnderlyingNetworkRecord> records = new ArrayList<>(); + private TreeSet<UnderlyingNetworkRecord> getSortedUnderlyingNetworks() { + TreeSet<UnderlyingNetworkRecord> sorted = + new TreeSet<>( + UnderlyingNetworkRecord.getComparator( + mSubscriptionGroup, + mLastSnapshot, + mCurrentRecord, + mCarrierConfig)); for (UnderlyingNetworkRecord.Builder builder : mUnderlyingNetworkRecordBuilders.values()) { if (builder.isValid()) { - records.add(builder.build()); + sorted.add(builder.build()); } } - return records; + return sorted; } @Override @@ -486,7 +506,7 @@ public class UnderlyingNetworkTracker { final UnderlyingNetworkRecord.Builder builder = mUnderlyingNetworkRecordBuilders.get(network); if (builder == null) { - Slog.wtf(TAG, "Got capabilities change for unknown key: " + network); + logWtf("Got capabilities change for unknown key: " + network); return; } @@ -502,7 +522,7 @@ public class UnderlyingNetworkTracker { final UnderlyingNetworkRecord.Builder builder = mUnderlyingNetworkRecordBuilders.get(network); if (builder == null) { - Slog.wtf(TAG, "Got link properties change for unknown key: " + network); + logWtf("Got link properties change for unknown key: " + network); return; } @@ -517,7 +537,7 @@ public class UnderlyingNetworkTracker { final UnderlyingNetworkRecord.Builder builder = mUnderlyingNetworkRecordBuilders.get(network); if (builder == null) { - Slog.wtf(TAG, "Got blocked status change for unknown key: " + network); + logWtf("Got blocked status change for unknown key: " + network); return; } @@ -605,7 +625,7 @@ public class UnderlyingNetworkTracker { // mRouteSelectionNetworkRequest requires a network be both VALIDATED and NOT_SUSPENDED if (isBlocked) { - Slog.wtf(TAG, "Network blocked for System Server: " + network); + logWtf("Network blocked for System Server: " + network); return PRIORITY_ANY; } @@ -668,10 +688,21 @@ public class UnderlyingNetworkTracker { } /** Dumps the state of this record for logging and debugging purposes. */ - public void dump(IndentingPrintWriter pw) { + private void dump( + IndentingPrintWriter pw, + ParcelUuid subscriptionGroup, + TelephonySubscriptionSnapshot snapshot, + UnderlyingNetworkRecord currentlySelected, + PersistableBundle carrierConfig) { pw.println("UnderlyingNetworkRecord:"); pw.increaseIndent(); + final int priorityClass = + calculatePriorityClass( + subscriptionGroup, snapshot, currentlySelected, carrierConfig); + pw.println( + "Priority class: " + PRIORITY_TO_STRING_MAP.get(priorityClass) + " (" + + priorityClass + ")"); pw.println("mNetwork: " + network); pw.println("mNetworkCapabilities: " + networkCapabilities); pw.println("mLinkProperties: " + linkProperties); @@ -741,6 +772,40 @@ public class UnderlyingNetworkTracker { } } + private static void logWtf(String msg) { + Slog.wtf(TAG, msg); + LOCAL_LOG.log(TAG + " WTF: " + msg); + } + + private static void logWtf(String msg, Throwable tr) { + Slog.wtf(TAG, msg, tr); + LOCAL_LOG.log(TAG + " WTF: " + msg + tr); + } + + /** Dumps the state of this record for logging and debugging purposes. */ + public void dump(IndentingPrintWriter pw) { + pw.println("UnderlyingNetworkTracker:"); + pw.increaseIndent(); + + pw.println("Carrier WiFi Entry Threshold: " + getWifiEntryRssiThreshold(mCarrierConfig)); + pw.println("Carrier WiFi Exit Threshold: " + getWifiExitRssiThreshold(mCarrierConfig)); + pw.println( + "Currently selected: " + (mCurrentRecord == null ? null : mCurrentRecord.network)); + + pw.println("Underlying networks:"); + pw.increaseIndent(); + if (mRouteSelectionCallback != null) { + for (UnderlyingNetworkRecord record : + mRouteSelectionCallback.getSortedUnderlyingNetworks()) { + record.dump(pw, mSubscriptionGroup, mLastSnapshot, mCurrentRecord, mCarrierConfig); + } + } + pw.decreaseIndent(); + pw.println(); + + pw.decreaseIndent(); + } + private class VcnActiveDataSubscriptionIdListener extends TelephonyCallback implements ActiveDataSubscriptionIdListener { @Override diff --git a/services/core/java/com/android/server/vcn/Vcn.java b/services/core/java/com/android/server/vcn/Vcn.java index f918827e9639..f7d61367c81e 100644 --- a/services/core/java/com/android/server/vcn/Vcn.java +++ b/services/core/java/com/android/server/vcn/Vcn.java @@ -24,6 +24,7 @@ import static android.net.vcn.VcnManager.VCN_STATUS_CODE_ACTIVE; import static android.net.vcn.VcnManager.VCN_STATUS_CODE_INACTIVE; import static android.net.vcn.VcnManager.VCN_STATUS_CODE_SAFE_MODE; +import static com.android.server.VcnManagementService.LOCAL_LOG; import static com.android.server.VcnManagementService.VDBG; import android.annotation.NonNull; @@ -513,37 +514,44 @@ public class Vcn extends Handler { } private String getLogPrefix() { - return "[" + LogUtils.getHashedSubscriptionGroup(mSubscriptionGroup) + "]: "; + return "[" + LogUtils.getHashedSubscriptionGroup(mSubscriptionGroup) + "] "; } private void logVdbg(String msg) { if (VDBG) { Slog.v(TAG, getLogPrefix() + msg); + LOCAL_LOG.log(getLogPrefix() + "VDBG: " + msg); } } private void logDbg(String msg) { Slog.d(TAG, getLogPrefix() + msg); + LOCAL_LOG.log(getLogPrefix() + "DBG: " + msg); } private void logDbg(String msg, Throwable tr) { Slog.d(TAG, getLogPrefix() + msg, tr); + LOCAL_LOG.log(getLogPrefix() + "DBG: " + msg + tr); } private void logErr(String msg) { Slog.e(TAG, getLogPrefix() + msg); + LOCAL_LOG.log(getLogPrefix() + "ERR: " + msg); } private void logErr(String msg, Throwable tr) { Slog.e(TAG, getLogPrefix() + msg, tr); + LOCAL_LOG.log(getLogPrefix() + "ERR: " + msg + tr); } private void logWtf(String msg) { Slog.wtf(TAG, getLogPrefix() + msg); + LOCAL_LOG.log(getLogPrefix() + "WTF: " + msg); } private void logWtf(String msg, Throwable tr) { Slog.wtf(TAG, getLogPrefix() + msg, tr); + LOCAL_LOG.log(getLogPrefix() + "WTF: " + msg + tr); } /** @@ -557,11 +565,14 @@ public class Vcn extends Handler { pw.println("mCurrentStatus: " + mCurrentStatus); pw.println("mIsMobileDataEnabled: " + mIsMobileDataEnabled); + pw.println(); pw.println("mVcnGatewayConnections:"); + pw.increaseIndent(); for (VcnGatewayConnection gw : mVcnGatewayConnections.values()) { gw.dump(pw); } + pw.decreaseIndent(); pw.println(); pw.decreaseIndent(); diff --git a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java index 5cecff6f93c1..55e3ed620160 100644 --- a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java +++ b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java @@ -30,6 +30,7 @@ import static android.net.vcn.VcnManager.VCN_ERROR_CODE_CONFIG_ERROR; import static android.net.vcn.VcnManager.VCN_ERROR_CODE_INTERNAL_ERROR; import static android.net.vcn.VcnManager.VCN_ERROR_CODE_NETWORK_ERROR; +import static com.android.server.VcnManagementService.LOCAL_LOG; import static com.android.server.VcnManagementService.VDBG; import android.annotation.NonNull; @@ -1645,7 +1646,7 @@ public class VcnGatewayConnection extends StateMachine { @NonNull IpSecTransform transform, int direction) { if (direction != IpSecManager.DIRECTION_IN && direction != IpSecManager.DIRECTION_OUT) { - Slog.wtf(TAG, "Applying transform for unexpected direction: " + direction); + logWtf("Applying transform for unexpected direction: " + direction); } try { @@ -1970,6 +1971,9 @@ public class VcnGatewayConnection extends StateMachine { } builder.setAdministratorUids(adminUids); + builder.setLinkUpstreamBandwidthKbps(underlyingCaps.getLinkUpstreamBandwidthKbps()); + builder.setLinkDownstreamBandwidthKbps(underlyingCaps.getLinkDownstreamBandwidthKbps()); + // Set TransportInfo for SysUI use (never parcelled out of SystemServer). if (underlyingCaps.hasTransport(TRANSPORT_WIFI) && underlyingCaps.getTransportInfo() instanceof WifiInfo) { @@ -1986,6 +1990,11 @@ public class VcnGatewayConnection extends StateMachine { "Unknown transport type or missing TransportInfo/NetworkSpecifier for" + " non-null underlying network"); } + } else { + Slog.wtf( + TAG, + "No underlying network while building network capabilities", + new IllegalStateException()); } return builder.build(); @@ -2013,7 +2022,18 @@ public class VcnGatewayConnection extends StateMachine { lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null /*gateway*/, null /*iface*/, RouteInfo.RTN_UNICAST)); - final int underlyingMtu = (underlying == null) ? 0 : underlying.linkProperties.getMtu(); + int underlyingMtu = 0; + if (underlying != null) { + final LinkProperties underlyingLp = underlying.linkProperties; + + lp.setTcpBufferSizes(underlyingLp.getTcpBufferSizes()); + underlyingMtu = underlyingLp.getMtu(); + } else { + Slog.wtf( + TAG, + "No underlying network while building link properties", + new IllegalStateException()); + } lp.setMtu( MtuUtils.getMtu( ikeTunnelParams.getTunnelModeChildSessionParams().getSaProposals(), @@ -2115,37 +2135,44 @@ public class VcnGatewayConnection extends StateMachine { + LogUtils.getHashedSubscriptionGroup(mSubscriptionGroup) + "-" + mConnectionConfig.getGatewayConnectionName() - + "]: "; + + "] "; } private void logVdbg(String msg) { if (VDBG) { Slog.v(TAG, getLogPrefix() + msg); + LOCAL_LOG.log(getLogPrefix() + "VDBG: " + msg); } } private void logDbg(String msg) { Slog.d(TAG, getLogPrefix() + msg); + LOCAL_LOG.log(getLogPrefix() + "DBG: " + msg); } private void logDbg(String msg, Throwable tr) { Slog.d(TAG, getLogPrefix() + msg, tr); + LOCAL_LOG.log(getLogPrefix() + "DBG: " + msg + tr); } private void logErr(String msg) { Slog.e(TAG, getLogPrefix() + msg); + LOCAL_LOG.log(getLogPrefix() + "ERR: " + msg); } private void logErr(String msg, Throwable tr) { Slog.e(TAG, getLogPrefix() + msg, tr); + LOCAL_LOG.log(getLogPrefix() + "ERR: " + msg + tr); } private void logWtf(String msg) { Slog.wtf(TAG, getLogPrefix() + msg); + LOCAL_LOG.log(getLogPrefix() + "WTF: " + msg); } private void logWtf(String msg, Throwable tr) { Slog.wtf(TAG, getLogPrefix() + msg, tr); + LOCAL_LOG.log(getLogPrefix() + "WTF: " + msg + tr); } /** @@ -2169,15 +2196,9 @@ public class VcnGatewayConnection extends StateMachine { pw.println( "mNetworkAgent.getNetwork(): " + (mNetworkAgent == null ? null : mNetworkAgent.getNetwork())); + pw.println(); - pw.println("mUnderlying:"); - pw.increaseIndent(); - if (mUnderlying != null) { - mUnderlying.dump(pw); - } else { - pw.println("null"); - } - pw.decreaseIndent(); + mUnderlyingNetworkTracker.dump(pw); pw.println(); pw.decreaseIndent(); diff --git a/services/core/java/com/android/server/vcn/VcnNetworkProvider.java b/services/core/java/com/android/server/vcn/VcnNetworkProvider.java index 72cd7880325f..31ee2477fa64 100644 --- a/services/core/java/com/android/server/vcn/VcnNetworkProvider.java +++ b/services/core/java/com/android/server/vcn/VcnNetworkProvider.java @@ -172,6 +172,10 @@ public class VcnNetworkProvider extends NetworkProvider { } private void handleNetworkRequestWithdrawn(@NonNull NetworkRequest request) { + if (VDBG) { + Slog.v(TAG, "Network request withdrawn: Request = " + request); + } + mRequests.remove(request); } diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 065dc6e4f8ed..38966b93681c 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -16,7 +16,6 @@ package com.android.server.wm; -import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.app.ActivityManager.LOCK_TASK_MODE_NONE; import static android.app.ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND; import static android.app.ActivityOptions.ANIM_CLIP_REVEAL; @@ -90,7 +89,6 @@ import static android.content.pm.ActivityInfo.SIZE_CHANGES_SUPPORTED_OVERRIDE; import static android.content.pm.ActivityInfo.SIZE_CHANGES_UNSUPPORTED_OVERRIDE; import static android.content.pm.ActivityInfo.isFixedOrientationLandscape; import static android.content.pm.ActivityInfo.isFixedOrientationPortrait; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.content.res.Configuration.ASSETS_SEQ_UNDEFINED; import static android.content.res.Configuration.EMPTY; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; @@ -279,7 +277,6 @@ import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; import android.os.storage.StorageManager; -import android.permission.PermissionManager; import android.service.dreams.DreamActivity; import android.service.dreams.DreamManagerInternal; import android.service.voice.IVoiceInteractionSession; @@ -7457,11 +7454,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override public boolean providesMaxBounds() { - // System and SystemUI should always be able to access the physical display bounds, - // so do not provide it with the overridden maximum bounds. - // TODO(b/179179513) check WindowState#mOwnerCanAddInternalSystemWindow instead - if (getUid() == SYSTEM_UID || PermissionManager.checkPermission(INTERNAL_SYSTEM_WINDOW, - getPid(), info.applicationInfo.uid) == PERMISSION_GRANTED) { + // System should always be able to access the DisplayArea bounds, so do not provide it with + // compat max window bounds. + if (getUid() == SYSTEM_UID) { return false; } // Do not sandbox to activity window bounds if the feature is disabled. diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index 9178a8d16d16..01ee3be08f5f 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -618,7 +618,7 @@ public abstract class ActivityTaskManagerInternal { /** * Commit changes. */ - void commit() throws RemoteException; + void commit(); } /** diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index c7e4abbe3db5..134ecdeffa8f 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -6390,9 +6390,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public PackageConfigurationUpdater createPackageConfigurationUpdater() { - synchronized (mGlobalLock) { - return new PackageConfigurationUpdaterImpl(Binder.getCallingPid()); - } + return new PackageConfigurationUpdaterImpl(Binder.getCallingPid()); } @Override @@ -6405,7 +6403,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final class PackageConfigurationUpdaterImpl implements ActivityTaskManagerInternal.PackageConfigurationUpdater { - private int mPid; + private final int mPid; private int mNightMode; PackageConfigurationUpdaterImpl(int pid) { @@ -6419,24 +6417,26 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override - public void commit() throws RemoteException { - if (mPid == 0) { - throw new RemoteException("Invalid process"); - } + public void commit() { synchronized (mGlobalLock) { - final WindowProcessController wpc = mProcessMap.getProcess(mPid); - if (wpc == null) { - Slog.w(TAG, "Override application configuration: cannot find application"); - return; - } - if (wpc.getNightMode() == mNightMode) { - return; - } - if (!wpc.setOverrideNightMode(mNightMode)) { - return; + final long ident = Binder.clearCallingIdentity(); + try { + final WindowProcessController wpc = mProcessMap.getProcess(mPid); + if (wpc == null) { + Slog.w(TAG, "Override application configuration: cannot find pid " + mPid); + return; + } + if (wpc.getNightMode() == mNightMode) { + return; + } + if (!wpc.setOverrideNightMode(mNightMode)) { + return; + } + wpc.updateNightModeForAllActivities(mNightMode); + mPackageConfigPersister.updateFromImpl(wpc.mName, wpc.mUserId, this); + } finally { + Binder.restoreCallingIdentity(ident); } - wpc.updateNightModeForAllActivities(mNightMode); - mPackageConfigPersister.updateFromImpl(wpc.mName, wpc.mUserId, this); } } diff --git a/services/core/java/com/android/server/wm/BlurController.java b/services/core/java/com/android/server/wm/BlurController.java index ff1016855287..03639449c3df 100644 --- a/services/core/java/com/android/server/wm/BlurController.java +++ b/services/core/java/com/android/server/wm/BlurController.java @@ -29,6 +29,7 @@ import android.os.RemoteCallbackList; import android.os.RemoteException; import android.provider.Settings; import android.view.ICrossWindowBlurEnabledListener; +import android.view.TunnelModeEnabledListener; /** * Keeps track of the different factors that determine whether cross-window blur is enabled @@ -45,6 +46,16 @@ final class BlurController { private volatile boolean mBlurEnabled; private boolean mInPowerSaveMode; private boolean mBlurDisabledSetting; + private boolean mTunnelModeEnabled = false; + + private TunnelModeEnabledListener mTunnelModeListener = + new TunnelModeEnabledListener(Runnable::run) { + @Override + public void onTunnelModeEnabledChanged(boolean tunnelModeEnabled) { + mTunnelModeEnabled = tunnelModeEnabled; + updateBlurEnabled(); + } + }; BlurController(Context context, PowerManager powerManager) { mContext = context; @@ -78,6 +89,8 @@ final class BlurController { }); mBlurDisabledSetting = getBlurDisabledSetting(); + TunnelModeEnabledListener.register(mTunnelModeListener); + updateBlurEnabled(); } @@ -99,7 +112,7 @@ final class BlurController { private void updateBlurEnabled() { synchronized (mLock) { final boolean newEnabled = CROSS_WINDOW_BLUR_SUPPORTED && !mBlurDisabledSetting - && !mInPowerSaveMode; + && !mInPowerSaveMode && !mTunnelModeEnabled; if (mBlurEnabled == newEnabled) { return; } diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java index c387d338a3b2..f2f192686ad5 100644 --- a/services/core/java/com/android/server/wm/InsetsPolicy.java +++ b/services/core/java/com/android/server/wm/InsetsPolicy.java @@ -22,6 +22,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; import static android.view.InsetsController.ANIMATION_TYPE_HIDE; import static android.view.InsetsController.ANIMATION_TYPE_SHOW; +import static android.view.InsetsController.LAYOUT_INSETS_DURING_ANIMATION_HIDDEN; +import static android.view.InsetsController.LAYOUT_INSETS_DURING_ANIMATION_SHOWN; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; @@ -522,7 +524,10 @@ class InsetsPolicy { mAnimationControl = new InsetsAnimationControlImpl(controls, null /* frame */, state, mListener, typesReady, this, mListener.getDurationMs(), getInsetsInterpolator(), - show ? ANIMATION_TYPE_SHOW : ANIMATION_TYPE_HIDE, null /* translator */); + show ? ANIMATION_TYPE_SHOW : ANIMATION_TYPE_HIDE, show + ? LAYOUT_INSETS_DURING_ANIMATION_SHOWN + : LAYOUT_INSETS_DURING_ANIMATION_HIDDEN, + null /* translator */); SurfaceAnimationThread.getHandler().post( () -> mListener.onReady(mAnimationControl, typesReady)); } diff --git a/services/core/java/com/android/server/wm/OWNERS b/services/core/java/com/android/server/wm/OWNERS index 1077736cebb5..6602d29883e4 100644 --- a/services/core/java/com/android/server/wm/OWNERS +++ b/services/core/java/com/android/server/wm/OWNERS @@ -12,3 +12,5 @@ riddlehsu@google.com louischang@google.com winsonc@google.com tigerhuang@google.com +lihongyu@google.com +mariiasand@google.com diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index 737e7d10c3b4..2feb8a743930 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -1163,9 +1163,6 @@ public class RecentsAnimationController implements DeathRecipient { // Apply the task's pending transaction in case it is detached and its transaction // is not reachable. mTask.getPendingTransaction().apply(); - - // Reset whether this task can affect the sysui flags - mTask.setCanAffectSystemUiFlags(true); } } diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index 50749a961b27..9d8b8f76ad40 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -372,7 +372,7 @@ class ScreenRotationAnimation { mRotateExitAnimation = AnimationUtils.loadAnimation(mContext, R.anim.screen_rotate_0_exit); mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext, - R.anim.screen_rotate_0_enter); + R.anim.rotation_animation_enter); break; case Surface.ROTATION_90: mRotateExitAnimation = AnimationUtils.loadAnimation(mContext, diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 93fc4f2a3149..039422d2c6a4 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -5407,17 +5407,17 @@ class Task extends WindowContainer<WindowContainer> { : WINDOWING_MODE_FULLSCREEN; } if (currentMode == WINDOWING_MODE_PINNED) { + mRootWindowContainer.notifyActivityPipModeChanged(null); + } + if (likelyResolvedMode == WINDOWING_MODE_PINNED) { // In the case that we've disabled affecting the SysUI flags as a part of seamlessly // transferring the transform on the leash to the task, reset this state once we've // actually entered pip setCanAffectSystemUiFlags(true); - mRootWindowContainer.notifyActivityPipModeChanged(null); - } - if (likelyResolvedMode == WINDOWING_MODE_PINNED - && taskDisplayArea.getRootPinnedTask() != null) { - - // Can only have 1 pip at a time, so replace an existing pip - taskDisplayArea.getRootPinnedTask().dismissPip(); + if (taskDisplayArea.getRootPinnedTask() != null) { + // Can only have 1 pip at a time, so replace an existing pip + taskDisplayArea.getRootPinnedTask().dismissPip(); + } } if (likelyResolvedMode != WINDOWING_MODE_FULLSCREEN && topActivity != null && !topActivity.noDisplay diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 025153706922..7df5744cdf15 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -8105,11 +8105,10 @@ public class WindowManagerService extends IWindowManager.Stub // This could prevent if there is no container animation, we still have to apply the // pending transaction and exit waiting. mAnimator.mNotifyWhenNoAnimation = true; - WindowContainer animatingContainer = null; - while (mAnimator.isAnimationScheduled() || timeoutRemaining > 0) { - animatingContainer = mRoot.getAnimatingContainer(TRANSITION | CHILDREN, - ANIMATION_TYPE_ALL); - if (animatingContainer == null) { + while (timeoutRemaining > 0) { + boolean isAnimating = mAnimator.isAnimationScheduled() + || mRoot.isAnimating(TRANSITION | CHILDREN, ANIMATION_TYPE_ALL); + if (!isAnimating) { break; } long startTime = System.currentTimeMillis(); @@ -8121,6 +8120,9 @@ public class WindowManagerService extends IWindowManager.Stub } mAnimator.mNotifyWhenNoAnimation = false; + WindowContainer animatingContainer; + animatingContainer = mRoot.getAnimatingContainer(TRANSITION | CHILDREN, + ANIMATION_TYPE_ALL); if (mAnimator.isAnimationScheduled() || animatingContainer != null) { Slog.w(TAG, "Timed out waiting for animations to complete," + " animatingContainer=" + animatingContainer diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java b/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java index 8d43bbb37c71..ce8f6df9ce3d 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java @@ -1190,7 +1190,7 @@ class ActiveAdmin { pw.println(mEnrollmentSpecificId); } - pw.print("mAdminCanGrantSensorsPermissions"); + pw.print("mAdminCanGrantSensorsPermissions="); pw.println(mAdminCanGrantSensorsPermissions); pw.print("mUsbDataSignaling="); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 891ed3d9af93..bc130e2c1e5b 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -8579,6 +8579,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final DevicePolicyData policyData = getUserData(userId); policyData.mCurrentInputMethodSet = false; saveSettingsLocked(userId); + mPolicyCache.onUserRemoved(userId); final DevicePolicyData systemPolicyData = getUserData(UserHandle.USER_SYSTEM); systemPolicyData.mLastSecurityLogRetrievalTime = -1; systemPolicyData.mLastBugReportRequestTime = -1; diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index ad89e96c7438..d487483cfb56 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -103,7 +103,6 @@ import com.android.internal.util.FrameworkStatsLog; import com.android.internal.widget.ILockSettings; import com.android.server.am.ActivityManagerService; import com.android.server.appbinding.AppBindingService; -import com.android.server.art.ArtManagerLocal; import com.android.server.attention.AttentionManagerService; import com.android.server.audio.AudioService; import com.android.server.biometrics.AuthService; @@ -2632,10 +2631,6 @@ public final class SystemServer implements Dumpable { mSystemServiceManager.startService(GAME_MANAGER_SERVICE_CLASS); t.traceEnd(); - t.traceBegin("ArtManagerLocal"); - LocalManagerRegistry.addManager(ArtManagerLocal.class, new ArtManagerLocal()); - t.traceEnd(); - if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_UWB)) { t.traceBegin("UwbService"); mSystemServiceManager.startService(UWB_SERVICE_CLASS); diff --git a/services/midi/java/com/android/server/midi/MidiService.java b/services/midi/java/com/android/server/midi/MidiService.java index 47505a398a6f..e31be82bcff7 100644 --- a/services/midi/java/com/android/server/midi/MidiService.java +++ b/services/midi/java/com/android/server/midi/MidiService.java @@ -43,6 +43,7 @@ import android.os.IBinder; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; +import android.util.EventLog; import android.util.Log; import com.android.internal.content.PackageMonitor; @@ -736,13 +737,19 @@ public class MidiService extends IMidiManager.Stub { @Override public MidiDeviceInfo getServiceDeviceInfo(String packageName, String className) { + int uid = Binder.getCallingUid(); synchronized (mDevicesByInfo) { for (Device device : mDevicesByInfo.values()) { ServiceInfo serviceInfo = device.getServiceInfo(); if (serviceInfo != null && packageName.equals(serviceInfo.packageName) && className.equals(serviceInfo.name)) { - return device.getDeviceInfo(); + if (device.isUidAllowed(uid)) { + return device.getDeviceInfo(); + } else { + EventLog.writeEvent(0x534e4554, "185796676", -1, ""); + return null; + } } } return null; diff --git a/services/people/java/com/android/server/people/data/ConversationStatusExpirationBroadcastReceiver.java b/services/people/java/com/android/server/people/data/ConversationStatusExpirationBroadcastReceiver.java index c631026f4389..49d5e50e0345 100644 --- a/services/people/java/com/android/server/people/data/ConversationStatusExpirationBroadcastReceiver.java +++ b/services/people/java/com/android/server/people/data/ConversationStatusExpirationBroadcastReceiver.java @@ -20,26 +20,18 @@ import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.AlarmManager; import android.app.PendingIntent; -import android.app.job.JobInfo; -import android.app.job.JobParameters; -import android.app.job.JobScheduler; -import android.app.job.JobService; import android.app.people.ConversationStatus; import android.content.BroadcastReceiver; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; +import android.os.Binder; import android.os.CancellationSignal; -import android.os.SystemClock; import com.android.server.LocalServices; -import com.android.server.notification.NotificationRecord; import com.android.server.people.PeopleServiceInternal; -import java.util.concurrent.TimeUnit; - /** * If a {@link ConversationStatus} is added to the system with an expiration time, remove that * status at that time @@ -53,18 +45,22 @@ public class ConversationStatusExpirationBroadcastReceiver extends BroadcastRece void scheduleExpiration(Context context, @UserIdInt int userId, String pkg, String conversationId, ConversationStatus status) { - - final PendingIntent pi = PendingIntent.getBroadcast(context, - REQUEST_CODE, - new Intent(ACTION) - .setData(new Uri.Builder().scheme(SCHEME) - .appendPath(getKey(userId, pkg, conversationId, status)) - .build()) - .addFlags(Intent.FLAG_RECEIVER_FOREGROUND) - .putExtra(EXTRA_USER_ID, userId), - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); - context.getSystemService(AlarmManager.class).setExactAndAllowWhileIdle( - AlarmManager.RTC_WAKEUP, status.getEndTimeMillis(), pi); + final long identity = Binder.clearCallingIdentity(); + try { + final PendingIntent pi = PendingIntent.getBroadcast(context, + REQUEST_CODE, + new Intent(ACTION) + .setData(new Uri.Builder().scheme(SCHEME) + .appendPath(getKey(userId, pkg, conversationId, status)) + .build()) + .addFlags(Intent.FLAG_RECEIVER_FOREGROUND) + .putExtra(EXTRA_USER_ID, userId), + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + context.getSystemService(AlarmManager.class).setExactAndAllowWhileIdle( + AlarmManager.RTC_WAKEUP, status.getEndTimeMillis(), pi); + } finally { + Binder.restoreCallingIdentity(identity); + } } private static String getKey(@UserIdInt int userId, String pkg, diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java index 68cb8f94aa0a..3dc7bc1154ea 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java @@ -48,14 +48,18 @@ import static org.mockito.Mockito.verify; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.job.JobInfo; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManagerInternal; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkPolicyManager; +import android.os.BatteryManager; +import android.os.BatteryManagerInternal; import android.os.Build; import android.os.Looper; import android.os.SystemClock; @@ -70,6 +74,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; @@ -83,6 +88,8 @@ public class ConnectivityControllerTest { @Mock private Context mContext; @Mock + private BatteryManagerInternal mBatteryManagerInternal; + @Mock private ConnectivityManager mConnManager; @Mock private NetworkPolicyManager mNetPolicyManager; @@ -108,6 +115,9 @@ public class ConnectivityControllerTest { LocalServices.removeServiceForTest(NetworkPolicyManagerInternal.class); LocalServices.addService(NetworkPolicyManagerInternal.class, mNetPolicyManagerInternal); + LocalServices.removeServiceForTest(BatteryManagerInternal.class); + LocalServices.addService(BatteryManagerInternal.class, mBatteryManagerInternal); + when(mContext.getMainLooper()).thenReturn(Looper.getMainLooper()); // Freeze the clocks at this moment in time @@ -143,8 +153,18 @@ public class ConnectivityControllerTest { DataUnit.MEBIBYTES.toBytes(1)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); + final ArgumentCaptor<BroadcastReceiver> chargingCaptor = + ArgumentCaptor.forClass(BroadcastReceiver.class); + when(mBatteryManagerInternal.isPowered(eq(BatteryManager.BATTERY_PLUGGED_ANY))) + .thenReturn(false); final ConnectivityController controller = new ConnectivityController(mService); + verify(mContext).registerReceiver(chargingCaptor.capture(), + ArgumentMatchers.argThat(filter -> + filter.hasAction(BatteryManager.ACTION_CHARGING) + && filter.hasAction(BatteryManager.ACTION_DISCHARGING))); when(mService.getMaxJobExecutionTimeMs(any())).thenReturn(10 * 60_000L); + final BroadcastReceiver chargingReceiver = chargingCaptor.getValue(); + chargingReceiver.onReceive(mContext, new Intent(BatteryManager.ACTION_DISCHARGING)); // Slow network is too slow assertFalse(controller.isSatisfied(createJobStatus(job), net, @@ -166,7 +186,18 @@ public class ConnectivityControllerTest { assertTrue(controller.isSatisfied(createJobStatus(job), net, createCapabilitiesBuilder().setLinkUpstreamBandwidthKbps(130) .setLinkDownstreamBandwidthKbps(130).build(), mConstants)); + // Slow network is too slow, but device is charging and network is unmetered. + when(mBatteryManagerInternal.isPowered(eq(BatteryManager.BATTERY_PLUGGED_ANY))) + .thenReturn(true); + chargingReceiver.onReceive(mContext, new Intent(BatteryManager.ACTION_CHARGING)); + assertTrue(controller.isSatisfied(createJobStatus(job), net, + createCapabilitiesBuilder().addCapability(NET_CAPABILITY_NOT_METERED) + .setLinkUpstreamBandwidthKbps(1).setLinkDownstreamBandwidthKbps(1).build(), + mConstants)); + when(mBatteryManagerInternal.isPowered(eq(BatteryManager.BATTERY_PLUGGED_ANY))) + .thenReturn(false); + chargingReceiver.onReceive(mContext, new Intent(BatteryManager.ACTION_DISCHARGING)); when(mService.getMaxJobExecutionTimeMs(any())).thenReturn(60_000L); // Slow network is too slow @@ -189,6 +220,14 @@ public class ConnectivityControllerTest { assertFalse(controller.isSatisfied(createJobStatus(job), net, createCapabilitiesBuilder().setLinkUpstreamBandwidthKbps(130) .setLinkDownstreamBandwidthKbps(130).build(), mConstants)); + // Slow network is too slow, but device is charging and network is unmetered. + when(mBatteryManagerInternal.isPowered(eq(BatteryManager.BATTERY_PLUGGED_ANY))) + .thenReturn(true); + chargingReceiver.onReceive(mContext, new Intent(BatteryManager.ACTION_CHARGING)); + assertTrue(controller.isSatisfied(createJobStatus(job), net, + createCapabilitiesBuilder().addCapability(NET_CAPABILITY_NOT_METERED) + .setLinkUpstreamBandwidthKbps(1).setLinkDownstreamBandwidthKbps(1).build(), + mConstants)); } @Test diff --git a/services/tests/servicestests/src/com/android/server/am/FgsTempAllowListTest.java b/services/tests/servicestests/src/com/android/server/am/FgsTempAllowListTest.java index f85f0f843789..50d4d8475395 100644 --- a/services/tests/servicestests/src/com/android/server/am/FgsTempAllowListTest.java +++ b/services/tests/servicestests/src/com/android/server/am/FgsTempAllowListTest.java @@ -29,6 +29,9 @@ import android.util.Pair; import org.junit.Test; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; + /** * Build/Install/Run: * atest FrameworksServicesTests:TempAllowListTest @@ -41,7 +44,7 @@ public class FgsTempAllowListTest { */ @Test public void testIsAllowed() { - FgsTempAllowList<Integer, String> allowList = new FgsTempAllowList(); + FgsTempAllowList<String> allowList = new FgsTempAllowList(); allowList.add(10001, 2000, "description1"); allowList.add(10002, 2000, "description2"); @@ -55,7 +58,7 @@ public class FgsTempAllowListTest { assertNotNull(entry2); assertEquals(entry2.second, "description2"); - allowList.remove(10001); + allowList.removeUid(10001); assertFalse(allowList.isAllowed(10001)); assertNull(allowList.get(10001)); } @@ -65,7 +68,7 @@ public class FgsTempAllowListTest { */ @Test public void testExpired() { - FgsTempAllowList<Integer, String> allowList = new FgsTempAllowList(); + FgsTempAllowList<String> allowList = new FgsTempAllowList(); // temp allow for 2000ms. allowList.add(10001, 2000, "uid1-2000ms"); // sleep for 3000ms. @@ -74,4 +77,51 @@ public class FgsTempAllowListTest { assertFalse(allowList.isAllowed(10001)); assertNull(allowList.get(10001)); } + + @Test + public void testRemoveAppId() { + FgsTempAllowList<String> allowList = new FgsTempAllowList(); + allowList.add(10001, 2000, "description1"); + allowList.add(10002, 2000, "description2"); + allowList.add(10_10001, 2000, "description3"); + + assertTrue(allowList.isAllowed(10001)); + assertTrue(allowList.isAllowed(10002)); + assertTrue(allowList.isAllowed(10_10001)); + + allowList.removeAppId(10001); + + assertFalse(allowList.isAllowed(10001)); + assertTrue(allowList.isAllowed(10002)); + assertFalse(allowList.isAllowed(10_10001)); + } + + @Test + public void testForEach() { + final FgsTempAllowList<String> allowList = new FgsTempAllowList(); + + + // Call forEach(), return the sum of all the UIDs, and make sure the item is + // "uid" + uid. + final Supplier<Integer> callForEach = () -> { + final AtomicInteger sum = new AtomicInteger(); + sum.set(0); + allowList.forEach((uid, entry) -> { + sum.set(sum.get() + uid); + assertEquals(entry.second, "uid" + uid); + }); + return sum.get(); + }; + + // Call on th empty list. + assertEquals(0, (int) callForEach.get()); + + // Add one item. + allowList.add(1, 2000, "uid1"); + assertEquals(1, (int) callForEach.get()); + + // Add one more item. + allowList.add(10, 2000, "uid10"); + assertEquals(11, (int) callForEach.get()); + } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java index 4cd17e877689..b820df3871ce 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/OneTouchPlayActionTest.java @@ -37,7 +37,6 @@ import android.os.IThermalService; import android.os.Looper; import android.os.PowerManager; import android.os.test.TestLooper; -import android.provider.Settings; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -51,6 +50,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.ArrayList; +import java.util.Collections; /** Tests for {@link OneTouchPlayAction} */ @SmallTest @@ -69,6 +69,7 @@ public class OneTouchPlayActionTest { private Context mContextSpy; private HdmiControlService mHdmiControlService; private FakeNativeWrapper mNativeWrapper; + private FakeHdmiCecConfig mHdmiCecConfig; private TestLooper mTestLooper = new TestLooper(); private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>(); @@ -88,6 +89,7 @@ public class OneTouchPlayActionTest { MockitoAnnotations.initMocks(this); mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); + mHdmiCecConfig = new FakeHdmiCecConfig(mContextSpy); setHdmiControlEnabled(hdmiControlEnabled); @@ -99,7 +101,7 @@ public class OneTouchPlayActionTest { mIThermalServiceMock, new Handler(mTestLooper.getLooper()))); when(mIPowerManagerMock.isInteractive()).thenReturn(true); - mHdmiControlService = new HdmiControlService(mContextSpy) { + mHdmiControlService = new HdmiControlService(mContextSpy, Collections.emptyList()) { @Override AudioManager getAudioManager() { return new AudioManager() { @@ -134,7 +136,7 @@ public class OneTouchPlayActionTest { Looper looper = mTestLooper.getLooper(); mHdmiControlService.setIoLooper(looper); - mHdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(mContextSpy)); + mHdmiControlService.setHdmiCecConfig(mHdmiCecConfig); mNativeWrapper = new FakeNativeWrapper(); HdmiCecController hdmiCecController = HdmiCecController.createWithNativeWrapper( this.mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter()); @@ -479,7 +481,7 @@ public class OneTouchPlayActionTest { mTestLooper.dispatchAll(); assertThat(callback.hasResult()).isFalse(); - assertThat(playbackDevice.isActiveSource()).isFalse(); + mNativeWrapper.clearResultMessages(); setHdmiControlEnabled(true); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); @@ -498,6 +500,12 @@ public class OneTouchPlayActionTest { assertThat(mHdmiControlService.isAddressAllocated()).isTrue(); assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS); assertThat(playbackDevice.isActiveSource()).isTrue(); + HdmiCecMessage activeSource = HdmiCecMessageBuilder.buildActiveSource( + playbackDevice.mAddress, mPhysicalAddress); + HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(playbackDevice.mAddress, + ADDR_TV); + assertThat(mNativeWrapper.getResultMessages()).contains(activeSource); + assertThat(mNativeWrapper.getResultMessages()).contains(textViewOn); } @Test @@ -527,6 +535,12 @@ public class OneTouchPlayActionTest { assertThat(callback.getResult()).isEqualTo(HdmiControlManager.RESULT_SUCCESS); assertThat(playbackDevice.isActiveSource()).isTrue(); + HdmiCecMessage activeSource = HdmiCecMessageBuilder.buildActiveSource( + playbackDevice.mAddress, mPhysicalAddress); + HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(playbackDevice.mAddress, + ADDR_TV); + assertThat(mNativeWrapper.getResultMessages()).contains(activeSource); + assertThat(mNativeWrapper.getResultMessages()).contains(textViewOn); } @Test @@ -602,8 +616,8 @@ public class OneTouchPlayActionTest { } private void setHdmiControlEnabled(boolean enabled) { - int value = enabled ? 1 : 0; - Settings.Global.putInt(mContextSpy.getContentResolver(), - Settings.Global.HDMI_CONTROL_ENABLED, value); + int value = enabled ? HdmiControlManager.HDMI_CEC_CONTROL_ENABLED : + HdmiControlManager.HDMI_CEC_CONTROL_DISABLED; + mHdmiCecConfig.setIntValue(HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED, value); } } diff --git a/services/tests/servicestests/src/com/android/server/locksettings/RebootEscrowManagerTests.java b/services/tests/servicestests/src/com/android/server/locksettings/RebootEscrowManagerTests.java index aecc7942b266..b01c1c8ead28 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/RebootEscrowManagerTests.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/RebootEscrowManagerTests.java @@ -165,7 +165,17 @@ public class RebootEscrowManagerTests { mRebootEscrow = null; mServerBased = true; RebootEscrowProviderServerBasedImpl.Injector injector = - new RebootEscrowProviderServerBasedImpl.Injector(serviceConnection); + new RebootEscrowProviderServerBasedImpl.Injector(serviceConnection) { + @Override + long getServiceTimeoutInSeconds() { + return 30; + } + + @Override + long getServerBlobLifetimeInMillis() { + return 600_000; + } + }; mDefaultRebootEscrowProvider = new RebootEscrowProviderServerBasedImpl( storage, injector); mUserManager = userManager; @@ -189,6 +199,11 @@ public class RebootEscrowManagerTests { } @Override + public boolean isNetworkConnected() { + return false; + } + + @Override public RebootEscrowProviderInterface createRebootEscrowProviderIfNeeded() { mRebootEscrowProviderInUse = mDefaultRebootEscrowProvider; return mRebootEscrowProviderInUse; @@ -602,7 +617,7 @@ public class RebootEscrowManagerTests { // Sleep 5s for the retry to complete Thread.sleep(5 * 1000); assertFalse(metricsSuccessCaptor.getValue()); - assertEquals(Integer.valueOf(RebootEscrowManager.ERROR_RETRY_COUNT_EXHAUSTED), + assertEquals(Integer.valueOf(RebootEscrowManager.ERROR_NO_NETWORK), metricsErrorCodeCaptor.getValue()); } diff --git a/services/tests/servicestests/src/com/android/server/power/WakeLockLogTest.java b/services/tests/servicestests/src/com/android/server/power/WakeLockLogTest.java index a03ba9c5e87e..09612e33b98a 100644 --- a/services/tests/servicestests/src/com/android/server/power/WakeLockLogTest.java +++ b/services/tests/servicestests/src/com/android/server/power/WakeLockLogTest.java @@ -20,12 +20,8 @@ import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; -import android.os.Looper; import android.os.PowerManager; -import android.os.test.TestLooper; -import org.junit.After; -import org.junit.Before; import org.junit.Test; import java.io.PrintWriter; @@ -38,17 +34,6 @@ import java.util.TimeZone; */ public class WakeLockLogTest { - private TestLooper mTestLooper; - - @Before - public void setUp() throws Exception { - mTestLooper = new TestLooper(); - } - - @After - public void tearDown() throws Exception { - } - @Test public void testAddTwoItems() { final int tagDatabaseSize = 128; @@ -70,7 +55,7 @@ public class WakeLockLogTest { + " -\n" + " Events: 2, Time-Resets: 0\n" + " Buffer, Bytes used: 6\n", - dispatchAndDump(log, false)); + dumpLog(log, false)); } @Test @@ -92,7 +77,7 @@ public class WakeLockLogTest { + " -\n" + " Events: 2, Time-Resets: 1\n" + " Buffer, Bytes used: 15\n", - dispatchAndDump(log, false)); + dumpLog(log, false)); } @Test @@ -114,7 +99,7 @@ public class WakeLockLogTest { + " -\n" + " Events: 2, Time-Resets: 0\n" + " Buffer, Bytes used: 6\n", - dispatchAndDump(log, false)); + dumpLog(log, false)); } @Test @@ -142,7 +127,7 @@ public class WakeLockLogTest { + " -\n" + " Events: 3, Time-Resets: 0\n" + " Buffer, Bytes used: 9\n", - dispatchAndDump(log, false)); + dumpLog(log, false)); } @Test @@ -160,7 +145,7 @@ public class WakeLockLogTest { + " -\n" + " Events: 0, Time-Resets: 0\n" + " Buffer, Bytes used: 0\n", - dispatchAndDump(log, false)); + dumpLog(log, false)); } @Test @@ -179,7 +164,7 @@ public class WakeLockLogTest { + " -\n" + " Events: 1, Time-Resets: 0\n" + " Buffer, Bytes used: 3\n", - dispatchAndDump(log, false)); + dumpLog(log, false)); } @Test @@ -201,7 +186,7 @@ public class WakeLockLogTest { + " Events: 2, Time-Resets: 0\n" + " Buffer, Bytes used: 5\n" + " Tag Database: size(5), entries: 1, Bytes used: 80\n", - dispatchAndDump(log, true)); + dumpLog(log, true)); } @Test @@ -223,11 +208,10 @@ public class WakeLockLogTest { + " -\n" + " Events: 1, Time-Resets: 0\n" + " Buffer, Bytes used: 3\n", - dispatchAndDump(log, false)); + dumpLog(log, false)); } - private String dispatchAndDump(WakeLockLog log, boolean includeTagDb) { - mTestLooper.dispatchAll(); + private String dumpLog(WakeLockLog log, boolean includeTagDb) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); log.dump(pw, includeTagDb); @@ -244,11 +228,6 @@ public class WakeLockLogTest { } @Override - public Looper getLooper() { - return mTestLooper.getLooper(); - } - - @Override public int getTagDatabaseSize() { return mTagDatabaseSize; } diff --git a/services/tests/servicestests/src/com/android/server/utils/WatcherTest.java b/services/tests/servicestests/src/com/android/server/utils/WatcherTest.java index 9679e58c4e7d..5db9492c35c5 100644 --- a/services/tests/servicestests/src/com/android/server/utils/WatcherTest.java +++ b/services/tests/servicestests/src/com/android/server/utils/WatcherTest.java @@ -22,6 +22,7 @@ import static org.junit.Assert.fail; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.Log; import android.util.LongSparseArray; import android.util.SparseArray; import android.util.SparseBooleanArray; @@ -34,9 +35,12 @@ import org.junit.Before; import org.junit.Test; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Random; /** - * Test class for {@link Watcher}, {@link Watchable}, {@link WatchableImpl}, + * Test class for various utility classes that support the Watchable or Snappable + * features. This covers {@link Watcher}, {@link Watchable}, {@link WatchableImpl}, * {@link WatchedArrayMap}, {@link WatchedSparseArray}, and * {@link WatchedSparseBooleanArray}. * @@ -858,6 +862,93 @@ public class WatcherTest { } } + private static class IndexGenerator { + private final int mSeed; + private final Random mRandom; + public IndexGenerator(int seed) { + mSeed = seed; + mRandom = new Random(mSeed); + } + public int index() { + return mRandom.nextInt(50000); + } + public void reset() { + mRandom.setSeed(mSeed); + } + } + + // Return a value based on the row and column. The algorithm tries to avoid simple + // patterns like checkerboard. + private final boolean cellValue(int row, int col) { + return (((row * 4 + col) % 3)& 1) == 1; + } + + // This is an inefficient way to know if a value appears in an array. + private final boolean contains(int[] s, int length, int k) { + for (int i = 0; i < length; i++) { + if (s[i] == k) { + return true; + } + } + return false; + } + + private void matrixTest(WatchedSparseBooleanMatrix matrix, int size, IndexGenerator indexer) { + indexer.reset(); + int[] indexes = new int[size]; + for (int i = 0; i < size; i++) { + int key = indexer.index(); + // Ensure the list of indices are unique. + while (contains(indexes, i, key)) { + key = indexer.index(); + } + indexes[i] = key; + } + // Set values in the matrix. + for (int i = 0; i < size; i++) { + int row = indexes[i]; + for (int j = 0; j < size; j++) { + int col = indexes[j]; + boolean want = cellValue(i, j); + matrix.put(row, col, want); + } + } + + assertEquals(matrix.size(), size); + + // Read back and verify + for (int i = 0; i < matrix.size(); i++) { + int row = indexes[i]; + for (int j = 0; j < matrix.size(); j++) { + int col = indexes[j]; + boolean want = cellValue(i, j); + boolean actual = matrix.get(row, col); + String msg = String.format("matrix(%d:%d, %d:%d) == %s, expected %s", + i, row, j, col, actual, want); + assertEquals(msg, actual, want); + } + } + + // Test the keyAt/indexOfKey methods + for (int i = 0; i < matrix.size(); i++) { + int key = indexes[i]; + assertEquals(matrix.keyAt(matrix.indexOfKey(key)), key); + } + } + + @Test + public void testWatchedSparseBooleanMatrix() { + final String name = "WatchedSparseBooleanMatrix"; + + // The first part of this method tests the core matrix functionality. The second + // part tests the watchable behavior. The third part tests the snappable + // behavior. + IndexGenerator indexer = new IndexGenerator(3); + matrixTest(new WatchedSparseBooleanMatrix(), 10, indexer); + matrixTest(new WatchedSparseBooleanMatrix(1000), 500, indexer); + matrixTest(new WatchedSparseBooleanMatrix(1000), 2000, indexer); + } + @Test public void testNestedArrays() { final String name = "NestedArrays"; diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java index aec06431c5fb..0bb09a9de07f 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java @@ -287,6 +287,8 @@ final class HotwordDetectionConnection { Slog.d(TAG, "stopListening"); } + mRemoteHotwordDetectionService.run(service -> service.stopDetection()); + synchronized (mLock) { if (mCurrentAudioSink != null) { Slog.i(TAG, "Closing audio stream to hotword detector: stopping requested"); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index 9be1ac42d885..2206b0a61b9e 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -22,6 +22,7 @@ import static android.app.ActivityManager.START_VOICE_HIDDEN_SESSION; import static android.app.ActivityManager.START_VOICE_NOT_ACTIVE_SESSION; import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT; +import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; @@ -36,7 +37,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; -import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.ServiceInfo; import android.hardware.soundtrigger.IRecognitionStatusCallback; @@ -414,11 +414,31 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne Slog.w(TAG, "Hotword detection service name not found"); throw new IllegalStateException("Hotword detection service name not found"); } - if (!isIsolatedProcessLocked(mHotwordDetectionComponentName)) { + ServiceInfo hotwordDetectionServiceInfo = getServiceInfoLocked( + mHotwordDetectionComponentName, mUser); + if (hotwordDetectionServiceInfo == null) { + Slog.w(TAG, "Hotword detection service info not found"); + throw new IllegalStateException("Hotword detection service info not found"); + } + if (!isIsolatedProcessLocked(hotwordDetectionServiceInfo)) { Slog.w(TAG, "Hotword detection service not in isolated process"); throw new IllegalStateException("Hotword detection service not in isolated process"); } - // TODO : Need to check related permissions for hotword detection service + if (!Manifest.permission.BIND_HOTWORD_DETECTION_SERVICE.equals( + hotwordDetectionServiceInfo.permission)) { + Slog.w(TAG, "Hotword detection service does not require permission " + + Manifest.permission.BIND_HOTWORD_DETECTION_SERVICE); + throw new SecurityException("Hotword detection service does not require permission " + + Manifest.permission.BIND_HOTWORD_DETECTION_SERVICE); + } + if (mContext.getPackageManager().checkPermission( + Manifest.permission.BIND_HOTWORD_DETECTION_SERVICE, + mInfo.getServiceInfo().packageName) == PackageManager.PERMISSION_GRANTED) { + Slog.w(TAG, "Voice interaction service should not hold permission " + + Manifest.permission.BIND_HOTWORD_DETECTION_SERVICE); + throw new SecurityException("Voice interaction service should not hold permission " + + Manifest.permission.BIND_HOTWORD_DETECTION_SERVICE); + } if (sharedMemory != null && !sharedMemory.setProtect(OsConstants.PROT_READ)) { Slog.w(TAG, "Can't set sharedMemory to be read-only"); @@ -522,23 +542,24 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne mHotwordDetectionConnection); } - boolean isIsolatedProcessLocked(ComponentName componentName) { - IPackageManager pm = AppGlobals.getPackageManager(); + private static ServiceInfo getServiceInfoLocked(@NonNull ComponentName componentName, + int userHandle) { try { - ServiceInfo serviceInfo = pm.getServiceInfo(componentName, + return AppGlobals.getPackageManager().getServiceInfo(componentName, PackageManager.GET_META_DATA | PackageManager.MATCH_DIRECT_BOOT_AWARE - | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, mUser); - if (serviceInfo != null) { - return (serviceInfo.flags & ServiceInfo.FLAG_ISOLATED_PROCESS) != 0 - && (serviceInfo.flags & ServiceInfo.FLAG_EXTERNAL_SERVICE) == 0; - } + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userHandle); } catch (RemoteException e) { if (DEBUG) { - Slog.w(TAG, "isIsolatedProcess RemoteException : " + e); + Slog.w(TAG, "getServiceInfoLocked RemoteException : " + e); } } - return false; + return null; + } + + boolean isIsolatedProcessLocked(@NonNull ServiceInfo serviceInfo) { + return (serviceInfo.flags & ServiceInfo.FLAG_ISOLATED_PROCESS) != 0 + && (serviceInfo.flags & ServiceInfo.FLAG_EXTERNAL_SERVICE) == 0; } public void dumpLocked(FileDescriptor fd, PrintWriter pw, String[] args) { diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index c527e66bae29..6b7fc2fb4b7d 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -3682,6 +3682,13 @@ public class CarrierConfigManager { "emergency_number_prefix_string_array"; /** + * Indicates whether carrier treats "*67" or "*82" as a temporary mode CLIR. + * @hide + */ + public static final String KEY_CARRIER_SUPPORTS_CALLER_ID_VERTICAL_SERVICE_CODES_BOOL = + "carrier_supports_caller_id_vertical_service_codes_bool"; + + /** * Smart forwarding config. Smart forwarding is a feature to configure call forwarding to a * different SIM in the device when one SIM is not reachable. The config here specifies a smart * forwarding component that will launch UI for changing the configuration. An empty string @@ -5496,6 +5503,7 @@ public class CarrierConfigManager { 1 /* Roaming Indicator Off */ }); sDefaults.putStringArray(KEY_EMERGENCY_NUMBER_PREFIX_STRING_ARRAY, new String[0]); + sDefaults.putBoolean(KEY_CARRIER_SUPPORTS_CALLER_ID_VERTICAL_SERVICE_CODES_BOOL, false); sDefaults.putBoolean(KEY_USE_USIM_BOOL, false); sDefaults.putBoolean(KEY_SHOW_WFC_LOCATION_PRIVACY_POLICY_BOOL, false); sDefaults.putBoolean(KEY_AUTO_CANCEL_CS_REJECT_NOTIFICATION, true); diff --git a/telephony/java/android/telephony/ims/DelegateStateCallback.java b/telephony/java/android/telephony/ims/DelegateStateCallback.java index 2b4fb7d5cbf3..734b52018857 100644 --- a/telephony/java/android/telephony/ims/DelegateStateCallback.java +++ b/telephony/java/android/telephony/ims/DelegateStateCallback.java @@ -79,7 +79,7 @@ public interface DelegateStateCallback { * messages routing should be delayed until the {@link SipDelegate} sends the IMS configuration * change event to reduce conditions where the remote application is using a stale IMS * configuration. - * @deprecated This is being removed from API surface, Use + * @removed This is being removed from API surface, Use * {@link #onConfigurationChanged(SipDelegateConfiguration)} instead. */ @Deprecated diff --git a/telephony/java/android/telephony/ims/SipDelegateConnection.java b/telephony/java/android/telephony/ims/SipDelegateConnection.java index 4dbb08d14ccd..498b408fe139 100644 --- a/telephony/java/android/telephony/ims/SipDelegateConnection.java +++ b/telephony/java/android/telephony/ims/SipDelegateConnection.java @@ -62,26 +62,6 @@ public interface SipDelegateConnection { void notifyMessageReceived(@NonNull String viaTransactionId); /** - * The SIP Dialog associated with the provided Call-ID is being closed and routing resources - * associated with the SIP dialog are free to be released. - * <p> - * Calling this method is also mandatory for situations where the framework IMS stack is waiting - * for pending SIP dialogs to be closed before it can perform a handover or apply a provisioning - * change. See {@link DelegateRegistrationState} for more information about - * the scenarios where this can occur. - * <p> - * This method will need to be called for each SIP dialog managed by this application when it is - * closed. - * @param callId The call-ID header value associated with the ongoing SIP Dialog that is - * closing. - * @deprecated closeDialog does not capture INVITE forking. Use {@link #cleanupSession} instead. - */ - @Deprecated - default void closeDialog(@NonNull String callId) { - cleanupSession(callId); - } - - /** * The SIP session associated with the provided Call-ID is being closed and routing resources * associated with the session are free to be released. Each SIP session may contain multiple * dialogs due to SIP INVITE forking, so this method must be called after all SIP dialogs @@ -97,7 +77,7 @@ public interface SipDelegateConnection { * @param callId The call-ID header value associated with the ongoing SIP Dialog that is * closing. */ - default void cleanupSession(@NonNull String callId) { } + void cleanupSession(@NonNull String callId); /** * Notify the SIP delegate that the SIP message has been received from diff --git a/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.java b/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.java index 08513c23291a..fe14dd18d1ab 100644 --- a/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.java +++ b/telephony/java/android/telephony/ims/SipDelegateImsConfiguration.java @@ -34,7 +34,7 @@ import java.net.InetSocketAddress; /** * @hide - * @deprecated Use {@link SipDelegateConfiguration} instead. + * @removed Use {@link SipDelegateConfiguration} instead. */ @Deprecated @SystemApi diff --git a/telephony/java/android/telephony/ims/stub/DelegateConnectionStateCallback.java b/telephony/java/android/telephony/ims/stub/DelegateConnectionStateCallback.java index c078637e3791..42c53f2a0caf 100644 --- a/telephony/java/android/telephony/ims/stub/DelegateConnectionStateCallback.java +++ b/telephony/java/android/telephony/ims/stub/DelegateConnectionStateCallback.java @@ -136,7 +136,7 @@ public interface DelegateConnectionStateCallback { * not compleed yet. * * @param registeredSipConfig The configuration of the IMS stack registered on the IMS network. - * @deprecated Will not be in final API, use + * @removed Will not be in final API, use * {@link #onConfigurationChanged(SipDelegateConfiguration)} instead}. */ @Deprecated @@ -161,7 +161,7 @@ public interface DelegateConnectionStateCallback { * * @param registeredSipConfig The configuration of the IMS stack registered on the IMS network. */ - default void onConfigurationChanged(@NonNull SipDelegateConfiguration registeredSipConfig) {} + void onConfigurationChanged(@NonNull SipDelegateConfiguration registeredSipConfig); /** * The previously created {@link SipDelegateConnection} instance delivered via diff --git a/telephony/java/android/telephony/ims/stub/SipDelegate.java b/telephony/java/android/telephony/ims/stub/SipDelegate.java index 997d00bc91c7..7dbefb4474a6 100644 --- a/telephony/java/android/telephony/ims/stub/SipDelegate.java +++ b/telephony/java/android/telephony/ims/stub/SipDelegate.java @@ -64,25 +64,6 @@ public interface SipDelegate { void sendMessage(@NonNull SipMessage message, long configVersion); /** - * The framework is requesting that routing resources associated with the SIP dialog using the - * provided Call-ID to be cleaned up. - * <p> - * Typically, a SIP Dialog close event will be signalled by that dialog receiving a BYE or - * 200 OK message, however, the IMS application will still call - * {@link SipDelegateConnection#closeDialog(String)} to signal to the framework that resources - * can be released. In some cases, the framework will request that the ImsService close the - * dialog due to the open dialog holding up an event such as applying a provisioning change or - * handing over to another transport type. See {@link DelegateRegistrationState}. - * - * @param callId The call-ID header value associated with the ongoing SIP Dialog that the - * framework is requesting be closed. - * @deprecated This method does not take into account INVITE forking. Use - * {@link #cleanupSession(String)} instead. - */ - @Deprecated - default void closeDialog(@NonNull String callId) { } - - /** * The remote IMS application has closed a SIP session and the routing resources associated * with the SIP session using the provided Call-ID may now be cleaned up. * <p> @@ -97,9 +78,7 @@ public interface SipDelegate { * @param callId The call-ID header value associated with the ongoing SIP Session that the * framework is requesting be cleaned up. */ - default void cleanupSession(@NonNull String callId) { - closeDialog(callId); - } + void cleanupSession(@NonNull String callId); /** * The remote application has received the SIP message and is processing it. diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 91ecbf081919..a096c1f3b8b2 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -2440,6 +2440,12 @@ interface ITelephony { boolean removeUceRequestDisallowedStatus(int subId); /** + * Set the timeout for contact capabilities request. + * Note: This is designed for a SHELL command only. + */ + boolean setCapabilitiesRequestTimeout(int subId, long timeoutAfterMs); + + /** * Set a SignalStrengthUpdateRequest to receive notification when Signal Strength breach the * specified thresholds. */ diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java index 39f7386cbb76..9c93f8111427 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java +++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java @@ -200,6 +200,9 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection public void testMigration() throws Exception { triggerChildOpened(); + mGatewayConnection + .getUnderlyingNetworkTrackerCallback() + .onSelectedUnderlyingNetworkChanged(TEST_UNDERLYING_NETWORK_RECORD_2); getChildSessionCallback() .onIpSecTransformsMigrated(makeDummyIpSecTransform(), makeDummyIpSecTransform()); mTestLooper.dispatchAll(); @@ -207,7 +210,7 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection verify(mIpSecSvc, times(2)) .setNetworkForTunnelInterface( eq(TEST_IPSEC_TUNNEL_RESOURCE_ID), - eq(TEST_UNDERLYING_NETWORK_RECORD_1.network), + eq(TEST_UNDERLYING_NETWORK_RECORD_2.network), any()); for (int direction : new int[] {DIRECTION_IN, DIRECTION_OUT}) { @@ -226,8 +229,10 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection MtuUtils.getMtu( saProposals, mConfig.getMaxMtu(), - TEST_UNDERLYING_NETWORK_RECORD_1.linkProperties.getMtu()); - verify(mNetworkAgent).sendLinkProperties(argThat(lp -> expectedMtu == lp.getMtu())); + TEST_UNDERLYING_NETWORK_RECORD_2.linkProperties.getMtu()); + verify(mNetworkAgent).sendLinkProperties( + argThat(lp -> expectedMtu == lp.getMtu() + && TEST_TCP_BUFFER_SIZES_2.equals(lp.getTcpBufferSizes()))); } private void triggerChildOpened() { @@ -297,6 +302,7 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection final LinkProperties lp = lpCaptor.getValue(); assertEquals(Collections.singletonList(TEST_INTERNAL_ADDR), lp.getLinkAddresses()); assertEquals(Collections.singletonList(TEST_DNS_ADDR), lp.getDnsServers()); + assertEquals(TEST_TCP_BUFFER_SIZES_1, lp.getTcpBufferSizes()); final NetworkCapabilities nc = ncCaptor.getValue(); assertTrue(nc.hasTransport(TRANSPORT_CELLULAR)); diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java index 9705f0fc6bbc..a4f95e03e9bd 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java +++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTest.java @@ -74,6 +74,9 @@ public class VcnGatewayConnectionTest extends VcnGatewayConnectionTestBase { private static final SubscriptionInfo TEST_SUBINFO_2 = mock(SubscriptionInfo.class); private static final Map<Integer, ParcelUuid> TEST_SUBID_TO_GROUP_MAP; + private static final int TEST_UPSTREAM_BANDWIDTH = 1234; + private static final int TEST_DOWNSTREAM_BANDWIDTH = 2345; + static { final Map<Integer, ParcelUuid> subIdToGroupMap = new HashMap<>(); subIdToGroupMap.put(TEST_SUBSCRIPTION_ID_1, TEST_PARCEL_UUID); @@ -106,6 +109,8 @@ public class VcnGatewayConnectionTest extends VcnGatewayConnectionTestBase { capBuilder.setNetworkSpecifier( new TelephonyNetworkSpecifier(TEST_SUBSCRIPTION_ID_1)); } + capBuilder.setLinkUpstreamBandwidthKbps(TEST_UPSTREAM_BANDWIDTH); + capBuilder.setLinkDownstreamBandwidthKbps(TEST_DOWNSTREAM_BANDWIDTH); capBuilder.setAdministratorUids(new int[] {TEST_UID}); UnderlyingNetworkRecord record = new UnderlyingNetworkRecord( mock(Network.class, CALLS_REAL_METHODS), @@ -130,6 +135,8 @@ public class VcnGatewayConnectionTest extends VcnGatewayConnectionTestBase { assertArrayEquals(new int[] {TEST_UID}, vcnCaps.getAdministratorUids()); assertTrue(vcnCaps.getTransportInfo() instanceof VcnTransportInfo); + assertEquals(TEST_UPSTREAM_BANDWIDTH, vcnCaps.getLinkUpstreamBandwidthKbps()); + assertEquals(TEST_DOWNSTREAM_BANDWIDTH, vcnCaps.getLinkDownstreamBandwidthKbps()); final VcnTransportInfo info = (VcnTransportInfo) vcnCaps.getTransportInfo(); if (transportType == TRANSPORT_WIFI) { diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java index c747bc096a6f..0a4fcbcb2842 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java +++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java @@ -99,6 +99,7 @@ public class VcnGatewayConnectionTestBase { protected static final long ELAPSED_REAL_TIME = 123456789L; protected static final String TEST_IPSEC_TUNNEL_IFACE = "IPSEC_IFACE"; + protected static final String TEST_TCP_BUFFER_SIZES_1 = "1,2,3,4"; protected static final UnderlyingNetworkRecord TEST_UNDERLYING_NETWORK_RECORD_1 = new UnderlyingNetworkRecord( mock(Network.class, CALLS_REAL_METHODS), @@ -108,8 +109,10 @@ public class VcnGatewayConnectionTestBase { static { TEST_UNDERLYING_NETWORK_RECORD_1.linkProperties.setMtu(1500); + TEST_UNDERLYING_NETWORK_RECORD_1.linkProperties.setTcpBufferSizes(TEST_TCP_BUFFER_SIZES_1); } + protected static final String TEST_TCP_BUFFER_SIZES_2 = "2,3,4,5"; protected static final UnderlyingNetworkRecord TEST_UNDERLYING_NETWORK_RECORD_2 = new UnderlyingNetworkRecord( mock(Network.class, CALLS_REAL_METHODS), @@ -119,6 +122,7 @@ public class VcnGatewayConnectionTestBase { static { TEST_UNDERLYING_NETWORK_RECORD_2.linkProperties.setMtu(1460); + TEST_UNDERLYING_NETWORK_RECORD_2.linkProperties.setTcpBufferSizes(TEST_TCP_BUFFER_SIZES_2); } protected static final TelephonySubscriptionSnapshot TEST_SUBSCRIPTION_SNAPSHOT = diff --git a/tools/aosp/aosp_sha.sh b/tools/aosp/aosp_sha.sh index 99aaa3c4d6e5..81d35efaf29f 100755 --- a/tools/aosp/aosp_sha.sh +++ b/tools/aosp/aosp_sha.sh @@ -4,6 +4,9 @@ LOCAL_DIR="$( dirname "${BASH_SOURCE}" )" if git branch -vv | grep -q -P "^\*[^\[]+\[aosp/"; then # Change appears to be in AOSP exit 0 +elif git log -n 1 --format='%B' $1 | grep -q -E "^Ignore-AOSP-First: .+" ; then + # Change is explicitly marked as ok to skip AOSP + exit 0 else # Change appears to be non-AOSP; search for files count=0 diff --git a/tools/apilint/deprecated_at_birth.py b/tools/apilint/deprecated_at_birth.py new file mode 100644 index 000000000000..297d9c3bcca0 --- /dev/null +++ b/tools/apilint/deprecated_at_birth.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python + +# Copyright (C) 2021 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. + +""" +Usage: deprecated_at_birth.py path/to/next/ path/to/previous/ +Usage: deprecated_at_birth.py prebuilts/sdk/31/public/api/ prebuilts/sdk/30/public/api/ +""" + +import re, sys, os, collections, traceback, argparse + + +BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8) + +def format(fg=None, bg=None, bright=False, bold=False, dim=False, reset=False): + # manually derived from http://en.wikipedia.org/wiki/ANSI_escape_code#Codes + codes = [] + if reset: codes.append("0") + else: + if not fg is None: codes.append("3%d" % (fg)) + if not bg is None: + if not bright: codes.append("4%d" % (bg)) + else: codes.append("10%d" % (bg)) + if bold: codes.append("1") + elif dim: codes.append("2") + else: codes.append("22") + return "\033[%sm" % (";".join(codes)) + + +def ident(raw): + """Strips superficial signature changes, giving us a strong key that + can be used to identify members across API levels.""" + raw = raw.replace(" deprecated ", " ") + raw = raw.replace(" synchronized ", " ") + raw = raw.replace(" final ", " ") + raw = re.sub("<.+?>", "", raw) + raw = re.sub("@[A-Za-z]+ ", "", raw) + raw = re.sub("@[A-Za-z]+\(.+?\) ", "", raw) + if " throws " in raw: + raw = raw[:raw.index(" throws ")] + return raw + + +class Field(): + def __init__(self, clazz, line, raw, blame): + self.clazz = clazz + self.line = line + self.raw = raw.strip(" {;") + self.blame = blame + + raw = raw.split() + self.split = list(raw) + + raw = [ r for r in raw if not r.startswith("@") ] + for r in ["method", "field", "public", "protected", "static", "final", "abstract", "default", "volatile", "transient"]: + while r in raw: raw.remove(r) + + self.typ = raw[0] + self.name = raw[1].strip(";") + if len(raw) >= 4 and raw[2] == "=": + self.value = raw[3].strip(';"') + else: + self.value = None + self.ident = ident(self.raw) + + def __hash__(self): + return hash(self.raw) + + def __repr__(self): + return self.raw + + +class Method(): + def __init__(self, clazz, line, raw, blame): + self.clazz = clazz + self.line = line + self.raw = raw.strip(" {;") + self.blame = blame + + # drop generics for now + raw = re.sub("<.+?>", "", raw) + + raw = re.split("[\s(),;]+", raw) + for r in ["", ";"]: + while r in raw: raw.remove(r) + self.split = list(raw) + + raw = [ r for r in raw if not r.startswith("@") ] + for r in ["method", "field", "public", "protected", "static", "final", "abstract", "default", "volatile", "transient"]: + while r in raw: raw.remove(r) + + self.typ = raw[0] + self.name = raw[1] + self.args = [] + self.throws = [] + target = self.args + for r in raw[2:]: + if r == "throws": target = self.throws + else: target.append(r) + self.ident = ident(self.raw) + + def __hash__(self): + return hash(self.raw) + + def __repr__(self): + return self.raw + + +class Class(): + def __init__(self, pkg, line, raw, blame): + self.pkg = pkg + self.line = line + self.raw = raw.strip(" {;") + self.blame = blame + self.ctors = [] + self.fields = [] + self.methods = [] + + raw = raw.split() + self.split = list(raw) + if "class" in raw: + self.fullname = raw[raw.index("class")+1] + elif "enum" in raw: + self.fullname = raw[raw.index("enum")+1] + elif "interface" in raw: + self.fullname = raw[raw.index("interface")+1] + elif "@interface" in raw: + self.fullname = raw[raw.index("@interface")+1] + else: + raise ValueError("Funky class type %s" % (self.raw)) + + if "extends" in raw: + self.extends = raw[raw.index("extends")+1] + self.extends_path = self.extends.split(".") + else: + self.extends = None + self.extends_path = [] + + self.fullname = self.pkg.name + "." + self.fullname + self.fullname_path = self.fullname.split(".") + + self.name = self.fullname[self.fullname.rindex(".")+1:] + + def __hash__(self): + return hash((self.raw, tuple(self.ctors), tuple(self.fields), tuple(self.methods))) + + def __repr__(self): + return self.raw + + +class Package(): + def __init__(self, line, raw, blame): + self.line = line + self.raw = raw.strip(" {;") + self.blame = blame + + raw = raw.split() + self.name = raw[raw.index("package")+1] + self.name_path = self.name.split(".") + + def __repr__(self): + return self.raw + + +def _parse_stream(f, api={}): + line = 0 + pkg = None + clazz = None + blame = None + + re_blame = re.compile("^([a-z0-9]{7,}) \(<([^>]+)>.+?\) (.+?)$") + for raw in f: + line += 1 + raw = raw.rstrip() + match = re_blame.match(raw) + if match is not None: + blame = match.groups()[0:2] + raw = match.groups()[2] + else: + blame = None + + if raw.startswith("package"): + pkg = Package(line, raw, blame) + elif raw.startswith(" ") and raw.endswith("{"): + clazz = Class(pkg, line, raw, blame) + api[clazz.fullname] = clazz + elif raw.startswith(" ctor"): + clazz.ctors.append(Method(clazz, line, raw, blame)) + elif raw.startswith(" method"): + clazz.methods.append(Method(clazz, line, raw, blame)) + elif raw.startswith(" field"): + clazz.fields.append(Field(clazz, line, raw, blame)) + + return api + + +def _parse_stream_path(path): + api = {} + print "Parsing", path + for f in os.listdir(path): + f = os.path.join(path, f) + if not os.path.isfile(f): continue + if not f.endswith(".txt"): continue + if f.endswith("removed.txt"): continue + print "\t", f + with open(f) as s: + api = _parse_stream(s, api) + print "Parsed", len(api), "APIs" + print + return api + + +class Failure(): + def __init__(self, sig, clazz, detail, error, rule, msg): + self.sig = sig + self.error = error + self.rule = rule + self.msg = msg + + if error: + self.head = "Error %s" % (rule) if rule else "Error" + dump = "%s%s:%s %s" % (format(fg=RED, bg=BLACK, bold=True), self.head, format(reset=True), msg) + else: + self.head = "Warning %s" % (rule) if rule else "Warning" + dump = "%s%s:%s %s" % (format(fg=YELLOW, bg=BLACK, bold=True), self.head, format(reset=True), msg) + + self.line = clazz.line + blame = clazz.blame + if detail is not None: + dump += "\n in " + repr(detail) + self.line = detail.line + blame = detail.blame + dump += "\n in " + repr(clazz) + dump += "\n in " + repr(clazz.pkg) + dump += "\n at line " + repr(self.line) + if blame is not None: + dump += "\n last modified by %s in %s" % (blame[1], blame[0]) + + self.dump = dump + + def __repr__(self): + return self.dump + + +failures = {} + +def _fail(clazz, detail, error, rule, msg): + """Records an API failure to be processed later.""" + global failures + + sig = "%s-%s-%s" % (clazz.fullname, repr(detail), msg) + sig = sig.replace(" deprecated ", " ") + + failures[sig] = Failure(sig, clazz, detail, error, rule, msg) + + +def warn(clazz, detail, rule, msg): + _fail(clazz, detail, False, rule, msg) + +def error(clazz, detail, rule, msg): + _fail(clazz, detail, True, rule, msg) + + +if __name__ == "__main__": + next_path = sys.argv[1] + prev_path = sys.argv[2] + + next_api = _parse_stream_path(next_path) + prev_api = _parse_stream_path(prev_path) + + # Remove all existing things so we're left with new + for prev_clazz in prev_api.values(): + if prev_clazz.fullname not in next_api: continue + cur_clazz = next_api[prev_clazz.fullname] + + sigs = { i.ident: i for i in prev_clazz.ctors } + cur_clazz.ctors = [ i for i in cur_clazz.ctors if i.ident not in sigs ] + sigs = { i.ident: i for i in prev_clazz.methods } + cur_clazz.methods = [ i for i in cur_clazz.methods if i.ident not in sigs ] + sigs = { i.ident: i for i in prev_clazz.fields } + cur_clazz.fields = [ i for i in cur_clazz.fields if i.ident not in sigs ] + + # Forget about class entirely when nothing new + if len(cur_clazz.ctors) == 0 and len(cur_clazz.methods) == 0 and len(cur_clazz.fields) == 0: + del next_api[prev_clazz.fullname] + + for clazz in next_api.values(): + if "@Deprecated " in clazz.raw and not clazz.fullname in prev_api: + error(clazz, None, None, "Found API deprecation at birth") + + if "@Deprecated " in clazz.raw: continue + + for i in clazz.ctors + clazz.methods + clazz.fields: + if "@Deprecated " in i.raw: + error(clazz, i, None, "Found API deprecation at birth " + i.ident) + + print "%s Deprecated at birth %s\n" % ((format(fg=WHITE, bg=BLUE, bold=True), + format(reset=True))) + for f in sorted(failures): + print failures[f] + print diff --git a/wifi/OWNERS b/wifi/OWNERS index 2caf9ed7a38a..777df571fd62 100644 --- a/wifi/OWNERS +++ b/wifi/OWNERS @@ -1,5 +1,3 @@ set noparent -dysu@google.com -etancohen@google.com -satk@google.com +include platform/packages/modules/Wifi:/OWNERS |