diff options
442 files changed, 7390 insertions, 2089 deletions
diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/AppSearchBatchResult.java b/apex/appsearch/framework/java/external/android/app/appsearch/AppSearchBatchResult.java index d493a1c28a3a..272e12db0124 100644 --- a/apex/appsearch/framework/java/external/android/app/appsearch/AppSearchBatchResult.java +++ b/apex/appsearch/framework/java/external/android/app/appsearch/AppSearchBatchResult.java @@ -96,6 +96,17 @@ public final class AppSearchBatchResult<KeyType, ValueType> { return Collections.unmodifiableMap(mAll); } + /** + * Asserts that this {@link AppSearchBatchResult} has no failures. + * + * @hide + */ + public void checkSuccess() { + if (!isSuccess()) { + throw new IllegalStateException("AppSearchBatchResult has failures: " + this); + } + } + @Override @NonNull public String toString() { diff --git a/apex/appsearch/framework/java/external/android/app/appsearch/util/SchemaMigrationUtil.java b/apex/appsearch/framework/java/external/android/app/appsearch/util/SchemaMigrationUtil.java index 10e014bf9c9a..d6d53155b131 100644 --- a/apex/appsearch/framework/java/external/android/app/appsearch/util/SchemaMigrationUtil.java +++ b/apex/appsearch/framework/java/external/android/app/appsearch/util/SchemaMigrationUtil.java @@ -71,7 +71,7 @@ public final class SchemaMigrationUtil { /** * Checks the setSchema() call won't delete any types or has incompatible types after all {@link - * Migrator} has been triggered.. + * Migrator} has been triggered. */ public static void checkDeletedAndIncompatibleAfterMigration( @NonNull SetSchemaResponse setSchemaResponse, @NonNull Set<String> activeMigrators) diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java index c33d5ecc5d16..d4e32396187d 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java @@ -363,6 +363,7 @@ public class AppSearchManagerService extends SystemService { schemasVisibleToPackages.put(entry.getKey(), packageIdentifiers); } instance = mAppSearchUserInstanceManager.getUserInstance(targetUser); + // TODO(b/173532925): Implement logging for statsBuilder SetSchemaResponse setSchemaResponse = instance.getAppSearchImpl().setSchema( packageName, databaseName, @@ -371,7 +372,8 @@ public class AppSearchManagerService extends SystemService { schemasNotDisplayedBySystem, schemasVisibleToPackages, forceOverride, - schemaVersion); + schemaVersion, + /*setSchemaStatsBuilder=*/ null); ++operationSuccessCount; invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(setSchemaResponse.getBundle())); @@ -816,8 +818,10 @@ public class AppSearchManagerService extends SystemService { AppSearchUserInstance instance = mAppSearchUserInstanceManager.getUserInstance(targetUser); + // TODO(b/173532925): Implement logging for statsBuilder SearchResultPage searchResultPage = - instance.getAppSearchImpl().getNextPage(packageName, nextPageToken); + instance.getAppSearchImpl().getNextPage( + packageName, nextPageToken, /*statsBuilder=*/ null); invokeCallbackOnResult( callback, AppSearchResult.newSuccessfulResult(searchResultPage.getBundle())); @@ -898,8 +902,11 @@ public class AppSearchManagerService extends SystemService { outputStream, searchResultPage.getResults().get(i) .getGenericDocument().getBundle()); } + // TODO(b/173532925): Implement logging for statsBuilder searchResultPage = instance.getAppSearchImpl().getNextPage( - packageName, searchResultPage.getNextPageToken()); + packageName, + searchResultPage.getNextPageToken(), + /*statsBuilder=*/ null); } } invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(null)); diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java index 15916cc23c0f..324163f49fd3 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java @@ -59,6 +59,7 @@ import com.android.server.appsearch.external.localstorage.stats.OptimizeStats; import com.android.server.appsearch.external.localstorage.stats.PutDocumentStats; import com.android.server.appsearch.external.localstorage.stats.RemoveStats; import com.android.server.appsearch.external.localstorage.stats.SearchStats; +import com.android.server.appsearch.external.localstorage.stats.SetSchemaStats; import com.android.server.appsearch.external.localstorage.visibilitystore.VisibilityStore; import com.google.android.icing.IcingSearchEngine; @@ -393,6 +394,7 @@ public final class AppSearchImpl implements Closeable { * @param forceOverride Whether to force-apply the schema even if it is incompatible. Documents * which do not comply with the new schema will be deleted. * @param version The overall version number of the request. + * @param setSchemaStatsBuilder Builder for {@link SetSchemaStats} to hold stats for setSchema * @return The response contains deleted schema types and incompatible schema types of this * call. * @throws AppSearchException On IcingSearchEngine error. If the status code is @@ -408,7 +410,8 @@ public final class AppSearchImpl implements Closeable { @NonNull List<String> schemasNotDisplayedBySystem, @NonNull Map<String, List<PackageIdentifier>> schemasVisibleToPackages, boolean forceOverride, - int version) + int version, + @Nullable SetSchemaStats.Builder setSchemaStatsBuilder) throws AppSearchException { mReadWriteLock.writeLock().lock(); try { @@ -438,6 +441,12 @@ public final class AppSearchImpl implements Closeable { mLogUtil.piiTrace( "setSchema, response", setSchemaResultProto.getStatus(), setSchemaResultProto); + if (setSchemaStatsBuilder != null) { + setSchemaStatsBuilder.setStatusCode( + statusProtoToResultCode(setSchemaResultProto.getStatus())); + AppSearchLoggerHelper.copyNativeStats(setSchemaResultProto, setSchemaStatsBuilder); + } + // Determine whether it succeeded. try { checkSuccess(setSchemaResultProto.getStatus()); @@ -1127,8 +1136,13 @@ public final class AppSearchImpl implements Closeable { * @throws AppSearchException on IcingSearchEngine error or if can't advance on nextPageToken. */ @NonNull - public SearchResultPage getNextPage(@NonNull String packageName, long nextPageToken) + public SearchResultPage getNextPage( + @NonNull String packageName, + long nextPageToken, + @Nullable SearchStats.Builder statsBuilder) throws AppSearchException { + long totalLatencyStartMillis = SystemClock.elapsedRealtime(); + mReadWriteLock.readLock().lock(); try { throwIfClosedLocked(); @@ -1137,6 +1151,13 @@ public final class AppSearchImpl implements Closeable { checkNextPageToken(packageName, nextPageToken); SearchResultProto searchResultProto = mIcingSearchEngineLocked.getNextPage(nextPageToken); + + if (statsBuilder != null) { + statsBuilder.setStatusCode(statusProtoToResultCode(searchResultProto.getStatus())); + AppSearchLoggerHelper.copyNativeStats( + searchResultProto.getQueryStats(), statsBuilder); + } + mLogUtil.piiTrace( "getNextPage, response", searchResultProto.getResultsCount(), @@ -1152,9 +1173,22 @@ public final class AppSearchImpl implements Closeable { mNextPageTokensLocked.get(packageName).remove(nextPageToken); } } - return rewriteSearchResultProto(searchResultProto, mSchemaMapLocked); + long rewriteSearchResultLatencyStartMillis = SystemClock.elapsedRealtime(); + SearchResultPage resultPage = + rewriteSearchResultProto(searchResultProto, mSchemaMapLocked); + if (statsBuilder != null) { + statsBuilder.setRewriteSearchResultLatencyMillis( + (int) + (SystemClock.elapsedRealtime() + - rewriteSearchResultLatencyStartMillis)); + } + return resultPage; } finally { mReadWriteLock.readLock().unlock(); + if (statsBuilder != null) { + statsBuilder.setTotalLatencyMillis( + (int) (SystemClock.elapsedRealtime() - totalLatencyStartMillis)); + } } } @@ -1334,7 +1368,7 @@ public final class AppSearchImpl implements Closeable { statusProtoToResultCode(deleteResultProto.getStatus())); // TODO(b/187206766) also log query stats here once IcingLib returns it AppSearchLoggerHelper.copyNativeStats( - deleteResultProto.getDeleteStats(), removeStatsBuilder); + deleteResultProto.getDeleteByQueryStats(), removeStatsBuilder); } // It seems that the caller wants to get success if the data matching the query is @@ -1343,7 +1377,8 @@ public final class AppSearchImpl implements Closeable { deleteResultProto.getStatus(), StatusProto.Code.OK, StatusProto.Code.NOT_FOUND); // Update derived maps - int numDocumentsDeleted = deleteResultProto.getDeleteStats().getNumDocumentsDeleted(); + int numDocumentsDeleted = + deleteResultProto.getDeleteByQueryStats().getNumDocumentsDeleted(); updateDocumentCountAfterRemovalLocked(packageName, numDocumentsDeleted); } finally { mReadWriteLock.writeLock().unlock(); diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLogger.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLogger.java index 98cedc7e6b54..1f7d44e3b75a 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLogger.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLogger.java @@ -24,6 +24,7 @@ import com.android.server.appsearch.external.localstorage.stats.OptimizeStats; import com.android.server.appsearch.external.localstorage.stats.PutDocumentStats; import com.android.server.appsearch.external.localstorage.stats.RemoveStats; import com.android.server.appsearch.external.localstorage.stats.SearchStats; +import com.android.server.appsearch.external.localstorage.stats.SetSchemaStats; /** * An interface for implementing client-defined logging AppSearch operations stats. @@ -54,5 +55,8 @@ public interface AppSearchLogger { /** Logs {@link OptimizeStats} */ void logStats(@NonNull OptimizeStats stats); + /** Logs {@link SetSchemaStats} */ + void logStats(@NonNull SetSchemaStats stats); + // TODO(b/173532925) Add remaining logStats once we add all the stats. } diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLoggerHelper.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLoggerHelper.java index cd653e569f11..c19ba1408ec9 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLoggerHelper.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchLoggerHelper.java @@ -23,12 +23,15 @@ import com.android.server.appsearch.external.localstorage.stats.OptimizeStats; import com.android.server.appsearch.external.localstorage.stats.PutDocumentStats; import com.android.server.appsearch.external.localstorage.stats.RemoveStats; import com.android.server.appsearch.external.localstorage.stats.SearchStats; +import com.android.server.appsearch.external.localstorage.stats.SetSchemaStats; +import com.google.android.icing.proto.DeleteByQueryStatsProto; import com.google.android.icing.proto.DeleteStatsProto; import com.google.android.icing.proto.InitializeStatsProto; import com.google.android.icing.proto.OptimizeStatsProto; import com.google.android.icing.proto.PutDocumentStatsProto; import com.google.android.icing.proto.QueryStatsProto; +import com.google.android.icing.proto.SetSchemaResultProto; import java.util.Objects; @@ -142,6 +145,26 @@ public final class AppSearchLoggerHelper { } /** + * Copies native DeleteByQuery stats to builder. + * + * @param fromNativeStats Stats copied from. + * @param toStatsBuilder Stats copied to. + */ + static void copyNativeStats( + @NonNull DeleteByQueryStatsProto fromNativeStats, + @NonNull RemoveStats.Builder toStatsBuilder) { + Objects.requireNonNull(fromNativeStats); + Objects.requireNonNull(toStatsBuilder); + + @SuppressWarnings("deprecation") + int deleteType = DeleteStatsProto.DeleteType.Code.DEPRECATED_QUERY.getNumber(); + toStatsBuilder + .setNativeLatencyMillis(fromNativeStats.getLatencyMs()) + .setDeleteType(deleteType) + .setDeletedDocumentCount(fromNativeStats.getNumDocumentsDeleted()); + } + + /** * Copies native {@link OptimizeStatsProto} to builder. * * @param fromNativeStats Stats copied from. @@ -164,4 +187,25 @@ public final class AppSearchLoggerHelper { .setStorageSizeAfterBytes(fromNativeStats.getStorageSizeAfter()) .setTimeSinceLastOptimizeMillis(fromNativeStats.getTimeSinceLastOptimizeMs()); } + + /* + * Copy SetSchema result stats to builder. + * + * @param fromProto Stats copied from. + * @param toStatsBuilder Stats copied to. + */ + static void copyNativeStats( + @NonNull SetSchemaResultProto fromProto, + @NonNull SetSchemaStats.Builder toStatsBuilder) { + Objects.requireNonNull(fromProto); + Objects.requireNonNull(toStatsBuilder); + toStatsBuilder + .setNewTypeCount(fromProto.getNewSchemaTypesCount()) + .setDeletedTypeCount(fromProto.getDeletedSchemaTypesCount()) + .setCompatibleTypeChangeCount(fromProto.getFullyCompatibleChangedSchemaTypesCount()) + .setIndexIncompatibleTypeChangeCount( + fromProto.getIndexIncompatibleChangedSchemaTypesCount()) + .setBackwardsIncompatibleTypeChangeCount( + fromProto.getIncompatibleSchemaTypesCount()); + } } diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/SearchStats.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/SearchStats.java index d7904f3ca49f..75ae2d0accfd 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/SearchStats.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/SearchStats.java @@ -40,6 +40,7 @@ public final class SearchStats { VISIBILITY_SCOPE_LOCAL, // Searches the global documents. Including platform surfaceable and 3p-access. VISIBILITY_SCOPE_GLOBAL, + VISIBILITY_SCOPE_UNKNOWN, // TODO(b/173532925) Add THIRD_PARTY_ACCESS once we can distinguish platform // surfaceable from 3p access(right both of them are categorized as // VISIBILITY_SCOPE_GLOBAL) @@ -51,6 +52,7 @@ public final class SearchStats { public static final int VISIBILITY_SCOPE_LOCAL = 1; // Searches the global documents. Including platform surfaceable and 3p-access. public static final int VISIBILITY_SCOPE_GLOBAL = 2; + public static final int VISIBILITY_SCOPE_UNKNOWN = 3; // TODO(b/173532925): Add a field searchType to indicate where the search is used(normal // query vs in removeByQuery vs during migration) diff --git a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/SetSchemaStats.java b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/SetSchemaStats.java index 9d789a894855..3e5a80f88f5f 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/SetSchemaStats.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/stats/SetSchemaStats.java @@ -47,9 +47,6 @@ public final class SetSchemaStats { private final int mTotalLatencyMillis; - /** Overall time used for the native function call. */ - private final int mNativeLatencyMillis; - /** Number of newly added schema types. */ private final int mNewTypeCount; @@ -72,7 +69,6 @@ public final class SetSchemaStats { mStatusCode = builder.mStatusCode; mSchemaMigrationStats = builder.mSchemaMigrationStats; mTotalLatencyMillis = builder.mTotalLatencyMillis; - mNativeLatencyMillis = builder.mNativeLatencyMillis; mNewTypeCount = builder.mNewTypeCount; mDeletedTypeCount = builder.mDeletedTypeCount; mCompatibleTypeChangeCount = builder.mCompatibleTypeChangeCount; @@ -112,11 +108,6 @@ public final class SetSchemaStats { return mTotalLatencyMillis; } - /** Returns overall time used for the native function call. */ - public int getNativeLatencyMillis() { - return mNativeLatencyMillis; - } - /** Returns number of newly added schema types. */ public int getNewTypeCount() { return mNewTypeCount; @@ -159,7 +150,6 @@ public final class SetSchemaStats { @AppSearchResult.ResultCode int mStatusCode; @Nullable SchemaMigrationStats mSchemaMigrationStats; int mTotalLatencyMillis; - int mNativeLatencyMillis; int mNewTypeCount; int mDeletedTypeCount; int mCompatibleTypeChangeCount; @@ -193,13 +183,6 @@ public final class SetSchemaStats { return this; } - /** Sets native latency in milliseconds. */ - @NonNull - public Builder setNativeLatencyMillis(int nativeLatencyMillis) { - mNativeLatencyMillis = nativeLatencyMillis; - return this; - } - /** Sets number of new types. */ @NonNull public Builder setNewTypeCount(int newTypeCount) { diff --git a/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java b/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java index fdf6a008b10c..4c29ece3dd03 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/stats/PlatformLogger.java @@ -36,6 +36,7 @@ import com.android.server.appsearch.external.localstorage.stats.OptimizeStats; import com.android.server.appsearch.external.localstorage.stats.PutDocumentStats; import com.android.server.appsearch.external.localstorage.stats.RemoveStats; import com.android.server.appsearch.external.localstorage.stats.SearchStats; +import com.android.server.appsearch.external.localstorage.stats.SetSchemaStats; import com.android.server.appsearch.util.PackageUtil; import java.io.UnsupportedEncodingException; @@ -180,6 +181,11 @@ public final class PlatformLogger implements AppSearchLogger { } } + @Override + public void logStats(@NonNull SetSchemaStats stats) { + // TODO(b/173532925): Log stats + } + /** * Removes cached UID for package. * diff --git a/apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStoreImpl.java b/apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStoreImpl.java index ce142d646d1c..c4d10169f9fc 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStoreImpl.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStoreImpl.java @@ -126,7 +126,8 @@ public class VisibilityStoreImpl implements VisibilityStore { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ SCHEMA_VERSION); + /*version=*/ SCHEMA_VERSION, + /*setSchemaStatsBuilder=*/ null); } // Populate visibility settings set diff --git a/apex/appsearch/synced_jetpack_changeid.txt b/apex/appsearch/synced_jetpack_changeid.txt index a81d7d8022b2..4db8355076cf 100644 --- a/apex/appsearch/synced_jetpack_changeid.txt +++ b/apex/appsearch/synced_jetpack_changeid.txt @@ -1 +1 @@ -Ie04f1ecc033faae8085afcb51eb9e40a298998d5 +bd53b062816070b64feb992c2bf58f3afa3d420e diff --git a/apex/appsearch/testing/Android.bp b/apex/appsearch/testing/Android.bp index 5407cb4ccec7..f78d98ae115a 100644 --- a/apex/appsearch/testing/Android.bp +++ b/apex/appsearch/testing/Android.bp @@ -28,6 +28,7 @@ java_library { "framework", "framework-appsearch", "guava", + "service-appsearch", "truth-prebuilt", ], visibility: [ diff --git a/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchTestUtils.java b/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchTestUtils.java index ec9a42eaa276..4d8e8e9e7b1a 100644 --- a/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchTestUtils.java +++ b/apex/appsearch/testing/java/com/android/server/appsearch/testing/external/AppSearchTestUtils.java @@ -19,6 +19,8 @@ package com.android.server.appsearch.testing; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.appsearch.AppSearchBatchResult; import android.app.appsearch.AppSearchSessionShim; import android.app.appsearch.GenericDocument; @@ -26,12 +28,66 @@ import android.app.appsearch.GetByDocumentIdRequest; import android.app.appsearch.SearchResult; import android.app.appsearch.SearchResultsShim; +import com.android.server.appsearch.external.localstorage.AppSearchLogger; +import com.android.server.appsearch.external.localstorage.stats.CallStats; +import com.android.server.appsearch.external.localstorage.stats.InitializeStats; +import com.android.server.appsearch.external.localstorage.stats.OptimizeStats; +import com.android.server.appsearch.external.localstorage.stats.PutDocumentStats; +import com.android.server.appsearch.external.localstorage.stats.RemoveStats; +import com.android.server.appsearch.external.localstorage.stats.SearchStats; +import com.android.server.appsearch.external.localstorage.stats.SetSchemaStats; + import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.Future; public class AppSearchTestUtils { + // Non-thread-safe logger implementation for testing + public static class TestLogger implements AppSearchLogger { + @Nullable public CallStats mCallStats; + @Nullable public PutDocumentStats mPutDocumentStats; + @Nullable public InitializeStats mInitializeStats; + @Nullable public SearchStats mSearchStats; + @Nullable public RemoveStats mRemoveStats; + @Nullable public OptimizeStats mOptimizeStats; + @Nullable public SetSchemaStats mSetSchemaStats; + + @Override + public void logStats(@NonNull CallStats stats) { + mCallStats = stats; + } + + @Override + public void logStats(@NonNull PutDocumentStats stats) { + mPutDocumentStats = stats; + } + + @Override + public void logStats(@NonNull InitializeStats stats) { + mInitializeStats = stats; + } + + @Override + public void logStats(@NonNull SearchStats stats) { + mSearchStats = stats; + } + + @Override + public void logStats(@NonNull RemoveStats stats) { + mRemoveStats = stats; + } + + @Override + public void logStats(@NonNull OptimizeStats stats) { + mOptimizeStats = stats; + } + + @Override + public void logStats(@NonNull SetSchemaStats stats) { + mSetSchemaStats = stats; + } + } public static <K, V> AppSearchBatchResult<K, V> checkIsBatchResultSuccess( Future<AppSearchBatchResult<K, V>> future) throws Exception { diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 0732c6136401..becdd92b5ff6 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -3229,6 +3229,7 @@ package android.window { method @NonNull public android.content.res.Configuration getConfiguration(); method @NonNull public android.os.IBinder getFragmentToken(); method @NonNull public android.graphics.Point getPositionInParent(); + method public int getRunningActivityCount(); method @NonNull public android.window.WindowContainerToken getToken(); method public int getWindowingMode(); method public boolean hasRunningActivity(); diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index 76f873185267..d1def7e62626 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -55,7 +55,7 @@ import android.view.RemoteAnimationAdapter; import android.view.View; import android.view.ViewGroup; import android.view.Window; -import android.window.IRemoteTransition; +import android.window.RemoteTransition; import android.window.SplashScreen; import android.window.WindowContainerToken; @@ -426,7 +426,7 @@ public class ActivityOptions { private IAppTransitionAnimationSpecsFuture mSpecsFuture; private RemoteAnimationAdapter mRemoteAnimationAdapter; private IBinder mLaunchCookie; - private IRemoteTransition mRemoteTransition; + private RemoteTransition mRemoteTransition; private boolean mOverrideTaskTransition; private String mSplashScreenThemeResName; @SplashScreen.SplashScreenStyle @@ -1054,7 +1054,7 @@ public class ActivityOptions { */ @RequiresPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS) public static ActivityOptions makeRemoteAnimation(RemoteAnimationAdapter remoteAnimationAdapter, - IRemoteTransition remoteTransition) { + RemoteTransition remoteTransition) { final ActivityOptions opts = new ActivityOptions(); opts.mRemoteAnimationAdapter = remoteAnimationAdapter; opts.mAnimationType = ANIM_REMOTE_ANIMATION; @@ -1064,11 +1064,11 @@ public class ActivityOptions { /** * Create an {@link ActivityOptions} instance that lets the application control the entire - * transition using a {@link IRemoteTransition}. + * transition using a {@link RemoteTransition}. * @hide */ @RequiresPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS) - public static ActivityOptions makeRemoteTransition(IRemoteTransition remoteTransition) { + public static ActivityOptions makeRemoteTransition(RemoteTransition remoteTransition) { final ActivityOptions opts = new ActivityOptions(); opts.mRemoteTransition = remoteTransition; return opts; @@ -1181,8 +1181,7 @@ public class ActivityOptions { } mRemoteAnimationAdapter = opts.getParcelable(KEY_REMOTE_ANIMATION_ADAPTER); mLaunchCookie = opts.getBinder(KEY_LAUNCH_COOKIE); - mRemoteTransition = IRemoteTransition.Stub.asInterface(opts.getBinder( - KEY_REMOTE_TRANSITION)); + mRemoteTransition = opts.getParcelable(KEY_REMOTE_TRANSITION); mOverrideTaskTransition = opts.getBoolean(KEY_OVERRIDE_TASK_TRANSITION); mSplashScreenThemeResName = opts.getString(KEY_SPLASH_SCREEN_THEME); mRemoveWithTaskOrganizer = opts.getBoolean(KEY_REMOVE_WITH_TASK_ORGANIZER); @@ -1348,7 +1347,7 @@ public class ActivityOptions { } /** @hide */ - public IRemoteTransition getRemoteTransition() { + public RemoteTransition getRemoteTransition() { return mRemoteTransition; } @@ -1965,7 +1964,7 @@ public class ActivityOptions { b.putBinder(KEY_LAUNCH_COOKIE, mLaunchCookie); } if (mRemoteTransition != null) { - b.putBinder(KEY_REMOTE_TRANSITION, mRemoteTransition.asBinder()); + b.putParcelable(KEY_REMOTE_TRANSITION, mRemoteTransition); } if (mOverrideTaskTransition) { b.putBoolean(KEY_OVERRIDE_TASK_TRANSITION, mOverrideTaskTransition); diff --git a/core/java/android/app/search/Query.java b/core/java/android/app/search/Query.java index c64e10723ca6..f073b4e50555 100644 --- a/core/java/android/app/search/Query.java +++ b/core/java/android/app/search/Query.java @@ -70,7 +70,7 @@ public final class Query implements Parcelable { @NonNull Bundle extras) { mInput = input; mTimestampMillis = timestampMillis; - mExtras = extras == null ? extras : new Bundle(); + mExtras = extras != null ? extras : new Bundle(); } /** diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 27027721109d..08e95a267d7f 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -3195,7 +3195,7 @@ public abstract class Context { * apps targeting SDK Version {@link android.os.Build.VERSION_CODES#O} * or higher are not allowed to start background services from the background. * See - * <a href="{@docRoot}/about/versions/oreo/background"> + * <a href="/about/versions/oreo/background"> * Background Execution Limits</a> * for more details. * @@ -3204,7 +3204,7 @@ public abstract class Context { * apps targeting SDK Version {@link android.os.Build.VERSION_CODES#S} * or higher are not allowed to start foreground services from the background. * See - * <a href="{@docRoot}/about/versions/12/behavior-changes-12"> + * <a href="/about/versions/12/behavior-changes-12"> * Behavior changes: Apps targeting Android 12 * </a> * for more details. @@ -3258,7 +3258,7 @@ public abstract class Context { * apps targeting SDK Version {@link android.os.Build.VERSION_CODES#S} * or higher are not allowed to start foreground services from the background. * See - * <a href="{@docRoot}/about/versions/12/behavior-changes-12"> + * <a href="/about/versions/12/behavior-changes-12"> * Behavior changes: Apps targeting Android 12 * </a> * for more details. diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index dd2080b60b37..2bac066ed186 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -207,7 +207,9 @@ public class PackageItemInfo { return loadSafeLabel(pm, DEFAULT_MAX_LABEL_SIZE_PX, SAFE_STRING_FLAG_TRIM | SAFE_STRING_FLAG_FIRST_LINE); } else { - return loadUnsafeLabel(pm); + // Trims the label string to the MAX_SAFE_LABEL_LENGTH. This is to prevent that the + // system is overwhelmed by an enormous string returned by the application. + return TextUtils.trimToSize(loadUnsafeLabel(pm), MAX_SAFE_LABEL_LENGTH); } } diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java index 3f3db29ed0fd..c8c122da4ab8 100644 --- a/core/java/android/hardware/biometrics/BiometricPrompt.java +++ b/core/java/android/hardware/biometrics/BiometricPrompt.java @@ -438,9 +438,16 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan } private class OnAuthenticationCancelListener implements CancellationSignal.OnCancelListener { + private final long mAuthRequestId; + + OnAuthenticationCancelListener(long id) { + mAuthRequestId = id; + } + @Override public void onCancel() { - cancelAuthentication(); + Log.d(TAG, "Cancel BP authentication requested for: " + mAuthRequestId); + cancelAuthentication(mAuthRequestId); } } @@ -853,10 +860,12 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @param userId The user to authenticate * @param operationId The keystore operation associated with authentication * + * @return A requestId that can be used to cancel this operation. + * * @hide */ @RequiresPermission(USE_BIOMETRIC_INTERNAL) - public void authenticateUserForOperation( + public long authenticateUserForOperation( @NonNull CancellationSignal cancel, @NonNull @CallbackExecutor Executor executor, @NonNull AuthenticationCallback callback, @@ -871,7 +880,8 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan if (callback == null) { throw new IllegalArgumentException("Must supply a callback"); } - authenticateInternal(operationId, cancel, executor, callback, userId); + + return authenticateInternal(operationId, cancel, executor, callback, userId); } /** @@ -1002,10 +1012,10 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan authenticateInternal(null /* crypto */, cancel, executor, callback, mContext.getUserId()); } - private void cancelAuthentication() { + private void cancelAuthentication(long requestId) { if (mService != null) { try { - mService.cancelAuthentication(mToken, mContext.getOpPackageName()); + mService.cancelAuthentication(mToken, mContext.getOpPackageName(), requestId); } catch (RemoteException e) { Log.e(TAG, "Unable to cancel authentication", e); } @@ -1024,7 +1034,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan authenticateInternal(operationId, cancel, executor, callback, userId); } - private void authenticateInternal( + private long authenticateInternal( long operationId, @NonNull CancellationSignal cancel, @NonNull @CallbackExecutor Executor executor, @@ -1040,9 +1050,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan try { if (cancel.isCanceled()) { Log.w(TAG, "Authentication already canceled"); - return; - } else { - cancel.setOnCancelListener(new OnAuthenticationCancelListener()); + return -1; } mExecutor = executor; @@ -1065,14 +1073,16 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan promptInfo = mPromptInfo; } - mService.authenticate(mToken, operationId, userId, mBiometricServiceReceiver, - mContext.getOpPackageName(), promptInfo); - + final long authId = mService.authenticate(mToken, operationId, userId, + mBiometricServiceReceiver, mContext.getOpPackageName(), promptInfo); + cancel.setOnCancelListener(new OnAuthenticationCancelListener(authId)); + return authId; } catch (RemoteException e) { Log.e(TAG, "Remote exception while authenticating", e); mExecutor.execute(() -> callback.onAuthenticationError( BiometricPrompt.BIOMETRIC_ERROR_HW_UNAVAILABLE, mContext.getString(R.string.biometric_error_hw_unavailable))); + return -1; } } diff --git a/core/java/android/hardware/biometrics/IAuthService.aidl b/core/java/android/hardware/biometrics/IAuthService.aidl index 4c2a9ae10cbd..91f794c161bf 100644 --- a/core/java/android/hardware/biometrics/IAuthService.aidl +++ b/core/java/android/hardware/biometrics/IAuthService.aidl @@ -41,13 +41,14 @@ interface IAuthService { // Retrieve the package where BIometricOrompt's UI is implemented String getUiPackage(); - // Requests authentication. The service choose the appropriate biometric to use, and show - // the corresponding BiometricDialog. - void authenticate(IBinder token, long sessionId, int userId, + // Requests authentication. The service chooses the appropriate biometric to use, and shows + // the corresponding BiometricDialog. A requestId is returned that can be used to cancel + // this operation. + long authenticate(IBinder token, long sessionId, int userId, IBiometricServiceReceiver receiver, String opPackageName, in PromptInfo promptInfo); - // Cancel authentication for the given sessionId - void cancelAuthentication(IBinder token, String opPackageName); + // Cancel authentication for the given requestId. + void cancelAuthentication(IBinder token, String opPackageName, long requestId); // TODO(b/141025588): Make userId the first arg to be consistent with hasEnrolledBiometrics. // Checks if biometrics can be used. diff --git a/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl b/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl index 876513f266e8..addd622eef35 100644 --- a/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl +++ b/core/java/android/hardware/biometrics/IBiometricAuthenticator.aidl @@ -48,13 +48,13 @@ interface IBiometricAuthenticator { // startPreparedClient(). void prepareForAuthentication(boolean requireConfirmation, IBinder token, long operationId, int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, - int cookie, boolean allowBackgroundAuthentication); + long requestId, int cookie, boolean allowBackgroundAuthentication); // Starts authentication with the previously prepared client. void startPreparedClient(int cookie); - // Cancels authentication. - void cancelAuthenticationFromService(IBinder token, String opPackageName); + // Cancels authentication for the given requestId. + void cancelAuthenticationFromService(IBinder token, String opPackageName, long requestId); // Determine if HAL is loaded and ready boolean isHardwareDetected(String opPackageName); diff --git a/core/java/android/hardware/biometrics/IBiometricService.aidl b/core/java/android/hardware/biometrics/IBiometricService.aidl index 64b51183a170..2c3c8c353e8c 100644 --- a/core/java/android/hardware/biometrics/IBiometricService.aidl +++ b/core/java/android/hardware/biometrics/IBiometricService.aidl @@ -36,13 +36,14 @@ interface IBiometricService { // Retrieve static sensor properties for all biometric sensors List<SensorPropertiesInternal> getSensorProperties(String opPackageName); - // Requests authentication. The service choose the appropriate biometric to use, and show - // the corresponding BiometricDialog. - void authenticate(IBinder token, long operationId, int userId, + // Requests authentication. The service chooses the appropriate biometric to use, and shows + // the corresponding BiometricDialog. A requestId is returned that can be used to cancel + // this operation. + long authenticate(IBinder token, long operationId, int userId, IBiometricServiceReceiver receiver, String opPackageName, in PromptInfo promptInfo); - // Cancel authentication for the given session. - void cancelAuthentication(IBinder token, String opPackageName); + // Cancel authentication for the given requestId. + void cancelAuthentication(IBinder token, String opPackageName, long requestId); // Checks if biometrics can be used. int canAuthenticate(String opPackageName, int userId, int callingUserId, int authenticators); diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 5034ef1dfec5..73961ff373dd 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -864,7 +864,8 @@ public final class DisplayManager { if (surface != null) { builder.setSurface(surface); } - return createVirtualDisplay(null /* projection */, builder.build(), callback, handler); + return createVirtualDisplay(null /* projection */, builder.build(), callback, handler, + null /* windowContext */); } // TODO : Remove this hidden API after remove all callers. (Refer to MultiDisplayService) @@ -882,15 +883,17 @@ public final class DisplayManager { if (surface != null) { builder.setSurface(surface); } - return createVirtualDisplay(projection, builder.build(), callback, handler); + return createVirtualDisplay(projection, builder.build(), callback, handler, + null /* windowContext */); } /** @hide */ public VirtualDisplay createVirtualDisplay(@Nullable MediaProjection projection, @NonNull VirtualDisplayConfig virtualDisplayConfig, - @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) { + @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler, + @Nullable Context windowContext) { return mGlobal.createVirtualDisplay(mContext, projection, virtualDisplayConfig, callback, - handler); + handler, windowContext); } /** diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java index 2025f40ed20a..1fec3c9ff50a 100644 --- a/core/java/android/hardware/display/DisplayManagerGlobal.java +++ b/core/java/android/hardware/display/DisplayManagerGlobal.java @@ -583,7 +583,7 @@ public final class DisplayManagerGlobal { public VirtualDisplay createVirtualDisplay(@NonNull Context context, MediaProjection projection, @NonNull VirtualDisplayConfig virtualDisplayConfig, VirtualDisplay.Callback callback, - Handler handler) { + Handler handler, @Nullable Context windowContext) { VirtualDisplayCallback callbackWrapper = new VirtualDisplayCallback(callback, handler); IMediaProjection projectionToken = projection != null ? projection.getProjection() : null; int displayId; @@ -609,7 +609,7 @@ public final class DisplayManagerGlobal { return null; } return new VirtualDisplay(this, display, callbackWrapper, - virtualDisplayConfig.getSurface()); + virtualDisplayConfig.getSurface(), windowContext); } public void setVirtualDisplaySurface(IVirtualDisplayCallback token, Surface surface) { diff --git a/core/java/android/hardware/display/VirtualDisplay.java b/core/java/android/hardware/display/VirtualDisplay.java index bf62c95cf6db..71cbd20e8005 100644 --- a/core/java/android/hardware/display/VirtualDisplay.java +++ b/core/java/android/hardware/display/VirtualDisplay.java @@ -15,6 +15,8 @@ */ package android.hardware.display; +import android.annotation.Nullable; +import android.content.Context; import android.view.Display; import android.view.Surface; @@ -36,13 +38,19 @@ public final class VirtualDisplay { private final Display mDisplay; private IVirtualDisplayCallback mToken; private Surface mSurface; + /** + * Store the WindowContext in a field. If it is a local variable, and it is garbage collected + * during a MediaProjection session, the WindowContainer listener no longer exists. + */ + @Nullable private final Context mWindowContext; VirtualDisplay(DisplayManagerGlobal global, Display display, - IVirtualDisplayCallback token, Surface surface) { + IVirtualDisplayCallback token, Surface surface, Context windowContext) { mGlobal = global; mDisplay = display; mToken = token; mSurface = surface; + mWindowContext = windowContext; } /** diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java index 385ad2d3577f..56f81423db4e 100644 --- a/core/java/android/hardware/face/FaceManager.java +++ b/core/java/android/hardware/face/FaceManager.java @@ -58,7 +58,7 @@ import java.util.List; public class FaceManager implements BiometricAuthenticator, BiometricFaceConstants { private static final String TAG = "FaceManager"; - private static final boolean DEBUG = true; + private static final int MSG_ENROLL_RESULT = 100; private static final int MSG_ACQUIRED = 101; private static final int MSG_AUTHENTICATION_SUCCEEDED = 102; @@ -207,13 +207,9 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan throw new IllegalArgumentException("Must supply an authentication callback"); } - if (cancel != null) { - if (cancel.isCanceled()) { - Slog.w(TAG, "authentication already canceled"); - return; - } else { - cancel.setOnCancelListener(new OnAuthenticationCancelListener(crypto)); - } + if (cancel != null && cancel.isCanceled()) { + Slog.w(TAG, "authentication already canceled"); + return; } if (mService != null) { @@ -223,17 +219,18 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan mCryptoObject = crypto; final long operationId = crypto != null ? crypto.getOpId() : 0; Trace.beginSection("FaceManager#authenticate"); - mService.authenticate(mToken, operationId, userId, mServiceReceiver, - mContext.getOpPackageName(), isKeyguardBypassEnabled); + final long authId = mService.authenticate(mToken, operationId, userId, + mServiceReceiver, mContext.getOpPackageName(), isKeyguardBypassEnabled); + if (cancel != null) { + cancel.setOnCancelListener(new OnAuthenticationCancelListener(authId)); + } } catch (RemoteException e) { Slog.w(TAG, "Remote exception while authenticating: ", e); - if (callback != null) { - // Though this may not be a hardware issue, it will cause apps to give up or - // try again later. - callback.onAuthenticationError(FACE_ERROR_HW_UNAVAILABLE, - getErrorString(mContext, FACE_ERROR_HW_UNAVAILABLE, - 0 /* vendorCode */)); - } + // Though this may not be a hardware issue, it will cause apps to give up or + // try again later. + callback.onAuthenticationError(FACE_ERROR_HW_UNAVAILABLE, + getErrorString(mContext, FACE_ERROR_HW_UNAVAILABLE, + 0 /* vendorCode */)); } finally { Trace.endSection(); } @@ -255,14 +252,14 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan if (cancel.isCanceled()) { Slog.w(TAG, "Detection already cancelled"); return; - } else { - cancel.setOnCancelListener(new OnFaceDetectionCancelListener()); } mFaceDetectionCallback = callback; try { - mService.detectFace(mToken, userId, mServiceReceiver, mContext.getOpPackageName()); + final long authId = mService.detectFace( + mToken, userId, mServiceReceiver, mContext.getOpPackageName()); + cancel.setOnCancelListener(new OnFaceDetectionCancelListener(authId)); } catch (RemoteException e) { Slog.w(TAG, "Remote exception when requesting finger detect", e); } @@ -726,23 +723,23 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan } } - private void cancelAuthentication(CryptoObject cryptoObject) { + private void cancelAuthentication(long requestId) { if (mService != null) { try { - mService.cancelAuthentication(mToken, mContext.getOpPackageName()); + mService.cancelAuthentication(mToken, mContext.getOpPackageName(), requestId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } } - private void cancelFaceDetect() { + private void cancelFaceDetect(long requestId) { if (mService == null) { return; } try { - mService.cancelFaceDetect(mToken, mContext.getOpPackageName()); + mService.cancelFaceDetect(mToken, mContext.getOpPackageName(), requestId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -794,9 +791,9 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan // This is used as a last resort in case a vendor string is missing // It should not happen for anything other than FACE_ERROR_VENDOR, but // warn and use the default if all else fails. - // TODO(b/196639965): update string Slog.w(TAG, "Invalid error message: " + errMsg + ", " + vendorCode); - return ""; + return context.getString( + com.android.internal.R.string.face_error_vendor_unknown); } /** @@ -1110,22 +1107,30 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan } private class OnAuthenticationCancelListener implements OnCancelListener { - private final CryptoObject mCrypto; + private final long mAuthRequestId; - OnAuthenticationCancelListener(CryptoObject crypto) { - mCrypto = crypto; + OnAuthenticationCancelListener(long id) { + mAuthRequestId = id; } @Override public void onCancel() { - cancelAuthentication(mCrypto); + Slog.d(TAG, "Cancel face authentication requested for: " + mAuthRequestId); + cancelAuthentication(mAuthRequestId); } } private class OnFaceDetectionCancelListener implements OnCancelListener { + private final long mAuthRequestId; + + OnFaceDetectionCancelListener(long id) { + mAuthRequestId = id; + } + @Override public void onCancel() { - cancelFaceDetect(); + Slog.d(TAG, "Cancel face detect requested for: " + mAuthRequestId); + cancelFaceDetect(mAuthRequestId); } } diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl index db02a0ef2a10..e9198246dee3 100644 --- a/core/java/android/hardware/face/IFaceService.aidl +++ b/core/java/android/hardware/face/IFaceService.aidl @@ -44,34 +44,36 @@ interface IFaceService { // Retrieve static sensor properties for the specified sensor FaceSensorPropertiesInternal getSensorProperties(int sensorId, String opPackageName); - // Authenticate the given sessionId with a face - void authenticate(IBinder token, long operationId, int userId, IFaceServiceReceiver receiver, + // Authenticate with a face. A requestId is returned that can be used to cancel this operation. + long authenticate(IBinder token, long operationId, int userId, IFaceServiceReceiver receiver, String opPackageName, boolean isKeyguardBypassEnabled); // Uses the face hardware to detect for the presence of a face, without giving details - // about accept/reject/lockout. - void detectFace(IBinder token, int userId, IFaceServiceReceiver receiver, String opPackageName); + // about accept/reject/lockout. A requestId is returned that can be used to cancel this + // operation. + long detectFace(IBinder token, int userId, IFaceServiceReceiver receiver, String opPackageName); // This method prepares the service to start authenticating, but doesn't start authentication. // This is protected by the MANAGE_BIOMETRIC signatuer permission. This method should only be // called from BiometricService. The additional uid, pid, userId arguments should be determined // by BiometricService. To start authentication after the clients are ready, use // startPreparedClient(). - void prepareForAuthentication(int sensorId, boolean requireConfirmation, IBinder token, long operationId, - int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, - int cookie, boolean allowBackgroundAuthentication); + void prepareForAuthentication(int sensorId, boolean requireConfirmation, IBinder token, + long operationId, int userId, IBiometricSensorReceiver sensorReceiver, + String opPackageName, long requestId, int cookie, + boolean allowBackgroundAuthentication); // Starts authentication with the previously prepared client. void startPreparedClient(int sensorId, int cookie); - // Cancel authentication for the given sessionId - void cancelAuthentication(IBinder token, String opPackageName); + // Cancel authentication for the given requestId. + void cancelAuthentication(IBinder token, String opPackageName, long requestId); - // Cancel face detection - void cancelFaceDetect(IBinder token, String opPackageName); + // Cancel face detection for the given requestId. + void cancelFaceDetect(IBinder token, String opPackageName, long requestId); // Same as above, with extra arguments. - void cancelAuthenticationFromService(int sensorId, IBinder token, String opPackageName); + void cancelAuthenticationFromService(int sensorId, IBinder token, String opPackageName, long requestId); // Start face enrollment void enroll(int userId, IBinder token, in byte [] hardwareAuthToken, IFaceServiceReceiver receiver, diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 87d45b9de745..7c42dc0da7c7 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -189,22 +189,30 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing } private class OnAuthenticationCancelListener implements OnCancelListener { - private android.hardware.biometrics.CryptoObject mCrypto; + private final long mAuthRequestId; - public OnAuthenticationCancelListener(android.hardware.biometrics.CryptoObject crypto) { - mCrypto = crypto; + OnAuthenticationCancelListener(long id) { + mAuthRequestId = id; } @Override public void onCancel() { - cancelAuthentication(mCrypto); + Slog.d(TAG, "Cancel fingerprint authentication requested for: " + mAuthRequestId); + cancelAuthentication(mAuthRequestId); } } private class OnFingerprintDetectionCancelListener implements OnCancelListener { + private final long mAuthRequestId; + + OnFingerprintDetectionCancelListener(long id) { + mAuthRequestId = id; + } + @Override public void onCancel() { - cancelFingerprintDetect(); + Slog.d(TAG, "Cancel fingerprint detect requested for: " + mAuthRequestId); + cancelFingerprintDetect(mAuthRequestId); } } @@ -552,13 +560,9 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing throw new IllegalArgumentException("Must supply an authentication callback"); } - if (cancel != null) { - if (cancel.isCanceled()) { - Slog.w(TAG, "authentication already canceled"); - return; - } else { - cancel.setOnCancelListener(new OnAuthenticationCancelListener(crypto)); - } + if (cancel != null && cancel.isCanceled()) { + Slog.w(TAG, "authentication already canceled"); + return; } if (mService != null) { @@ -567,8 +571,11 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing mAuthenticationCallback = callback; mCryptoObject = crypto; final long operationId = crypto != null ? crypto.getOpId() : 0; - mService.authenticate(mToken, operationId, sensorId, userId, mServiceReceiver, - mContext.getOpPackageName()); + final long authId = mService.authenticate(mToken, operationId, sensorId, userId, + mServiceReceiver, mContext.getOpPackageName()); + if (cancel != null) { + cancel.setOnCancelListener(new OnAuthenticationCancelListener(authId)); + } } catch (RemoteException e) { Slog.w(TAG, "Remote exception while authenticating: ", e); // Though this may not be a hardware issue, it will cause apps to give up or try @@ -595,15 +602,14 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing if (cancel.isCanceled()) { Slog.w(TAG, "Detection already cancelled"); return; - } else { - cancel.setOnCancelListener(new OnFingerprintDetectionCancelListener()); } mFingerprintDetectionCallback = callback; try { - mService.detectFingerprint(mToken, userId, mServiceReceiver, + final long authId = mService.detectFingerprint(mToken, userId, mServiceReceiver, mContext.getOpPackageName()); + cancel.setOnCancelListener(new OnFingerprintDetectionCancelListener(authId)); } catch (RemoteException e) { Slog.w(TAG, "Remote exception when requesting finger detect", e); } @@ -1320,21 +1326,21 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing } } - private void cancelAuthentication(android.hardware.biometrics.CryptoObject cryptoObject) { + private void cancelAuthentication(long requestId) { if (mService != null) try { - mService.cancelAuthentication(mToken, mContext.getOpPackageName()); + mService.cancelAuthentication(mToken, mContext.getOpPackageName(), requestId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } - private void cancelFingerprintDetect() { + private void cancelFingerprintDetect(long requestId) { if (mService == null) { return; } try { - mService.cancelFingerprintDetect(mToken, mContext.getOpPackageName()); + mService.cancelFingerprintDetect(mToken, mContext.getOpPackageName(), requestId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1390,9 +1396,9 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing // This is used as a last resort in case a vendor string is missing // It should not happen for anything other than FINGERPRINT_ERROR_VENDOR, but // warn and use the default if all else fails. - // TODO(b/196639965): update string Slog.w(TAG, "Invalid error message: " + errMsg + ", " + vendorCode); - return ""; + return context.getString( + com.android.internal.R.string.fingerprint_error_vendor_unknown); } /** diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl index 3979afe80d17..477482757699 100644 --- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl +++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl @@ -48,15 +48,16 @@ interface IFingerprintService { // Retrieve static sensor properties for the specified sensor FingerprintSensorPropertiesInternal getSensorProperties(int sensorId, String opPackageName); - // Authenticate the given sessionId with a fingerprint. This is protected by - // USE_FINGERPRINT/USE_BIOMETRIC permission. This is effectively deprecated, since it only comes - // through FingerprintManager now. - void authenticate(IBinder token, long operationId, int sensorId, int userId, + // Authenticate with a fingerprint. This is protected by USE_FINGERPRINT/USE_BIOMETRIC + // permission. This is effectively deprecated, since it only comes through FingerprintManager + // now. A requestId is returned that can be used to cancel this operation. + long authenticate(IBinder token, long operationId, int sensorId, int userId, IFingerprintServiceReceiver receiver, String opPackageName); // Uses the fingerprint hardware to detect for the presence of a finger, without giving details - // about accept/reject/lockout. - void detectFingerprint(IBinder token, int userId, IFingerprintServiceReceiver receiver, + // about accept/reject/lockout. A requestId is returned that can be used to cancel this + // operation. + long detectFingerprint(IBinder token, int userId, IFingerprintServiceReceiver receiver, String opPackageName); // This method prepares the service to start authenticating, but doesn't start authentication. @@ -65,21 +66,21 @@ interface IFingerprintService { // by BiometricService. To start authentication after the clients are ready, use // startPreparedClient(). void prepareForAuthentication(int sensorId, IBinder token, long operationId, int userId, - IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie, - boolean allowBackgroundAuthentication); + IBiometricSensorReceiver sensorReceiver, String opPackageName, long requestId, + int cookie, boolean allowBackgroundAuthentication); // Starts authentication with the previously prepared client. void startPreparedClient(int sensorId, int cookie); - // Cancel authentication for the given sessionId - void cancelAuthentication(IBinder token, String opPackageName); + // Cancel authentication for the given requestId. + void cancelAuthentication(IBinder token, String opPackageName, long requestId); - // Cancel finger detection - void cancelFingerprintDetect(IBinder token, String opPackageName); + // Cancel finger detection for the given requestId. + void cancelFingerprintDetect(IBinder token, String opPackageName, long requestId); // Same as above, except this is protected by the MANAGE_BIOMETRIC signature permission. Takes // an additional uid, pid, userid. - void cancelAuthenticationFromService(int sensorId, IBinder token, String opPackageName); + void cancelAuthenticationFromService(int sensorId, IBinder token, String opPackageName, long requestId); // Start fingerprint enrollment void enroll(IBinder token, in byte [] hardwareAuthToken, int userId, IFingerprintServiceReceiver receiver, diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 99cb4c524a3b..5395d8d7e908 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11911,6 +11911,13 @@ public final class Settings { public static final String WIFI_MIGRATION_COMPLETED = "wifi_migration_completed"; /** + * Whether UWB should be enabled. + * @hide + */ + @Readable + public static final String UWB_ENABLED = "uwb_enabled"; + + /** * Value to specify whether network quality scores and badging should be shown in the UI. * * Type: int (0 for false, 1 for true) diff --git a/core/java/android/util/DisplayUtils.java b/core/java/android/util/DisplayUtils.java new file mode 100644 index 000000000000..4fe7f8369f73 --- /dev/null +++ b/core/java/android/util/DisplayUtils.java @@ -0,0 +1,54 @@ +/* + * 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.util; + +import android.content.res.Resources; + +import com.android.internal.R; + +/** + * Utils for loading resources for multi-display. + * + * @hide + */ +public class DisplayUtils { + + /** + * Gets the index of the given display unique id in {@link R.array#config_displayUniqueIdArray} + * which is used to get the related cutout configs for that display. + * + * For multi-display device, {@link R.array#config_displayUniqueIdArray} should be set for each + * display if there are different type of cutouts on each display. + * For single display device, {@link R.array#config_displayUniqueIdArray} should not to be set + * and the system will load the default configs for main built-in display. + */ + public static int getDisplayUniqueIdConfigIndex(Resources res, String displayUniqueId) { + int index = -1; + if (displayUniqueId == null || displayUniqueId.isEmpty()) { + return index; + } + final String[] ids = res.getStringArray(R.array.config_displayUniqueIdArray); + final int size = ids.length; + for (int i = 0; i < size; i++) { + if (displayUniqueId.equals(ids[i])) { + index = i; + break; + } + } + return index; + } +} diff --git a/core/java/android/util/imetracing/ImeTracingServerImpl.java b/core/java/android/util/imetracing/ImeTracingServerImpl.java index 06e4c5002776..d605430bcf14 100644 --- a/core/java/android/util/imetracing/ImeTracingServerImpl.java +++ b/core/java/android/util/imetracing/ImeTracingServerImpl.java @@ -41,9 +41,9 @@ import java.io.PrintWriter; */ class ImeTracingServerImpl extends ImeTracing { private static final String TRACE_DIRNAME = "/data/misc/wmtrace/"; - private static final String TRACE_FILENAME_CLIENTS = "ime_trace_clients.pb"; - private static final String TRACE_FILENAME_IMS = "ime_trace_service.pb"; - private static final String TRACE_FILENAME_IMMS = "ime_trace_managerservice.pb"; + private static final String TRACE_FILENAME_CLIENTS = "ime_trace_clients.winscope"; + private static final String TRACE_FILENAME_IMS = "ime_trace_service.winscope"; + private static final String TRACE_FILENAME_IMMS = "ime_trace_managerservice.winscope"; private static final int BUFFER_CAPACITY = 4096 * 1024; // Needed for winscope to auto-detect the dump type. Explained further in diff --git a/core/java/android/view/DisplayCutout.java b/core/java/android/view/DisplayCutout.java index 0257e55073dc..c1a5636b7b34 100644 --- a/core/java/android/view/DisplayCutout.java +++ b/core/java/android/view/DisplayCutout.java @@ -39,6 +39,7 @@ import android.graphics.Rect; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; +import android.util.DisplayUtils; import android.util.Pair; import android.util.RotationUtils; import android.util.proto.ProtoOutputStream; @@ -874,38 +875,13 @@ public final class DisplayCutout { } /** - * Gets the index of the given display unique id in {@link R.array#config_displayUniqueIdArray} - * which is used to get the related cutout configs for that display. - * - * For multi-display device, {@link R.array#config_displayUniqueIdArray} should be set for each - * display if there are different type of cutouts on each display. - * For single display device, {@link R.array#config_displayUniqueIdArray} should not to be set - * and the system will load the default configs for main built-in display. - */ - private static int getDisplayCutoutConfigIndex(Resources res, String displayUniqueId) { - int index = -1; - if (displayUniqueId == null || displayUniqueId.isEmpty()) { - return index; - } - final String[] ids = res.getStringArray(R.array.config_displayUniqueIdArray); - final int size = ids.length; - for (int i = 0; i < size; i++) { - if (displayUniqueId.equals(ids[i])) { - index = i; - break; - } - } - return index; - } - - /** * Gets the display cutout by the given display unique id. * * Loads the default config {@link R.string#config_mainBuiltInDisplayCutout) if * {@link R.array#config_displayUniqueIdArray} is not set. */ private static String getDisplayCutoutPath(Resources res, String displayUniqueId) { - final int index = getDisplayCutoutConfigIndex(res, displayUniqueId); + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); final String[] array = res.getStringArray(R.array.config_displayCutoutPathArray); if (index >= 0 && index < array.length) { return array[index]; @@ -920,7 +896,7 @@ public final class DisplayCutout { * {@link R.array#config_displayUniqueIdArray} is not set. */ private static String getDisplayCutoutApproximationRect(Resources res, String displayUniqueId) { - final int index = getDisplayCutoutConfigIndex(res, displayUniqueId); + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); final String[] array = res.getStringArray( R.array.config_displayCutoutApproximationRectArray); if (index >= 0 && index < array.length) { @@ -939,7 +915,7 @@ public final class DisplayCutout { * @hide */ public static boolean getMaskBuiltInDisplayCutout(Resources res, String displayUniqueId) { - final int index = getDisplayCutoutConfigIndex(res, displayUniqueId); + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); final TypedArray array = res.obtainTypedArray(R.array.config_maskBuiltInDisplayCutoutArray); boolean maskCutout; if (index >= 0 && index < array.length()) { @@ -961,7 +937,7 @@ public final class DisplayCutout { * @hide */ public static boolean getFillBuiltInDisplayCutout(Resources res, String displayUniqueId) { - final int index = getDisplayCutoutConfigIndex(res, displayUniqueId); + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); final TypedArray array = res.obtainTypedArray(R.array.config_fillBuiltInDisplayCutoutArray); boolean fillCutout; if (index >= 0 && index < array.length()) { @@ -984,7 +960,7 @@ public final class DisplayCutout { */ private static Insets getWaterfallInsets(Resources res, String displayUniqueId) { Insets insets; - final int index = getDisplayCutoutConfigIndex(res, displayUniqueId); + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); final TypedArray array = res.obtainTypedArray(R.array.config_waterfallCutoutArray); if (index >= 0 && index < array.length() && array.getResourceId(index, 0) > 0) { final int resourceId = array.getResourceId(index, 0); diff --git a/core/java/android/view/IDisplayWindowListener.aidl b/core/java/android/view/IDisplayWindowListener.aidl index 610e0f866b43..f95d6b349221 100644 --- a/core/java/android/view/IDisplayWindowListener.aidl +++ b/core/java/android/view/IDisplayWindowListener.aidl @@ -32,7 +32,8 @@ import android.content.res.Configuration; oneway interface IDisplayWindowListener { /** - * Called when a display is added to the WM hierarchy. + * Called when a new display is added to the WM hierarchy. The existing display ids are returned + * when this listener is registered with WM via {@link #registerDisplayWindowListener}. */ void onDisplayAdded(int displayId); diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 9ce412222e2e..52d57cf0a7f6 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -521,9 +521,10 @@ interface IWindowManager void unregisterDisplayFoldListener(IDisplayFoldListener listener); /** - * Registers an IDisplayContainerListener + * Registers an IDisplayContainerListener, and returns the set of existing display ids. The + * listener's onDisplayAdded() will not be called for the displays returned. */ - void registerDisplayWindowListener(IDisplayWindowListener listener); + int[] registerDisplayWindowListener(IDisplayWindowListener listener); /** * Unregisters an IDisplayContainerListener. diff --git a/core/java/android/view/InsetsAnimationControlCallbacks.java b/core/java/android/view/InsetsAnimationControlCallbacks.java index 3431c3ecc310..04bb6091672b 100644 --- a/core/java/android/view/InsetsAnimationControlCallbacks.java +++ b/core/java/android/view/InsetsAnimationControlCallbacks.java @@ -20,7 +20,8 @@ import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsAnimation.Bounds; /** - * Provide an interface to let InsetsAnimationControlImpl call back into its owner. + * Provide an interface to let InsetsAnimationControlImpl and InsetsResizeAnimationRunner call back + * into its owner. * @hide */ public interface InsetsAnimationControlCallbacks { @@ -34,10 +35,9 @@ public interface InsetsAnimationControlCallbacks { * <li>Dispatch {@link WindowInsetsAnimationControlListener#onReady}</li> * </ul> */ - void startAnimation(InsetsAnimationControlImpl controller, - WindowInsetsAnimationControlListener listener, int types, - WindowInsetsAnimation animation, - Bounds bounds); + <T extends InsetsAnimationControlRunner & InternalInsetsAnimationController> + void startAnimation(T runner, WindowInsetsAnimationControlListener listener, int types, + WindowInsetsAnimation animation, Bounds bounds); /** * Schedule the apply by posting the animation callback. diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java index 17b3020001d4..7d8d653f5ab3 100644 --- a/core/java/android/view/InsetsAnimationControlImpl.java +++ b/core/java/android/view/InsetsAnimationControlImpl.java @@ -69,7 +69,7 @@ import java.util.Objects; * @hide */ @VisibleForTesting -public class InsetsAnimationControlImpl implements WindowInsetsAnimationController, +public class InsetsAnimationControlImpl implements InternalInsetsAnimationController, InsetsAnimationControlRunner { private static final String TAG = "InsetsAnimationCtrlImpl"; @@ -105,7 +105,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll private float mCurrentAlpha = 1.0f; private float mPendingAlpha = 1.0f; @VisibleForTesting(visibility = PACKAGE) - public boolean mReadyDispatched; + private boolean mReadyDispatched; private Boolean mPerceptible; @VisibleForTesting @@ -170,6 +170,11 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll } @Override + public void setReadyDispatched(boolean dispatched) { + mReadyDispatched = dispatched; + } + + @Override public Insets getHiddenStateInsets() { return mHiddenInsets; } diff --git a/core/java/android/view/InsetsAnimationThreadControlRunner.java b/core/java/android/view/InsetsAnimationThreadControlRunner.java index 691e638f3669..fc97541bd34d 100644 --- a/core/java/android/view/InsetsAnimationThreadControlRunner.java +++ b/core/java/android/view/InsetsAnimationThreadControlRunner.java @@ -54,8 +54,8 @@ public class InsetsAnimationThreadControlRunner implements InsetsAnimationContro @Override @UiThread - public void startAnimation(InsetsAnimationControlImpl controller, - WindowInsetsAnimationControlListener listener, int types, + public <T extends InsetsAnimationControlRunner & InternalInsetsAnimationController> + void startAnimation(T runner, WindowInsetsAnimationControlListener listener, int types, WindowInsetsAnimation animation, Bounds bounds) { // Animation will be started in constructor already. } diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index acdaa52dafa4..adda721e00a4 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -205,6 +205,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private static final int ANIMATION_DURATION_FADE_IN_MS = 500; private static final int ANIMATION_DURATION_FADE_OUT_MS = 1500; + /** Visible for WindowManagerWrapper */ + public static final int ANIMATION_DURATION_RESIZE = 300; + private static final int ANIMATION_DELAY_DIM_MS = 500; private static final int ANIMATION_DURATION_SYNC_IME_MS = 285; @@ -235,6 +238,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private static final Interpolator FAST_OUT_LINEAR_IN_INTERPOLATOR = new PathInterpolator(0.4f, 0f, 1f, 1f); + /** Visible for WindowManagerWrapper */ + public static final Interpolator RESIZE_INTERPOLATOR = new LinearInterpolator(); + /** The amount IME will move up/down when animating in floating mode. */ private static final int FLOATING_IME_BOTTOM_INSET_DP = -80; @@ -288,9 +294,13 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation @VisibleForTesting public static final int ANIMATION_TYPE_USER = 2; + /** Running animation will resize insets */ + @VisibleForTesting + public static final int ANIMATION_TYPE_RESIZE = 3; + @Retention(RetentionPolicy.SOURCE) @IntDef(value = {ANIMATION_TYPE_NONE, ANIMATION_TYPE_SHOW, ANIMATION_TYPE_HIDE, - ANIMATION_TYPE_USER}) + ANIMATION_TYPE_USER, ANIMATION_TYPE_RESIZE}) @interface AnimationType { } @@ -320,7 +330,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private final boolean mDisable; private final int mFloatingImeBottomInset; - private ThreadLocal<AnimationHandler> mSfAnimationHandlerThreadLocal = + private final ThreadLocal<AnimationHandler> mSfAnimationHandlerThreadLocal = new ThreadLocal<AnimationHandler>() { @Override protected AnimationHandler initialValue() { @@ -550,7 +560,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private final SparseArray<InsetsSourceControl> mTmpControlArray = new SparseArray<>(); private final ArrayList<RunningAnimation> mRunningAnimations = new ArrayList<>(); - private final ArrayList<InsetsAnimationControlImpl> mTmpFinishedControls = new ArrayList<>(); private final ArraySet<InsetsSourceConsumer> mRequestedVisibilityChanged = new ArraySet<>(); private WindowInsets mLastInsets; @@ -570,7 +579,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private int mCaptionInsetsHeight = 0; private boolean mAnimationsDisabled; - private Runnable mPendingControlTimeout = this::abortPendingImeControlRequest; + private final Runnable mPendingControlTimeout = this::abortPendingImeControlRequest; private final ArrayList<OnControllableInsetsChangedListener> mControllableInsetsChangedListeners = new ArrayList<>(); @@ -580,7 +589,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation /** Set of inset types which cannot be controlled by the user animation */ private @InsetsType int mDisabledUserAnimationInsetsTypes; - private Runnable mInvokeControllableInsetsChangedListeners = + private final Runnable mInvokeControllableInsetsChangedListeners = this::invokeControllableInsetsChangedListeners; public InsetsController(Host host) { @@ -608,23 +617,23 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } final List<WindowInsetsAnimation> runningAnimations = new ArrayList<>(); + final List<WindowInsetsAnimation> finishedAnimations = new ArrayList<>(); final InsetsState state = new InsetsState(mState, true /* copySources */); for (int i = mRunningAnimations.size() - 1; i >= 0; i--) { RunningAnimation runningAnimation = mRunningAnimations.get(i); if (DEBUG) Log.d(TAG, "Running animation type: " + runningAnimation.type); - InsetsAnimationControlRunner runner = runningAnimation.runner; - if (runner instanceof InsetsAnimationControlImpl) { - InsetsAnimationControlImpl control = (InsetsAnimationControlImpl) runner; + final InsetsAnimationControlRunner runner = runningAnimation.runner; + if (runner instanceof WindowInsetsAnimationController) { // Keep track of running animation to be dispatched. Aggregate it here such that // if it gets finished within applyChangeInsets we still dispatch it to // onProgress. if (runningAnimation.startDispatched) { - runningAnimations.add(control.getAnimation()); + runningAnimations.add(runner.getAnimation()); } - if (control.applyChangeInsets(state)) { - mTmpFinishedControls.add(control); + if (((InternalInsetsAnimationController) runner).applyChangeInsets(state)) { + finishedAnimations.add(runner.getAnimation()); } } } @@ -642,10 +651,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } } - for (int i = mTmpFinishedControls.size() - 1; i >= 0; i--) { - dispatchAnimationEnd(mTmpFinishedControls.get(i).getAnimation()); + for (int i = finishedAnimations.size() - 1; i >= 0; i--) { + dispatchAnimationEnd(finishedAnimations.get(i)); } - mTmpFinishedControls.clear(); }; } @@ -691,15 +699,13 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation true /* excludeInvisibleIme */)) { if (DEBUG) Log.d(TAG, "onStateChanged, notifyInsetsChanged"); mHost.notifyInsetsChanged(); + startResizingAnimationIfNeeded(lastState); } return true; } private void updateState(InsetsState newState) { - mState.setDisplayFrame(newState.getDisplayFrame()); - mState.setDisplayCutout(newState.getDisplayCutout()); - mState.setRoundedCorners(newState.getRoundedCorners()); - mState.setPrivacyIndicatorBounds(newState.getPrivacyIndicatorBounds()); + mState.set(newState, 0 /* types */); @InsetsType int disabledUserAnimationTypes = 0; @InsetsType int[] cancelledUserAnimationTypes = {0}; for (@InternalInsetsType int type = 0; type < InsetsState.SIZE; type++) { @@ -764,6 +770,39 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation return false; } + private void startResizingAnimationIfNeeded(InsetsState fromState) { + if (!fromState.getDisplayFrame().equals(mState.getDisplayFrame())) { + return; + } + @InsetsType int types = 0; + InsetsState toState = null; + final ArraySet<Integer> internalTypes = InsetsState.toInternalType(Type.systemBars()); + for (int i = internalTypes.size() - 1; i >= 0; i--) { + final @InternalInsetsType int type = internalTypes.valueAt(i); + final InsetsSource fromSource = fromState.peekSource(type); + final InsetsSource toSource = mState.peekSource(type); + if (fromSource != null && toSource != null + && fromSource.isVisible() && toSource.isVisible() + && !fromSource.getFrame().equals(toSource.getFrame()) + && (Rect.intersects(mFrame, fromSource.getFrame()) + || Rect.intersects(mFrame, toSource.getFrame()))) { + types |= InsetsState.toPublicType(toSource.getType()); + if (toState == null) { + toState = new InsetsState(); + } + toState.addSource(new InsetsSource(toSource)); + } + } + if (types == 0) { + return; + } + cancelExistingControllers(types); + final InsetsAnimationControlRunner runner = new InsetsResizeAnimationRunner( + mFrame, fromState, toState, RESIZE_INTERPOLATOR, ANIMATION_DURATION_RESIZE, types, + this); + mRunningAnimations.add(new RunningAnimation(runner, runner.getAnimationType())); + } + /** * @see InsetsState#calculateInsets */ @@ -785,7 +824,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation /** * @see InsetsState#calculateVisibleInsets(Rect, int) */ - public Rect calculateVisibleInsets(@SoftInputModeFlags int softInputMode) { + public Insets calculateVisibleInsets(@SoftInputModeFlags int softInputMode) { return mState.calculateVisibleInsets(mFrame, softInputMode); } @@ -1474,12 +1513,12 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation @VisibleForTesting @Override - public void startAnimation(InsetsAnimationControlImpl controller, - WindowInsetsAnimationControlListener listener, int types, + public <T extends InsetsAnimationControlRunner & InternalInsetsAnimationController> + void startAnimation(T runner, WindowInsetsAnimationControlListener listener, int types, WindowInsetsAnimation animation, Bounds bounds) { mHost.dispatchWindowInsetsAnimationPrepare(animation); mHost.addOnPreDrawRunnable(() -> { - if (controller.isCancelled()) { + if (runner.isCancelled()) { if (WARN) Log.w(TAG, "startAnimation canceled before preDraw"); return; } @@ -1487,15 +1526,15 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation "InsetsAnimation: " + WindowInsets.Type.toString(types), types); for (int i = mRunningAnimations.size() - 1; i >= 0; i--) { RunningAnimation runningAnimation = mRunningAnimations.get(i); - if (runningAnimation.runner == controller) { + if (runningAnimation.runner == runner) { runningAnimation.startDispatched = true; } } Trace.asyncTraceEnd(TRACE_TAG_VIEW, "IC.pendingAnim", 0); mHost.dispatchWindowInsetsAnimationStart(animation, bounds); mStartingAnimation = true; - controller.mReadyDispatched = true; - listener.onReady(controller, types); + runner.setReadyDispatched(true); + listener.onReady(runner, types); mStartingAnimation = false; }); } diff --git a/core/java/android/view/InsetsResizeAnimationRunner.java b/core/java/android/view/InsetsResizeAnimationRunner.java new file mode 100644 index 000000000000..e1352dd8dd4f --- /dev/null +++ b/core/java/android/view/InsetsResizeAnimationRunner.java @@ -0,0 +1,235 @@ +/* + * 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.view; + +import static android.view.InsetsAnimationControlImplProto.CURRENT_ALPHA; +import static android.view.InsetsAnimationControlImplProto.IS_CANCELLED; +import static android.view.InsetsAnimationControlImplProto.IS_FINISHED; +import static android.view.InsetsAnimationControlImplProto.PENDING_ALPHA; +import static android.view.InsetsAnimationControlImplProto.PENDING_FRACTION; +import static android.view.InsetsAnimationControlImplProto.PENDING_INSETS; +import static android.view.InsetsAnimationControlImplProto.SHOWN_ON_FINISH; +import static android.view.InsetsAnimationControlImplProto.TMP_MATRIX; +import static android.view.InsetsController.ANIMATION_TYPE_RESIZE; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.graphics.Insets; +import android.graphics.Rect; +import android.util.SparseArray; +import android.util.proto.ProtoOutputStream; +import android.view.InsetsState.InternalInsetsType; +import android.view.WindowInsets.Type.InsetsType; +import android.view.WindowInsetsAnimation.Bounds; +import android.view.animation.Interpolator; + +/** + * Runs a fake animation of resizing insets to produce insets animation callbacks. + * @hide + */ +public class InsetsResizeAnimationRunner implements InsetsAnimationControlRunner, + InternalInsetsAnimationController, WindowInsetsAnimationControlListener { + + private final InsetsState mFromState; + private final InsetsState mToState; + private final @InsetsType int mTypes; + private final WindowInsetsAnimation mAnimation; + private final InsetsAnimationControlCallbacks mController; + private ValueAnimator mAnimator; + private boolean mCancelled; + private boolean mFinished; + + public InsetsResizeAnimationRunner(Rect frame, InsetsState fromState, InsetsState toState, + Interpolator interpolator, long duration, @InsetsType int types, + InsetsAnimationControlCallbacks controller) { + mFromState = fromState; + mToState = toState; + mTypes = types; + mController = controller; + mAnimation = new WindowInsetsAnimation(types, interpolator, duration); + mAnimation.setAlpha(1f); + final Insets fromInsets = fromState.calculateInsets( + frame, types, false /* ignoreVisibility */); + final Insets toInsets = toState.calculateInsets( + frame, types, false /* ignoreVisibility */); + controller.startAnimation(this, this, types, mAnimation, + new Bounds(Insets.min(fromInsets, toInsets), Insets.max(fromInsets, toInsets))); + } + + @Override + public int getTypes() { + return mTypes; + } + + @Override + public int getControllingTypes() { + return mTypes; + } + + @Override + public WindowInsetsAnimation getAnimation() { + return mAnimation; + } + + @Override + public int getAnimationType() { + return ANIMATION_TYPE_RESIZE; + } + + @Override + public void cancel() { + if (mCancelled || mFinished) { + return; + } + mCancelled = true; + if (mAnimator != null) { + mAnimator.cancel(); + } + } + + @Override + public boolean isCancelled() { + return mCancelled; + } + + @Override + public void onReady(WindowInsetsAnimationController controller, int types) { + if (mCancelled) { + return; + } + mAnimator = ValueAnimator.ofFloat(0f, 1f); + mAnimator.setDuration(mAnimation.getDurationMillis()); + mAnimator.addUpdateListener(animation -> { + mAnimation.setFraction(animation.getAnimatedFraction()); + mController.scheduleApplyChangeInsets(InsetsResizeAnimationRunner.this); + }); + mAnimator.addListener(new AnimatorListenerAdapter() { + + @Override + public void onAnimationEnd(Animator animation) { + mFinished = true; + mController.scheduleApplyChangeInsets(InsetsResizeAnimationRunner.this); + } + }); + mAnimator.start(); + } + + @Override + public boolean applyChangeInsets(InsetsState outState) { + final float fraction = mAnimation.getInterpolatedFraction(); + for (@InternalInsetsType int type = 0; type < InsetsState.SIZE; type++) { + final InsetsSource fromSource = mFromState.peekSource(type); + final InsetsSource toSource = mToState.peekSource(type); + if (fromSource == null || toSource == null) { + continue; + } + final Rect fromFrame = fromSource.getFrame(); + final Rect toFrame = toSource.getFrame(); + final Rect frame = new Rect( + (int) (fromFrame.left + fraction * (toFrame.left - fromFrame.left)), + (int) (fromFrame.top + fraction * (toFrame.top - fromFrame.top)), + (int) (fromFrame.right + fraction * (toFrame.right - fromFrame.right)), + (int) (fromFrame.bottom + fraction * (toFrame.bottom - fromFrame.bottom))); + final InsetsSource source = new InsetsSource(type); + source.setFrame(frame); + source.setVisible(toSource.isVisible()); + outState.addSource(source); + } + if (mFinished) { + mController.notifyFinished(this, true /* shown */); + } + return mFinished; + } + + @Override + public void dumpDebug(ProtoOutputStream proto, long fieldId) { + final long token = proto.start(fieldId); + proto.write(IS_CANCELLED, mCancelled); + proto.write(IS_FINISHED, mFinished); + proto.write(TMP_MATRIX, "null"); + proto.write(PENDING_INSETS, "null"); + proto.write(PENDING_FRACTION, mAnimation.getInterpolatedFraction()); + proto.write(SHOWN_ON_FINISH, true); + proto.write(CURRENT_ALPHA, 1f); + proto.write(PENDING_ALPHA, 1f); + proto.end(token); + } + + @Override + public Insets getHiddenStateInsets() { + return Insets.NONE; + } + + @Override + public Insets getShownStateInsets() { + return Insets.NONE; + } + + @Override + public Insets getCurrentInsets() { + return Insets.NONE; + } + + @Override + public float getCurrentFraction() { + return 0; + } + + @Override + public float getCurrentAlpha() { + return 0; + } + + @Override + public void setInsetsAndAlpha(Insets insets, float alpha, float fraction) { + } + + @Override + public void finish(boolean shown) { + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public void notifyControlRevoked(int types) { + } + + @Override + public void updateSurfacePosition(SparseArray<InsetsSourceControl> controls) { + } + + @Override + public boolean hasZeroInsetsIme() { + return false; + } + + @Override + public void setReadyDispatched(boolean dispatched) { + } + + @Override + public void onFinished(WindowInsetsAnimationController controller) { + } + + @Override + public void onCancelled(WindowInsetsAnimationController controller) { + } +} diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java index f4444a145bf4..75b69cb12d32 100644 --- a/core/java/android/view/InsetsState.java +++ b/core/java/android/view/InsetsState.java @@ -301,7 +301,7 @@ public class InsetsState implements Parcelable { return mPrivacyIndicatorBounds.inset(insetLeft, insetTop, insetRight, insetBottom); } - public Rect calculateInsets(Rect frame, @InsetsType int types, boolean ignoreVisibility) { + public Insets calculateInsets(Rect frame, @InsetsType int types, boolean ignoreVisibility) { Insets insets = Insets.NONE; for (int type = FIRST_TYPE; type <= LAST_TYPE; type++) { InsetsSource source = mSources[type]; @@ -314,10 +314,10 @@ public class InsetsState implements Parcelable { } insets = Insets.max(source.calculateInsets(frame, ignoreVisibility), insets); } - return insets.toRect(); + return insets; } - public Rect calculateVisibleInsets(Rect frame, @SoftInputModeFlags int softInputMode) { + public Insets calculateVisibleInsets(Rect frame, @SoftInputModeFlags int softInputMode) { Insets insets = Insets.NONE; for (int type = FIRST_TYPE; type <= LAST_TYPE; type++) { InsetsSource source = mSources[type]; @@ -332,7 +332,7 @@ public class InsetsState implements Parcelable { } insets = Insets.max(source.calculateVisibleInsets(frame), insets); } - return insets.toRect(); + return insets; } /** diff --git a/core/java/android/view/InternalInsetsAnimationController.java b/core/java/android/view/InternalInsetsAnimationController.java new file mode 100644 index 000000000000..d7f3e20b80c5 --- /dev/null +++ b/core/java/android/view/InternalInsetsAnimationController.java @@ -0,0 +1,41 @@ +/* + * 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.view; + +/** + * An internal interface which provides methods that will be only used by the framework. + * @hide + */ +public interface InternalInsetsAnimationController extends WindowInsetsAnimationController { + + /** + * Flags whether {@link WindowInsetsAnimationControlListener#onReady( + * WindowInsetsAnimationController, int)} has been invoked. + * @hide + */ + void setReadyDispatched(boolean dispatched); + + /** + * Returns the {@link InsetsState} based on the current animation progress. + * + * @param outState the insets state which matches the current animation progress. + * @return {@code true} if the animation has been finished; {@code false} otherwise. + * @hide + */ + boolean applyChangeInsets(InsetsState outState); +} + diff --git a/core/java/android/view/RemoteAnimationTarget.java b/core/java/android/view/RemoteAnimationTarget.java index bd68401e6534..3f71d4d837a1 100644 --- a/core/java/android/view/RemoteAnimationTarget.java +++ b/core/java/android/view/RemoteAnimationTarget.java @@ -233,7 +233,7 @@ public class RemoteAnimationTarget implements Parcelable { this.clipRect = new Rect(clipRect); this.contentInsets = new Rect(contentInsets); this.prefixOrderIndex = prefixOrderIndex; - this.position = new Point(position); + this.position = position == null ? new Point() : new Point(position); this.localBounds = new Rect(localBounds); this.sourceContainerBounds = new Rect(screenSpaceBounds); this.screenSpaceBounds = new Rect(screenSpaceBounds); diff --git a/core/java/android/view/RoundedCorners.java b/core/java/android/view/RoundedCorners.java index 623d9692ac80..6079d8e3f118 100644 --- a/core/java/android/view/RoundedCorners.java +++ b/core/java/android/view/RoundedCorners.java @@ -27,9 +27,11 @@ import static android.view.Surface.ROTATION_90; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.res.Resources; +import android.content.res.TypedArray; import android.graphics.Point; import android.os.Parcel; import android.os.Parcelable; +import android.util.DisplayUtils; import android.util.Pair; import android.view.RoundedCorner.Position; @@ -94,8 +96,8 @@ public class RoundedCorners implements Parcelable { * @android:dimen/rounded_corner_radius_top and @android:dimen/rounded_corner_radius_bottom */ public static RoundedCorners fromResources( - Resources res, int displayWidth, int displayHeight) { - return fromRadii(loadRoundedCornerRadii(res), displayWidth, displayHeight); + Resources res, String displayUniqueId, int displayWidth, int displayHeight) { + return fromRadii(loadRoundedCornerRadii(res, displayUniqueId), displayWidth, displayHeight); } /** @@ -140,14 +142,16 @@ public class RoundedCorners implements Parcelable { * Loads the rounded corner radii from resources. * * @param res + * @param displayUniqueId the display unique id. * @return a Pair of radius. The first is the top rounded corner radius and second is the * bottom corner radius. */ @Nullable - private static Pair<Integer, Integer> loadRoundedCornerRadii(Resources res) { - final int radiusDefault = res.getDimensionPixelSize(R.dimen.rounded_corner_radius); - final int radiusTop = res.getDimensionPixelSize(R.dimen.rounded_corner_radius_top); - final int radiusBottom = res.getDimensionPixelSize(R.dimen.rounded_corner_radius_bottom); + private static Pair<Integer, Integer> loadRoundedCornerRadii( + Resources res, String displayUniqueId) { + final int radiusDefault = getRoundedCornerRadius(res, displayUniqueId); + final int radiusTop = getRoundedCornerTopRadius(res, displayUniqueId); + final int radiusBottom = getRoundedCornerBottomRadius(res, displayUniqueId); if (radiusDefault == 0 && radiusTop == 0 && radiusBottom == 0) { return null; } @@ -158,6 +162,164 @@ public class RoundedCorners implements Parcelable { } /** + * Gets the default rounded corner radius of a display which is determined by the + * given display unique id. + * + * Loads the default dimen{@link R.dimen#rounded_corner_radius} if + * {@link R.array#config_displayUniqueIdArray} is not set. + * + * @hide + */ + public static int getRoundedCornerRadius(Resources res, String displayUniqueId) { + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); + final TypedArray array = res.obtainTypedArray(R.array.config_roundedCornerRadiusArray); + int radius; + if (index >= 0 && index < array.length()) { + radius = array.getDimensionPixelSize(index, 0); + } else { + radius = res.getDimensionPixelSize(R.dimen.rounded_corner_radius); + } + array.recycle(); + return radius; + } + + /** + * Gets the top rounded corner radius of a display which is determined by the + * given display unique id. + * + * Loads the default dimen{@link R.dimen#rounded_corner_radius_top} if + * {@link R.array#config_displayUniqueIdArray} is not set. + * + * @hide + */ + public static int getRoundedCornerTopRadius(Resources res, String displayUniqueId) { + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); + final TypedArray array = res.obtainTypedArray(R.array.config_roundedCornerTopRadiusArray); + int radius; + if (index >= 0 && index < array.length()) { + radius = array.getDimensionPixelSize(index, 0); + } else { + radius = res.getDimensionPixelSize(R.dimen.rounded_corner_radius_top); + } + array.recycle(); + return radius; + } + + /** + * Gets the bottom rounded corner radius of a display which is determined by the + * given display unique id. + * + * Loads the default dimen{@link R.dimen#rounded_corner_radius_bottom} if + * {@link R.array#config_displayUniqueIdArray} is not set. + * + * @hide + */ + public static int getRoundedCornerBottomRadius(Resources res, String displayUniqueId) { + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); + final TypedArray array = res.obtainTypedArray( + R.array.config_roundedCornerBottomRadiusArray); + int radius; + if (index >= 0 && index < array.length()) { + radius = array.getDimensionPixelSize(index, 0); + } else { + radius = res.getDimensionPixelSize(R.dimen.rounded_corner_radius_bottom); + } + array.recycle(); + return radius; + } + + /** + * Gets the rounded corner radius adjustment of a display which is determined by the + * given display unique id. + * + * Loads the default dimen{@link R.dimen#rounded_corner_radius_adjustment} if + * {@link R.array#config_displayUniqueIdArray} is not set. + * + * @hide + */ + public static int getRoundedCornerRadiusAdjustment(Resources res, String displayUniqueId) { + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); + final TypedArray array = res.obtainTypedArray( + R.array.config_roundedCornerRadiusAdjustmentArray); + int radius; + if (index >= 0 && index < array.length()) { + radius = array.getDimensionPixelSize(index, 0); + } else { + radius = res.getDimensionPixelSize(R.dimen.rounded_corner_radius_adjustment); + } + array.recycle(); + return radius; + } + + /** + * Gets the rounded corner top radius adjustment of a display which is determined by the + * given display unique id. + * + * Loads the default dimen{@link R.dimen#rounded_corner_radius_top_adjustment} if + * {@link R.array#config_displayUniqueIdArray} is not set. + * + * @hide + */ + public static int getRoundedCornerRadiusTopAdjustment(Resources res, String displayUniqueId) { + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); + final TypedArray array = res.obtainTypedArray( + R.array.config_roundedCornerTopRadiusAdjustmentArray); + int radius; + if (index >= 0 && index < array.length()) { + radius = array.getDimensionPixelSize(index, 0); + } else { + radius = res.getDimensionPixelSize(R.dimen.rounded_corner_radius_top_adjustment); + } + array.recycle(); + return radius; + } + + /** + * Gets the rounded corner bottom radius adjustment of a display which is determined by the + * given display unique id. + * + * Loads the default dimen{@link R.dimen#rounded_corner_radius_bottom_adjustment} if + * {@link R.array#config_displayUniqueIdArray} is not set. + * + * @hide + */ + public static int getRoundedCornerRadiusBottomAdjustment( + Resources res, String displayUniqueId) { + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); + final TypedArray array = res.obtainTypedArray( + R.array.config_roundedCornerBottomRadiusAdjustmentArray); + int radius; + if (index >= 0 && index < array.length()) { + radius = array.getDimensionPixelSize(index, 0); + } else { + radius = res.getDimensionPixelSize(R.dimen.rounded_corner_radius_bottom_adjustment); + } + array.recycle(); + return radius; + } + + /** + * Gets whether a built-in display is round. + * + * Loads the default config{@link R.bool#config_mainBuiltInDisplayIsRound} if + * {@link R.array#config_displayUniqueIdArray} is not set. + * + * @hide + */ + public static boolean getBuiltInDisplayIsRound(Resources res, String displayUniqueId) { + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); + final TypedArray array = res.obtainTypedArray(R.array.config_builtInDisplayIsRoundArray); + boolean isRound; + if (index >= 0 && index < array.length()) { + isRound = array.getBoolean(index, false); + } else { + isRound = res.getBoolean(R.bool.config_mainBuiltInDisplayIsRound); + } + array.recycle(); + return isRound; + } + + /** * Insets the reference frame of the rounded corners. * * @return a copy of this instance which has been inset diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index aaf53ee1cfc1..904aa73f6ac4 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -99,6 +99,7 @@ public class Surface implements Parcelable { private static native int nativeSetFrameRate( long nativeObject, float frameRate, int compatibility, int changeFrameRateStrategy); + private static native void nativeDestroy(long nativeObject); public static final @android.annotation.NonNull Parcelable.Creator<Surface> CREATOR = new Parcelable.Creator<Surface>() { @@ -340,6 +341,9 @@ public class Surface implements Parcelable { */ @UnsupportedAppUsage public void destroy() { + if (mNativeObject != 0) { + nativeDestroy(mNativeObject); + } release(); } diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index a4e7a43cc934..51910e09735d 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -903,7 +903,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mSurfaceAlpha = 1f; synchronized (mSurfaceControlLock) { - mSurface.release(); + mSurface.destroy(); if (mBlastBufferQueue != null) { mBlastBufferQueue.destroy(); mBlastBufferQueue = null; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 04d65c094bf3..4c36fc939c34 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2467,7 +2467,7 @@ public final class ViewRootImpl implements ViewParent, mAttachInfo.mContentInsets.set(mLastWindowInsets.getSystemWindowInsets().toRect()); mAttachInfo.mStableInsets.set(mLastWindowInsets.getStableInsets().toRect()); mAttachInfo.mVisibleInsets.set(mInsetsController.calculateVisibleInsets( - mWindowAttributes.softInputMode)); + mWindowAttributes.softInputMode).toRect()); } return mLastWindowInsets; } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index f57e5209f5a4..3ce3fabbd6fe 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -3531,6 +3531,14 @@ public interface WindowManager extends ViewManager { public Insets providedInternalInsets = Insets.NONE; /** + * If specified, the insets provided by this window for the IME will be our window frame + * minus the insets specified by providedInternalImeInsets. + * + * @hide + */ + public Insets providedInternalImeInsets = Insets.NONE; + + /** * {@link LayoutParams} to be applied to the window when layout with a assigned rotation. * This will make layout during rotation change smoothly. * @@ -3904,6 +3912,7 @@ public interface WindowManager extends ViewManager { out.writeInt(0); } providedInternalInsets.writeToParcel(out, 0 /* parcelableFlags */); + providedInternalImeInsets.writeToParcel(out, 0 /* parcelableFlags */); if (paramsForRotation != null) { checkNonRecursiveParams(); out.writeInt(paramsForRotation.length); @@ -3983,6 +3992,7 @@ public interface WindowManager extends ViewManager { in.readIntArray(providesInsetsTypes); } providedInternalInsets = Insets.CREATOR.createFromParcel(in); + providedInternalImeInsets = Insets.CREATOR.createFromParcel(in); int paramsForRotationLength = in.readInt(); if (paramsForRotationLength > 0) { paramsForRotation = new LayoutParams[paramsForRotationLength]; @@ -4289,6 +4299,11 @@ public interface WindowManager extends ViewManager { changes |= LAYOUT_CHANGED; } + if (!providedInternalImeInsets.equals(o.providedInternalImeInsets)) { + providedInternalImeInsets = o.providedInternalImeInsets; + changes |= LAYOUT_CHANGED; + } + if (!Arrays.equals(paramsForRotation, o.paramsForRotation)) { paramsForRotation = o.paramsForRotation; checkNonRecursiveParams(); @@ -4494,6 +4509,10 @@ public interface WindowManager extends ViewManager { sb.append(" providedInternalInsets="); sb.append(providedInternalInsets); } + if (!providedInternalImeInsets.equals(Insets.NONE)) { + sb.append(" providedInternalImeInsets="); + sb.append(providedInternalImeInsets); + } if (paramsForRotation != null && paramsForRotation.length != 0) { sb.append(System.lineSeparator()); sb.append(prefix).append(" paramsForRotation="); diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 91fc5a56d979..fe5eb085dc5c 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -740,6 +740,16 @@ public class RemoteViews implements Parcelable, Filter { } @Override + public UserHandle getUser() { + return mContextForResources.getUser(); + } + + @Override + public int getUserId() { + return mContextForResources.getUserId(); + } + + @Override public boolean isRestricted() { // Override isRestricted and direct to resource's implementation. The isRestricted is // used for determining the risky resources loading, e.g. fonts, thus direct to context diff --git a/core/java/android/window/RemoteTransition.aidl b/core/java/android/window/RemoteTransition.aidl new file mode 100644 index 000000000000..f3c3f54410ed --- /dev/null +++ b/core/java/android/window/RemoteTransition.aidl @@ -0,0 +1,19 @@ +/* + * 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.window; + +parcelable RemoteTransition; diff --git a/core/java/android/window/RemoteTransition.java b/core/java/android/window/RemoteTransition.java new file mode 100644 index 000000000000..b243b656b8cd --- /dev/null +++ b/core/java/android/window/RemoteTransition.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 android.window; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.os.IBinder; +import android.os.Parcelable; + +import com.android.internal.util.DataClass; + +/** + * Represents a remote transition animation and information required to run it (eg. the app thread + * that needs to be boosted). + * @hide + */ +@DataClass(genToString = true, genSetters = true, genAidl = true) +public class RemoteTransition implements Parcelable { + + /** The actual remote-transition interface used to run the transition animation. */ + private @NonNull IRemoteTransition mRemoteTransition; + + /** Get the IBinder associated with the underlying IRemoteTransition. */ + public @Nullable IBinder asBinder() { + return mRemoteTransition.asBinder(); + } + + + + // Code below generated by codegen v1.0.23. + // + // DO NOT MODIFY! + // CHECKSTYLE:OFF Generated code + // + // To regenerate run: + // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/window/RemoteTransition.java + // + // To exclude the generated code from IntelliJ auto-formatting enable (one-time): + // Settings > Editor > Code Style > Formatter Control + //@formatter:off + + + /** + * Creates a new RemoteTransition. + * + * @param remoteTransition + * The actual remote-transition interface used to run the transition animation. + */ + @DataClass.Generated.Member + public RemoteTransition( + @NonNull IRemoteTransition remoteTransition) { + this.mRemoteTransition = remoteTransition; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mRemoteTransition); + + // onConstructed(); // You can define this method to get a callback + } + + /** + * The actual remote-transition interface used to run the transition animation. + */ + @DataClass.Generated.Member + public @NonNull IRemoteTransition getRemoteTransition() { + return mRemoteTransition; + } + + /** + * The actual remote-transition interface used to run the transition animation. + */ + @DataClass.Generated.Member + public @NonNull RemoteTransition setRemoteTransition(@NonNull IRemoteTransition value) { + mRemoteTransition = value; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mRemoteTransition); + return this; + } + + @Override + @DataClass.Generated.Member + public String toString() { + // You can override field toString logic by defining methods like: + // String fieldNameToString() { ... } + + return "RemoteTransition { " + + "remoteTransition = " + mRemoteTransition + + " }"; + } + + @Override + @DataClass.Generated.Member + public void writeToParcel(@NonNull android.os.Parcel dest, int flags) { + // You can override field parcelling by defining methods like: + // void parcelFieldName(Parcel dest, int flags) { ... } + + dest.writeStrongInterface(mRemoteTransition); + } + + @Override + @DataClass.Generated.Member + public int describeContents() { return 0; } + + /** @hide */ + @SuppressWarnings({"unchecked", "RedundantCast"}) + @DataClass.Generated.Member + protected RemoteTransition(@NonNull android.os.Parcel in) { + // You can override field unparcelling by defining methods like: + // static FieldType unparcelFieldName(Parcel in) { ... } + + IRemoteTransition remoteTransition = IRemoteTransition.Stub.asInterface(in.readStrongBinder()); + + this.mRemoteTransition = remoteTransition; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mRemoteTransition); + + // onConstructed(); // You can define this method to get a callback + } + + @DataClass.Generated.Member + public static final @NonNull Parcelable.Creator<RemoteTransition> CREATOR + = new Parcelable.Creator<RemoteTransition>() { + @Override + public RemoteTransition[] newArray(int size) { + return new RemoteTransition[size]; + } + + @Override + public RemoteTransition createFromParcel(@NonNull android.os.Parcel in) { + return new RemoteTransition(in); + } + }; + + @DataClass.Generated( + time = 1630613039043L, + codegenVersion = "1.0.23", + sourceFile = "frameworks/base/core/java/android/window/RemoteTransition.java", + inputSignatures = "private @android.annotation.NonNull android.window.IRemoteTransition mRemoteTransition\npublic @android.annotation.Nullable android.os.IBinder asBinder()\nclass RemoteTransition extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genAidl=true)") + @Deprecated + private void __metadata() {} + + + //@formatter:on + // End of generated code + +} diff --git a/core/java/android/window/TaskFragmentInfo.java b/core/java/android/window/TaskFragmentInfo.java index dac420b6190d..b55372b08b3a 100644 --- a/core/java/android/window/TaskFragmentInfo.java +++ b/core/java/android/window/TaskFragmentInfo.java @@ -55,8 +55,8 @@ public final class TaskFragmentInfo implements Parcelable { /** Whether the TaskFragment contains any child Window Container. */ private final boolean mIsEmpty; - /** Whether the TaskFragment contains any running Activity. */ - private final boolean mHasRunningActivity; + /** The number of the running activities in the TaskFragment. */ + private final int mRunningActivityCount; /** Whether this TaskFragment is visible on the window hierarchy. */ private final boolean mIsVisible; @@ -74,13 +74,13 @@ public final class TaskFragmentInfo implements Parcelable { /** @hide */ public TaskFragmentInfo( @NonNull IBinder fragmentToken, @NonNull WindowContainerToken token, - @NonNull Configuration configuration, boolean isEmpty, boolean hasRunningActivity, + @NonNull Configuration configuration, boolean isEmpty, int runningActivityCount, boolean isVisible, @NonNull List<IBinder> activities, @NonNull Point positionInParent) { mFragmentToken = requireNonNull(fragmentToken); mToken = requireNonNull(token); mConfiguration.setTo(configuration); mIsEmpty = isEmpty; - mHasRunningActivity = hasRunningActivity; + mRunningActivityCount = runningActivityCount; mIsVisible = isVisible; mActivities.addAll(activities); mPositionInParent = requireNonNull(positionInParent); @@ -106,7 +106,11 @@ public final class TaskFragmentInfo implements Parcelable { } public boolean hasRunningActivity() { - return mHasRunningActivity; + return mRunningActivityCount > 0; + } + + public int getRunningActivityCount() { + return mRunningActivityCount; } public boolean isVisible() { @@ -141,7 +145,7 @@ public final class TaskFragmentInfo implements Parcelable { return mFragmentToken.equals(that.mFragmentToken) && mToken.equals(that.mToken) && mIsEmpty == that.mIsEmpty - && mHasRunningActivity == that.mHasRunningActivity + && mRunningActivityCount == that.mRunningActivityCount && mIsVisible == that.mIsVisible && getWindowingMode() == that.getWindowingMode() && mActivities.equals(that.mActivities) @@ -153,7 +157,7 @@ public final class TaskFragmentInfo implements Parcelable { mToken = in.readTypedObject(WindowContainerToken.CREATOR); mConfiguration.readFromParcel(in); mIsEmpty = in.readBoolean(); - mHasRunningActivity = in.readBoolean(); + mRunningActivityCount = in.readInt(); mIsVisible = in.readBoolean(); in.readBinderList(mActivities); mPositionInParent = requireNonNull(in.readTypedObject(Point.CREATOR)); @@ -166,7 +170,7 @@ public final class TaskFragmentInfo implements Parcelable { dest.writeTypedObject(mToken, flags); mConfiguration.writeToParcel(dest, flags); dest.writeBoolean(mIsEmpty); - dest.writeBoolean(mHasRunningActivity); + dest.writeInt(mRunningActivityCount); dest.writeBoolean(mIsVisible); dest.writeBinderList(mActivities); dest.writeTypedObject(mPositionInParent, flags); @@ -192,7 +196,7 @@ public final class TaskFragmentInfo implements Parcelable { + " fragmentToken=" + mFragmentToken + " token=" + mToken + " isEmpty=" + mIsEmpty - + " hasRunningActivity=" + mHasRunningActivity + + " runningActivityCount=" + mRunningActivityCount + " isVisible=" + mIsVisible + " positionInParent=" + mPositionInParent + "}"; diff --git a/core/java/android/window/TransitionRequestInfo.java b/core/java/android/window/TransitionRequestInfo.java index cc493ab63e22..f7707317efd7 100644 --- a/core/java/android/window/TransitionRequestInfo.java +++ b/core/java/android/window/TransitionRequestInfo.java @@ -40,11 +40,11 @@ public final class TransitionRequestInfo implements Parcelable { private @Nullable ActivityManager.RunningTaskInfo mTriggerTask; /** If non-null, a remote-transition associated with the source of this transition. */ - private @Nullable IRemoteTransition mRemoteTransition; + private @Nullable RemoteTransition mRemoteTransition; - // Code below generated by codegen v1.0.22. + // Code below generated by codegen v1.0.23. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -72,7 +72,7 @@ public final class TransitionRequestInfo implements Parcelable { public TransitionRequestInfo( @WindowManager.TransitionType int type, @Nullable ActivityManager.RunningTaskInfo triggerTask, - @Nullable IRemoteTransition remoteTransition) { + @Nullable RemoteTransition remoteTransition) { this.mType = type; com.android.internal.util.AnnotationValidations.validate( WindowManager.TransitionType.class, null, mType); @@ -103,7 +103,7 @@ public final class TransitionRequestInfo implements Parcelable { * If non-null, a remote-transition associated with the source of this transition. */ @DataClass.Generated.Member - public @Nullable IRemoteTransition getRemoteTransition() { + public @Nullable RemoteTransition getRemoteTransition() { return mRemoteTransition; } @@ -121,7 +121,7 @@ public final class TransitionRequestInfo implements Parcelable { * If non-null, a remote-transition associated with the source of this transition. */ @DataClass.Generated.Member - public @android.annotation.NonNull TransitionRequestInfo setRemoteTransition(@android.annotation.NonNull IRemoteTransition value) { + public @android.annotation.NonNull TransitionRequestInfo setRemoteTransition(@android.annotation.NonNull RemoteTransition value) { mRemoteTransition = value; return this; } @@ -151,7 +151,7 @@ public final class TransitionRequestInfo implements Parcelable { dest.writeByte(flg); dest.writeInt(mType); if (mTriggerTask != null) dest.writeTypedObject(mTriggerTask, flags); - if (mRemoteTransition != null) dest.writeStrongInterface(mRemoteTransition); + if (mRemoteTransition != null) dest.writeTypedObject(mRemoteTransition, flags); } @Override @@ -168,7 +168,7 @@ public final class TransitionRequestInfo implements Parcelable { byte flg = in.readByte(); int type = in.readInt(); ActivityManager.RunningTaskInfo triggerTask = (flg & 0x2) == 0 ? null : (ActivityManager.RunningTaskInfo) in.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR); - IRemoteTransition remoteTransition = (flg & 0x4) == 0 ? null : IRemoteTransition.Stub.asInterface(in.readStrongBinder()); + RemoteTransition remoteTransition = (flg & 0x4) == 0 ? null : (RemoteTransition) in.readTypedObject(RemoteTransition.CREATOR); this.mType = type; com.android.internal.util.AnnotationValidations.validate( @@ -194,10 +194,10 @@ public final class TransitionRequestInfo implements Parcelable { }; @DataClass.Generated( - time = 1610060387917L, - codegenVersion = "1.0.22", + time = 1629321632222L, + codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/window/TransitionRequestInfo.java", - inputSignatures = "private final @android.view.WindowManager.TransitionType int mType\nprivate @android.annotation.Nullable android.app.ActivityManager.RunningTaskInfo mTriggerTask\nprivate @android.annotation.Nullable android.window.IRemoteTransition mRemoteTransition\nclass TransitionRequestInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genAidl=true)") + inputSignatures = "private final @android.view.WindowManager.TransitionType int mType\nprivate @android.annotation.Nullable android.app.ActivityManager.RunningTaskInfo mTriggerTask\nprivate @android.annotation.Nullable android.window.RemoteTransition mRemoteTransition\nclass TransitionRequestInfo extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genSetters=true, genAidl=true)") @Deprecated private void __metadata() {} diff --git a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java index 52172cf04362..ec6283922807 100644 --- a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java +++ b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java @@ -16,7 +16,9 @@ package com.android.internal.policy; +import android.content.Context; import android.content.res.Resources; +import android.view.RoundedCorners; import com.android.internal.R; @@ -29,23 +31,28 @@ public class ScreenDecorationsUtils { * Corner radius that should be used on windows in order to cover the display. * These values are expressed in pixels because they should not respect display or font * scaling, this means that we don't have to reload them on config changes. + * + * Note that if the context is not an UI context(not associated with Display), it will use + * default display. */ - public static float getWindowCornerRadius(Resources resources) { + public static float getWindowCornerRadius(Context context) { + final Resources resources = context.getResources(); if (!supportsRoundedCornersOnWindows(resources)) { return 0f; } - + // Use Context#getDisplayNoVerify() in case the context is not an UI context. + final String displayUniqueId = context.getDisplayNoVerify().getUniqueId(); // Radius that should be used in case top or bottom aren't defined. - float defaultRadius = resources.getDimension(R.dimen.rounded_corner_radius) - - resources.getDimension(R.dimen.rounded_corner_radius_adjustment); + float defaultRadius = RoundedCorners.getRoundedCornerRadius(resources, displayUniqueId) + - RoundedCorners.getRoundedCornerRadiusAdjustment(resources, displayUniqueId); - float topRadius = resources.getDimension(R.dimen.rounded_corner_radius_top) - - resources.getDimension(R.dimen.rounded_corner_radius_top_adjustment); + float topRadius = RoundedCorners.getRoundedCornerTopRadius(resources, displayUniqueId) + - RoundedCorners.getRoundedCornerRadiusTopAdjustment(resources, displayUniqueId); if (topRadius == 0f) { topRadius = defaultRadius; } - float bottomRadius = resources.getDimension(R.dimen.rounded_corner_radius_bottom) - - resources.getDimension(R.dimen.rounded_corner_radius_bottom_adjustment); + float bottomRadius = RoundedCorners.getRoundedCornerBottomRadius(resources, displayUniqueId) + - RoundedCorners.getRoundedCornerRadiusBottomAdjustment(resources, displayUniqueId); if (bottomRadius == 0f) { bottomRadius = defaultRadius; } diff --git a/core/java/com/android/internal/protolog/ProtoLogImpl.java b/core/java/com/android/internal/protolog/ProtoLogImpl.java index 10224a4b9db6..353c6c083d9d 100644 --- a/core/java/com/android/internal/protolog/ProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/ProtoLogImpl.java @@ -28,7 +28,7 @@ import java.io.File; */ public class ProtoLogImpl extends BaseProtoLogImpl { private static final int BUFFER_CAPACITY = 1024 * 1024; - private static final String LOG_FILENAME = "/data/misc/wmtrace/wm_log.pb"; + private static final String LOG_FILENAME = "/data/misc/wmtrace/wm_log.winscope"; private static final String VIEWER_CONFIG_FILENAME = "/system/etc/protolog.conf.json.gz"; private static ProtoLogImpl sServiceInstance = null; diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 84a7f2f5ddf9..b427e8be142d 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -149,7 +149,7 @@ oneway interface IStatusBar */ void showAuthenticationDialog(in PromptInfo promptInfo, IBiometricSysuiReceiver sysuiReceiver, in int[] sensorIds, boolean credentialAllowed, boolean requireConfirmation, int userId, - String opPackageName, long operationId, int multiSensorConfig); + long operationId, String opPackageName, long requestId, int multiSensorConfig); /** * Used to notify the authentication dialog that a biometric has been authenticated. */ diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index e7d6d6cf8936..b3499db94c88 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -110,7 +110,8 @@ interface IStatusBarService // Used to show the authentication dialog (Biometrics, Device Credential) void showAuthenticationDialog(in PromptInfo promptInfo, IBiometricSysuiReceiver sysuiReceiver, in int[] sensorIds, boolean credentialAllowed, boolean requireConfirmation, - int userId, String opPackageName, long operationId, int multiSensorConfig); + int userId, long operationId, String opPackageName, long requestId, + int multiSensorConfig); // Used to notify the authentication dialog that a biometric has been authenticated void onBiometricAuthenticated(); diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 0957067de603..869b53df2837 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -449,6 +449,11 @@ static jint nativeSetFrameRate(JNIEnv* env, jclass clazz, jlong nativeObject, jf int(changeFrameRateStrategy)); } +static void nativeDestroy(JNIEnv* env, jclass clazz, jlong nativeObject) { + sp<Surface> surface(reinterpret_cast<Surface*>(nativeObject)); + surface->destroy(); +} + // ---------------------------------------------------------------------------- static const JNINativeMethod gSurfaceMethods[] = { @@ -477,6 +482,7 @@ static const JNINativeMethod gSurfaceMethods[] = { {"nativeSetAutoRefreshEnabled", "(JZ)I", (void*)nativeSetAutoRefreshEnabled}, {"nativeSetFrameRate", "(JFII)I", (void*)nativeSetFrameRate}, {"nativeGetFromBlastBufferQueue", "(JJ)J", (void*)nativeGetFromBlastBufferQueue}, + {"nativeDestroy", "(J)V", (void*)nativeDestroy}, }; int register_android_view_Surface(JNIEnv* env) diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index 6bc00e2281ef..83e26f66fd62 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -972,6 +972,7 @@ message GlobalSettingsProto { optional SettingProto usb_mass_storage_enabled = 127 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto use_google_mail = 128 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto use_open_wifi_package = 129 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto uwb_enabled = 155 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto vt_ims_enabled = 130 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto wait_for_debugger = 131 [ (android.privacy).dest = DEST_AUTOMATIC ]; @@ -1065,5 +1066,5 @@ message GlobalSettingsProto { // Please insert fields in alphabetical order and group them into messages // if possible (to avoid reaching the method limit). - // Next tag = 155; + // Next tag = 156; } diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 6946b3c07652..39cd64235f94 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Gebruik jou vingerafdruk of skermslot om voort te gaan"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Vingerafdrukikoon"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Gesigslot"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Kwessie met Gesigslot"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gebruik jou gesig of skermslot om voort te gaan"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Gesig-ikoon"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"lees sinkroniseer-instellings"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Laat die program toe om die sinkroniseringinstellings van \'n rekening te lees. Byvoorbeeld, dit kan bepaal of die People-program met \'n rekening gesinkroniseer is."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Wanneer die kortpad aan is, sal \'n toeganklikheidkenmerk begin word as albei volumeknoppies 3 sekondes lank gedruk word."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Skakel kortpad vir toeganklikheidskenmerke aan?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"As jy albei volumesleutels vir \'n paar sekondes hou, skakel dit toeganklikheidkenmerke aan. Dit kan verander hoe jou toestel werk.\n\nHuidige kenmerke:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nJy kan geselekteerde kenmerke in Instellings en Toeganklikheid verander."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Skakel <xliff:g id="SERVICE">%1$s</xliff:g>-kortpad aan?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"As jy albei volumesleutels vir \'n paar sekondes hou, skakel dit <xliff:g id="SERVICE">%1$s</xliff:g>, \'n toeganklikheidkenmerk, aan. Dit kan verander hoe jou toestel werk.\n\nJy kan hierdie kortpad na \'n ander kenmerk in Instellings en Toeganklikheid verander."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Skakel aan"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 9ab2f1939c84..c747497c4532 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"ለመቀጠል የጣት አሻራዎን ወይም የማያ ገጽ ቁልፍዎን ይጠቀሙ"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"የጣት አሻራ አዶ"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"በመልክ መክፈት"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"ከመልክ መክፈት ጋር በተያያዘ ችግር"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ለመቀጠል መልክዎን ወይም የማያ ገጽዎን መቆለፊያ ይጠቀሙ"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"የፊት አዶ"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"የሥምሪያ ቅንብሮች አንብብ"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"መተግበሪያው የአንድ መለያ የማመሳሰል ቅንብሮችን እንዲያነብ ይፈቅድለታል። ለምሳሌ ይህ የሰዎች መተግበሪያ ከመለያ ጋር መመሳሰሉን አለመመሳሰሉን ሊወስን ይችላል።"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"አቋራጩ ሲበራ ሁለቱንም የድምጽ አዝራሮች ለ3 ሰከንዶች ተጭኖ መቆየት የተደራሽነት ባህሪን ያስጀምረዋል።"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"የተደራሽነት ባህሪዎች አቋራጭ ይብራ?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"ሁለቱንም የድምፅ ቁልፎች ወደ ታች ለጥቂት ሰከንዶች መያዝ የተደራሽነት ባሕሪያትን ያበራል። ይህ የእርስዎ መሣሪያ እንዴት እንደሚሠራ ሊለውጥ ይችላል።\n\nየአሁን ባሕሪያት፦\n<xliff:g id="SERVICE">%1$s</xliff:g>\nበቅንብሮች > ተደራሽነት ውስጥ የተመረጡትን ባሕሪያት መለወጥ ይችላሉ።"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"የ<xliff:g id="SERVICE">%1$s</xliff:g> አቋራጭ ይብራ?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"ሁለቱንም የድምፅ ቁልፎች ወደ ታች ለጥቂት ሰከንዶች መያዝ የተደራሽነት ባሕሪያትን <xliff:g id="SERVICE">%1$s</xliff:g> ያበራል። ይህ የእርስዎ መሣሪያ እንዴት እንደሚሠራ ሊለውጥ ይችላል።\n\nበቅንብሮች > ተደራሽነት ውስጥ ወደ ሌላ ባሕሪ ይህን አቋራጭ መለወጥ ይችላሉ።"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"አብራ"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 14221dc5fb6b..c1c7a6163b68 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -621,6 +621,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"استخدام بصمة الإصبع أو قفل الشاشة للمتابعة"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"رمز بصمة الإصبع"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"فتح الجهاز بالتعرف على الوجه"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"مشكلة متعلّقة بميزة \"فتح الجهاز بالتعرف على الوجه\""</string> @@ -673,6 +675,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"استخدام ميزة \"فتح القفل بالوجه\" أو ميزة \"قفل الشاشة\" للمتابعة"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"رمز الوجه"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"قراءة إعدادات المزامنة"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"للسماح للتطبيق بقراءة الإعدادات المتزامنة لحساب ما. على سبيل المثال، يمكن أن يؤدي هذا إلى تحديد ما إذا تمت مزامنة تطبيق \"الأشخاص\" مع حساب ما."</string> @@ -1779,7 +1783,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"عند تفعيل الاختصار، يؤدي الضغط على زرّي التحكّم في مستوى الصوت معًا لمدة 3 ثوانٍ إلى تفعيل إحدى ميزات إمكانية الوصول."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"هل تريد تفعيل الاختصار لميزات إمكانية الوصول؟"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"يؤدي الضغط مع الاستمرار على كلا مفتاحَي التحكّم في مستوى الصوت لبضع ثوانٍ إلى تفعيل ميزات إمكانية الوصول. قد يؤدي هذا الإجراء إلى تغيير طريقة عمل جهازك.\n\nالميزات الحالية:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nيمكنك تغيير الميزات المحددة في الإعدادات > إمكانية الوصول."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"هل تريد تفعيل اختصار <xliff:g id="SERVICE">%1$s</xliff:g>؟"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"يؤدي الضغط مع الاستمرار لبضع ثوانٍ على كلا مفتاحَي التحكّم في مستوى الصوت إلى تفعيل <xliff:g id="SERVICE">%1$s</xliff:g> وهي إحدى ميزات إمكانية الوصول. يمكن أن يؤدي هذا الإجراء إلى تغيير كيفية عمل جهازك.\n\nيمكنك تغيير هذا الاختصار لاستخدامه مع ميزة أخرى في الإعدادات > أدوات تمكين الوصول."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"تفعيل"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 96403247a7f4..59f84ed544b6 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"অব্যাহত ৰাখিবলৈ আপোনাৰ ফিংগাৰপ্ৰিণ্ট অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ফিংগাৰপ্ৰিণ্ট আইকন"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"ফেচ আনলক"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"ফেচ আনলক ব্যৱহাৰ কৰোঁতে সমস্যা হৈছে"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"অব্যাহত ৰাখিবলৈ আপোনাৰ মুখাৱয়ব অথবা স্ক্ৰীন লক ব্যৱহাৰ কৰক"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"মুখমণ্ডলৰ আইকন"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ছিংকৰ ছেটিংসমূহ পঢ়ক"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"একাউণ্টৰ ছিংক ছেটিংবোৰ পঢ়িবলৈ এপক অনুমতি দিয়ে। যেনে, People এপ কোনো একাউণ্টত ছিংক কৰা হৈছে নে নাই সেয়া নির্ধাৰণ কৰিব পাৰে।"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"শ্বৰ্টকাটটো অন হৈ থকাৰ সময়ত দুয়োটা ভলিউম বুটাম ৩ ছেকেণ্ডৰ বাবে হেঁচি ধৰি ৰাখিলে এটা সাধ্য সুবিধা আৰম্ভ হ’ব।"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"সাধ্য সুবিধাসমূহৰ বাবে শ্বৰ্টকাট অন কৰিবনে?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"দুয়োটা ভলিউম কী কিছুসময়ৰ বাবে ধৰি থাকিলে সাধ্য-সুবিধাসমূহ অন কৰে। এইটোৱে আপোনাৰ ডিভাইচটোৱে কাম কৰাৰ ধৰণ সলনি কৰিব পাৰে।\n\nবর্তমানৰ সুবিধাসমূহ:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nআপুনি ছেটিংসমূহ > সাধ্য-সুবিধাত কিছুমান নিৰ্দিষ্ট সুবিধা সলনি কৰিব পাৰে।"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g>ৰ শ্বৰ্টকাট অন কৰিবনে?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"দুয়োটা ভলিউম কী কিছুসময়ৰ বাবে ধৰি থাকিলে এটা সাধ্য- সুবিধা <xliff:g id="SERVICE">%1$s</xliff:g> অন কৰে। এইটোৱে আপোনাৰ ডিভাইচটোৱে কাম কৰাৰ ধৰণ সলনি কৰিব পাৰে।\n\nআপুনি ছেটিংসমূহ > সাধ্য-সুবিধাসমূহত এই শ্বৰ্টকাটটো অন্য এটা সুবিধালৈ সলনি কৰিব পাৰে।"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"অন কৰক"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index bab05ad489b3..6cf045924772 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Davam etmək üçün barmaq izi və ya ekran kilidinizdən istifadə edin"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Barmaq izi ikonası"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Üz ilə kiliddən çıxarma"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Üz ilə kiliddən çıxarma problemi"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Davam etmək üçün üz və ya ekran kilidinizdən istifadə edin"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Üz işarəsi"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"sinx ayarlarını oxu"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Tətbiqə hesablar üçün sinxronizasiya nizamlarını oxuma icazəsi verir. Məsələn, bu Şəxslər tətbiqinin sinxronizə olunub-olunmadığını təyin edə bilər."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Qısayol aktiv olduqda, hər iki səs düyməsinə 3 saniyə basıb saxlamaqla əlçatımlılıq funksiyası başladılacaq."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Əlçatımlılıq funksiyaları üçün qısayol aktiv edilsin?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Hər iki səs səviyyəsi düyməsinə bir neçə saniyə basıb saxladıqda əlçatımlılıq funksiyaları aktiv olur. Cihazınızın işləmə qaydasını dəyişə bilər.\n\nCari funksiyalar:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nAyarlar və Əlçatımlılıq bölməsində seçilmiş funksiyaları dəyişə bilərsiniz."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> qısayolu aktiv edilsin?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Hər iki səs səviyyəsi düyməsinə bir neçə saniyə basıb saxladıqda əlçatımlılıq funksiyası olan <xliff:g id="SERVICE">%1$s</xliff:g> aktiv olur. Cihazınızın işləmə qaydasını dəyişə bilər.\n\nAyarlar və Əlçatımlılıq bölməsində bu qısayolu başqa bir funksiyaya dəyişə bilərsiniz."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Aktiv edin"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 4179ab03dac3..d333f99da0d6 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -612,6 +612,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Koristite otisak prsta ili zaključavanje ekrana da biste nastavili"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona otiska prsta"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Otključavanje licem"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problem sa otključavanje licem"</string> @@ -664,6 +666,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Koristite lice ili zaključavanje ekrana da biste nastavili"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ikona lica"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"čitanje podešavanja sinhronizacije"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Dozvoljava aplikaciji da čita podešavanja sinhronizacije za nalog. Na primer, ovako može da se utvrdi da li je aplikacija Ljudi sinhronizovana sa nalogom."</string> @@ -1713,7 +1717,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Kada je prečica uključena, pritisnite oba dugmeta za jačinu zvuka da biste pokrenuli funkciju pristupačnosti."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Želite da uključite prečicu za funkcije pristupačnosti?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Ako zadržite oba tastera za jačinu zvuka par sekundi, uključiće se funkcije pristupačnosti. To može da promeni način rada uređaja.\n\nPostojeće funkcije:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nMožete da promenite izabrane funkcije u odeljku Podešavanja > Pristupačnost."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Želite da uključite prečicu za uslugu <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Ako zadržite oba tastera za jačinu zvuka par sekundi, uključuje se <xliff:g id="SERVICE">%1$s</xliff:g>, funkcija pristupačnosti. To može da promeni način rada uređaja.\n\nMožete da promenite funkciju na koju se odnosi ova prečica u odeljku Podešavanja > Pristupačnost."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Uključi"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index f0c8f88609f4..b09d29e72255 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -615,6 +615,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Каб працягнуць, скарыстайце адбітак пальца ці сродак разблакіроўкі экрана"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Значок адбіткаў пальцаў"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Распазнаванне твару"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Праблема з распазнаваннем твару"</string> @@ -667,6 +669,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Каб працягнуць, скарыстайце распазнаванне твару ці сродак разблакіроўкі экрана"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Значок твару"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"чытаць параметры сінхранізацыі"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Дазваляе прыкладанням чытаць параметры сінхранізацыі для ўліковага запісу. Напрыклад, яны могуць вызначыць, цi сiнхранiзавана з улiковым запiсам прыкладанне \"Кантакты\"."</string> @@ -1735,7 +1739,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Калі хуткі доступ уключаны, вы можаце націснуць абедзве кнопкі гучнасці і ўтрымліваць іх 3 секунды, каб запусціць функцыю спецыяльных магчымасцей."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Уключыць хуткі доступ да спецыяльных магчымасцей?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Утрымліванне націснутымі абедзвюх клавіш гучнасці на працягу некалькіх секунд уключае спецыяльныя магчымасці. У выніку ваша прылада можа пачаць працаваць па-іншаму.\n\nБягучыя функцыі:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nВыбраныя функцыі можна змяніць у меню \"Налады > Спецыяльныя магчымасці\"."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Уключыць хуткі доступ да сэрвісу \"<xliff:g id="SERVICE">%1$s</xliff:g>\"?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Утрымліванне націснутымі абедзвюх клавіш гучнасці на працягу некалькіх секунд уключае службу \"<xliff:g id="SERVICE">%1$s</xliff:g>\", якая з\'яўляецца спецыяльнай магчымасцю. У выніку ваша прылада можа пачаць працаваць па-іншаму.\n\nВы можаце задаць гэта спалучэнне клавіш для іншай функцыі ў меню \"Налады > Спецыяльныя магчымасці\"."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Уключыць"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 40807e5650fa..9a6857f00770 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Използвайте отпечатъка си или опцията за заключване на екрана, за да продължите"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Икона за отпечатък"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Отключване с лице"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Проблем с отключването с лице"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Използвайте лицето си или опцията за заключване на екрана, за да продължите"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Икона на лице"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"четене на настройките за синхронизиране"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Разрешава на приложението да чете настройките за синхронизиране на профил. Например това може да определи дали приложението Хора е синхронизирано с даден профил."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Когато прекият път е включен, можете да стартирате дадена функция за достъпност, като натиснете двата бутона за силата на звука и ги задържите за 3 секунди."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Искате ли да включите прекия път за функциите за достъпност?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Натиснете двата бутона за силата на звука и ги задръжте за няколко секунди, за да включите функциите за достъпност. Това може да промени начина, по който работи устройството ви.\n\nТекущи функции:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nМожете да промените избраните функции от „Настройки“ > „Достъпност“."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Искате ли да включите прекия път за <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Натиснете двата бутона за силата на звука и ги задръжте за няколко секунди, за да включите функцията за достъпност <xliff:g id="SERVICE">%1$s</xliff:g>. Това може да промени начина, по който работи устройството ви.\n\nМожете да зададете друга функция за този пряк път от „Настройки“ > „Достъпност“."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Включване"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 2f68cdab4a03..c5092ff3b90d 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"চালিয়ে যেতে আপনার আঙুলের ছাপ বা স্ক্রিন লক ব্য়বহার করুন"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"আঙ্গুলের ছাপ আইকন"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"ফেস আনলক"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"\'ফেস আনলক\' ফিচার ব্যবহার করার ক্ষেত্রে হওয়া সমস্যা"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"চালিয়ে যেতে আপনার ফেস বা স্ক্রিন লক ব্যবহার করুন"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"ফেস আইকন"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"সিঙ্ক সেটিংস পড়ে"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"অ্যাপ্লিকেশানটিকে একটি অ্যাকাউন্টের জন্য সিঙ্ক সেটিংস পড়ার অনুমতি দেয়৷ উদাহরণস্বরূপ, \'পিপল\' অ্যাপ্লিকেশানটি কোনো অ্যাকাউন্টের সাথে সিঙ্ক করা আছে কিনা তা নির্ধারণ করতে পারে৷"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"শর্টকাট চালু করা থাকাকালীন দুটি ভলিউম বোতাম একসাথে ৩ সেকেন্ড টিপে ধরে রাখলে একটি অ্যাকসেসিবিলিটি ফিচার চালু হবে।"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"অ্যাক্সেসিবিলিটি ফিচারের শর্টকাট বন্ধ করতে চান?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"উভয় ভলিউম কী কয়েক সেকেন্ড ধরে থাকলে অ্যাক্সেসিবিলিটি ফিচার চালু হয়ে যাবে। এর ফলে, আপনার ডিভাইস কীভাবে কাজ করবে সেটিতে পরিবর্তন হতে পারে।\n\nবর্তমান ফিচার:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nসেটিংস > অ্যাক্সেসিবিলিটি বিকল্প থেকে আপনি বাছাই করা ফিচার পরিবর্তন করতে পারবেন।"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> শর্টকাট চালু করতে চান?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"উভয় ভলিউম কী কয়েক সেকেন্ড ধরে থাকলে <xliff:g id="SERVICE">%1$s</xliff:g> চালু হয়ে যাবে। এটি একটি অ্যাক্সেসিবিলিটি ফিচার। এর ফলে, আপনার ডিভাইস কীভাবে কাজ করবে সেটিতে পরিবর্তন হতে পারে।\n\nসেটিংস > অ্যাক্সেসিবিলিটি থেকে আপনি এই শর্টকাট পরিবর্তন করতে পারবেন।"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"চালু করুন"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 3ebb7ccc8471..45f1b010d71e 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -612,6 +612,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Koristite otisak prsta ili zaključavanje ekrana da nastavite"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona za otisak prsta"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Otključavanje licem"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problem s otključavanjem licem"</string> @@ -664,6 +666,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Koristite lice ili zaključavanje ekrana da nastavite"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ikona lica"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"čitanje postavki za sinhroniziranje"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Omogućava aplikaciji čitanje postavki sinhroniziranja za račun. Naprimjer, ovim se može utvrditi da li je aplikacija People sinhronizirana sa računom."</string> @@ -1713,7 +1717,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Kada je prečica uključena, pritiskom i držanjem oba dugmeta za jačinu zvuka u trajanju od 3 sekunde pokrenut će se funkcija pristupačnosti."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Uključiti prečicu za funkcije pristupačnosti?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Ako nekoliko sekundi držite pritisnute obje tipke za jačinu zvuka, uključit ćete funkcije pristupačnosti. Ovo može uticati na način rada uređaja.\n\nTrenutne funkcije:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nOdabrane funkcije možete promijeniti u odjeljku Postavke > Pristupačnost."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Uključiti prečicu za uslugu <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Ako nekoliko sekundi držite pritisnute obje tipke za jačinu zvuka, uključit ćete funkciju pristupačnosti <xliff:g id="SERVICE">%1$s</xliff:g>. Ovo može promijeniti način rada uređaja.\n\nOvu prečicu možete zamijeniti drugom funkcijom u odjeljku Postavke > Pristupačnost."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Uključi"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 880ad1804498..26fc4c708f88 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Utilitza l\'empremta digital o el bloqueig de pantalla per continuar"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icona d\'empremta digital"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Desbloqueig facial"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problema amb Desbloqueig facial"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Utilitza la cara o el bloqueig de pantalla per continuar"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Icona facial"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"llegir la configuració de sincronització"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Permet que l\'aplicació llegeixi la configuració de sincronització d\'un compte. Per exemple, això pot determinar que l\'aplicació Contactes estigui sincronitzada amb un compte."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Si la drecera està activada, prem els dos botons de volum durant 3 segons per iniciar una funció d\'accessibilitat."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Vols desactivar la drecera de les funcions d\'accessibilitat?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Si mantens premudes les dues tecles de volum durant uns segons, s\'activaran les funcions d\'accessibilitat. Això podria canviar el funcionament del teu dispositiu.\n\nFuncions actuals:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nPots canviar les funcions seleccionades a Configuració > Accessibilitat."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Vols activar la drecera de <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Si mantens premudes les dues tecles de volum durant uns segons, la funció d\'accessibilitat <xliff:g id="SERVICE">%1$s</xliff:g> s\'activarà. Això podria canviar el funcionament del teu dispositiu.\n\nPots canviar la funció d\'aquesta drecera a Configuració > Accessibilitat."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Activa"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index a8ae213b6180..23f98225a643 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -615,6 +615,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Pokračujte ověřením pomocí otisku prstu nebo zámku obrazovky"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona otisku prstů"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Odemknutí obličejem"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problém s odemykáním obličejem"</string> @@ -667,6 +669,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Pokračujte ověřením pomocí obličeje nebo zámku obrazovky"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ikona obličeje"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"čtení nastavení synchronizace"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Umožňuje aplikaci číst nastavení synchronizace v účtu. Může například určit, zda je s účtem synchronizována aplikace Lidé."</string> @@ -1735,7 +1739,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Když je tato zkratka zapnutá, můžete funkci přístupnosti spustit tím, že na tři sekundy podržíte obě tlačítka hlasitosti."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Zapnout zkratku funkcí pro usnadnění přístupu?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Podržením obou tlačítek hlasitosti po dobu několika sekund zapnete funkce pro usnadnění přístupu. Tato funkce může změnit fungování zařízení.\n\nAktuální funkce:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nVybrané funkce můžete změnit v Nastavení > Přístupnost."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Zapnout zkratku služby <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Podržením obou tlačítek hlasitosti po dobu několika sekund zapnete funkci pro usnadnění přístupu <xliff:g id="SERVICE">%1$s</xliff:g>. Tato funkce může změnit fungování zařízení.\n\nZkratku můžete nastavit na jinou funkci v Nastavení > Přístupnost."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Zapnout"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 45f02e363fe9..6835dcdb2f23 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Brug dit fingeraftryk eller din skærmlås for at fortsætte"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikon for fingeraftryk"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Ansigtslås"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Der er et problem med Ansigtslås"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Brug din ansigts- eller skærmlås for at fortsætte"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ansigt"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"læse indstillinger for synkronisering"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Tillader, at appen kan læse synkroniseringsindstillingerne for en konto. Denne tilladelse kan f.eks. fastslå, om appen Personer er synkroniseret med en konto."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Når genvejen er aktiveret, kan du starte en hjælpefunktion ved at trykke på begge lydstyrkeknapper i tre sekunder."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Vil du aktivere genvejen til hjælpefunktioner?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Hvis du holder begge lydstyrkeknapperne nede i et par sekunder, aktiveres hjælpefunktionerne. Det kan ændre på, hvordan din enhed fungerer.\n\nAktuelle funktioner:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nDu kan ændre de valgte funktioner i Indstillinger > Hjælpefunktioner."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Vil du aktivere <xliff:g id="SERVICE">%1$s</xliff:g>-genvejen?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Hvis du holder begge lydstyrkeknapperne nede i et par sekunder, aktiveres hjælpefunktionen <xliff:g id="SERVICE">%1$s</xliff:g>. Det kan ændre på, hvordan din enhed fungerer.\n\nDu kan ændre denne genvej til en anden funktion i Indstillinger > Hjælpefunktioner."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Aktivér"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 865f02663299..09dd5a0abe3d 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Verwende deinen Fingerabdruck oder deine Display-Entsperrmethode, um fortzufahren"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingerabdruck-Symbol"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Entsperrung per Gesichtserkennung"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problem bei der Entsperrung per Gesichtserkennung"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Verwende die Gesichtserkennung oder deine Display-Entsperrmethode, um fortzufahren"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Gesichtssymbol"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"Synchronisierungseinstellungen lesen"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Ermöglicht der App, die Synchronisierungseinstellungen eines Kontos zu lesen. Beispielsweise kann damit festgestellt werden, ob Kontakte mit einem Konto synchronisiert werden."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Wenn die Verknüpfung aktiviert ist, kannst du die beiden Lautstärketasten drei Sekunden lang gedrückt halten, um eine Bedienungshilfe zu starten."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Verknüpfung für Bedienungshilfen aktivieren?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Wenn du beide Lautstärketasten einige Sekunden lang gedrückt hältst, aktivierst du die Bedienungshilfen. Dadurch kann sich die Funktionsweise deines Geräts ändern.\n\nAktuelle Funktionen:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nDu kannst ausgewählte Funktionen unter \"Einstellungen\" > \"Bedienungshilfen\" ändern."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Verknüpfung für <xliff:g id="SERVICE">%1$s</xliff:g> aktivieren?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Wenn du beide Lautstärketasten einige Sekunden lang gedrückt hältst, aktivierst du die Bedienungshilfe \"<xliff:g id="SERVICE">%1$s</xliff:g>\". Dadurch kann sich die Funktionsweise deines Geräts ändern.\n\nUnter \"Einstellungen > \"Bedienungshilfen\" kannst du dieser Verknüpfung eine andere Funktion zuweisen."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Aktivieren"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 67bd43325cf7..4e019dc1e8b7 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Χρησιμοποιήστε το δακτυλικό σας αποτύπωμα ή το κλείδωμα οθόνης για να συνεχίσετε"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Ξεκλείδωμα με το πρόσωπο"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Πρόβλημα με το Ξεκλείδωμα με το πρόσωπο"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Χρησιμοποιήστε το πρόσωπό σας ή το κλείδωμα οθόνης για συνέχεια"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Εικ. προσ."</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"διαβάζει τις ρυθμίσεις συγχρονισμού"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Επιτρέπει στην εφαρμογή την ανάγνωση των ρυθμίσεων συγχρονισμού για έναν λογαριασμό. Για παράδειγμα, αυτό μπορεί να καθορίσει εάν η εφαρμογή \"Άτομα\" είναι συγχρονισμένη με έναν λογαριασμό."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Όταν η συντόμευση είναι ενεργοποιημένη, το πάτημα και των δύο κουμπιών έντασης ήχου για 3 δευτερόλεπτα θα ξεκινήσει μια λειτουργία προσβασιμότητας."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Ενεργοποίηση συντόμευσης για λειτουργίες προσβασιμότητας;"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Για να ενεργοποιήσετε τις λειτουργίες προσβασιμότητας, πατήστε παρατεταμένα τα δύο πλήκτρα έντασης για μερικά δευτερόλεπτα. Αυτό ενδέχεται να αλλάξει τον τρόπο λειτουργίας της συσκευής σας.\n\nΤρέχουσες λειτουργίες:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nΜπορείτε να αλλάξετε τις επιλεγμένες λειτουργίες στις Ρυθμίσεις > Προσβασιμότητα."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Ενεργοποίηση συντόμευσης <xliff:g id="SERVICE">%1$s</xliff:g>;"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Μπορείτε να ενεργοποιήσετε τη λειτουργία <xliff:g id="SERVICE">%1$s</xliff:g>, η οποία είναι μία από τις λειτουργίες προσβασιμότητας, πατώντας παρατεταμένα ταυτόχρονα τα δύο πλήκτρα έντασης ήχου για μερικά δευτερόλεπτα. Αυτό ενδέχεται να αλλάξει τον τρόπο λειτουργίας της συσκευής σας.\n\nΜπορείτε να αλλάξετε αυτή τη συντόμευση σε μια άλλη λειτουργία στις Ρυθμίσεις > Προσβασιμότητα."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Ενεργοποίηση"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 8cf968d503a7..04158b40e79e 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -609,6 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Use your fingerprint or screen lock to continue"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Something went wrong. Try again."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingerprint icon"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Issue with Face Unlock"</string> @@ -661,6 +662,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Something went wrong. Try again."</string> <string name="face_icon_content_description" msgid="465030547475916280">"Face icon"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"read sync settings"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string> @@ -1691,7 +1693,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"When the shortcut is on, pressing both volume buttons for three seconds will start an accessibility feature."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Turn on shortcut for accessibility features?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Holding down both volume keys for a few seconds turns on accessibility features. This may change how your device works.\n\nCurrent features:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nYou can change selected features in Settings > Accessibility."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Turn on <xliff:g id="SERVICE">%1$s</xliff:g> shortcut?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Holding down both volume keys for a few seconds turns on <xliff:g id="SERVICE">%1$s</xliff:g>, an accessibility feature. This may change how your device works.\n\nYou can change this shortcut to another feature in Settings > Accessibility."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Turn on"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index b772335a6438..3b019f47045e 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -609,6 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Use your fingerprint or screen lock to continue"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Something went wrong. Try again."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingerprint icon"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Issue with Face Unlock"</string> @@ -661,6 +662,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Something went wrong. Try again."</string> <string name="face_icon_content_description" msgid="465030547475916280">"Face icon"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"read sync settings"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string> @@ -1691,7 +1693,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"When the shortcut is on, pressing both volume buttons for three seconds will start an accessibility feature."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Turn on shortcut for accessibility features?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Holding down both volume keys for a few seconds turns on accessibility features. This may change how your device works.\n\nCurrent features:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nYou can change selected features in Settings > Accessibility."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Turn on <xliff:g id="SERVICE">%1$s</xliff:g> shortcut?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Holding down both volume keys for a few seconds turns on <xliff:g id="SERVICE">%1$s</xliff:g>, an accessibility feature. This may change how your device works.\n\nYou can change this shortcut to another feature in Settings > Accessibility."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Turn on"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index e1e81870cfa3..91d39a97e3f8 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -609,6 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Use your fingerprint or screen lock to continue"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Something went wrong. Try again."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingerprint icon"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Issue with Face Unlock"</string> @@ -661,6 +662,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Something went wrong. Try again."</string> <string name="face_icon_content_description" msgid="465030547475916280">"Face icon"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"read sync settings"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string> @@ -1691,7 +1693,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"When the shortcut is on, pressing both volume buttons for three seconds will start an accessibility feature."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Turn on shortcut for accessibility features?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Holding down both volume keys for a few seconds turns on accessibility features. This may change how your device works.\n\nCurrent features:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nYou can change selected features in Settings > Accessibility."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Turn on <xliff:g id="SERVICE">%1$s</xliff:g> shortcut?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Holding down both volume keys for a few seconds turns on <xliff:g id="SERVICE">%1$s</xliff:g>, an accessibility feature. This may change how your device works.\n\nYou can change this shortcut to another feature in Settings > Accessibility."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Turn on"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 892041c2332d..fe23e6367f98 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -609,6 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Use your fingerprint or screen lock to continue"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Something went wrong. Try again."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingerprint icon"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Issue with Face Unlock"</string> @@ -661,6 +662,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Something went wrong. Try again."</string> <string name="face_icon_content_description" msgid="465030547475916280">"Face icon"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"read sync settings"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string> @@ -1691,7 +1693,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"When the shortcut is on, pressing both volume buttons for three seconds will start an accessibility feature."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Turn on shortcut for accessibility features?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Holding down both volume keys for a few seconds turns on accessibility features. This may change how your device works.\n\nCurrent features:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nYou can change selected features in Settings > Accessibility."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Turn on <xliff:g id="SERVICE">%1$s</xliff:g> shortcut?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Holding down both volume keys for a few seconds turns on <xliff:g id="SERVICE">%1$s</xliff:g>, an accessibility feature. This may change how your device works.\n\nYou can change this shortcut to another feature in Settings > Accessibility."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Turn on"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index a7ad2b6dc16a..787de9b81d62 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -609,6 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Use your fingerprint or screen lock to continue"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Something went wrong. Try again."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingerprint icon"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Issue with Face Unlock"</string> @@ -661,6 +662,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use your face or screen lock to continue"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Something went wrong. Try again."</string> <string name="face_icon_content_description" msgid="465030547475916280">"Face icon"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"read sync settings"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Allows the app to read the sync settings for an account. For example, this can determine whether the People app is synced with an account."</string> @@ -1691,7 +1693,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"When the shortcut is on, pressing both volume buttons for 3 seconds will start an accessibility feature."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Turn on shortcut for accessibility features?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Holding down both volume keys for a few seconds turns on accessibility features. This may change how your device works.\n\nCurrent features:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nYou can change selected features in Settings > Accessibility."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Turn on <xliff:g id="SERVICE">%1$s</xliff:g> shortcut?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Holding down both volume keys for a few seconds turns on <xliff:g id="SERVICE">%1$s</xliff:g>, an accessibility feature. This may change how your device works.\n\nYou can change this shortcut to another feature in Settings > Accessibility."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Turn on"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 5206c484b893..a820d25ae5c9 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Usa tu huella dactilar o bloqueo de pantalla para continuar"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ícono de huella dactilar"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Desbloqueo facial"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problema con el Desbloqueo facial"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Usa tu rostro o bloqueo de pantalla para continuar"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ícono cara"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"leer la configuración de sincronización"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Este permiso permite que la aplicación consulte la configuración de sincronización de una cuenta. Esto permite, por ejemplo, determinar si la aplicación Personas está sincronizada con una cuenta."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Cuando la combinación de teclas está activada, puedes presionar los botones de volumen durante 3 segundos para iniciar una función de accesibilidad."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"¿Quieres activar la combinación de teclas para las funciones de accesibilidad?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Si mantienes presionadas las dos teclas de volumen durante unos segundos, se activarán las funciones de accesibilidad. Esto puede cambiar el funcionamiento de tu dispositivo.\n\nFunciones actuales:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nPuedes cambiar las funciones seleccionadas en Configuración > Accesibilidad."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"¿Quieres activar el acceso directo de <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Si mantienes presionadas ambas teclas de volumen durante unos segundos, se activará la función de accesibilidad <xliff:g id="SERVICE">%1$s</xliff:g>. Esto podría cambiar la forma en que funciona tu dispositivo.\n\nPuedes cambiar este acceso directo a otra función en Configuración > Accesibilidad."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Activar"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 9a29addc10b0..c653c31ac9cc 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -609,6 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Usa tu huella digital o tu bloqueo de pantalla para continuar"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Se ha producido un error. Inténtalo de nuevo."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icono de huella digital"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Desbloqueo facial"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problema con Desbloqueo facial"</string> @@ -661,6 +662,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Usa tu cara o tu bloqueo de pantalla para continuar"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Se ha producido un error. Inténtalo de nuevo."</string> <string name="face_icon_content_description" msgid="465030547475916280">"Icono cara"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"leer la configuración de sincronización"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Permite que la aplicación consulte la configuración de sincronización de una cuenta. La aplicación puede utilizar este permiso, por ejemplo, para determinar si la aplicación Contactos está sincronizada con una cuenta."</string> @@ -1691,7 +1693,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Si el acceso directo está activado, pulsa los dos botones de volumen durante 3 segundos para iniciar una función de accesibilidad."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"¿Quieres activar el acceso directo a las funciones de accesibilidad?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Al mantener pulsadas las dos teclas de volumen durante unos segundos, se activan las funciones de accesibilidad, que pueden cambiar el funcionamiento del dispositivo.\n\nFunciones actuales:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nPuedes cambiar las funciones seleccionadas en Ajustes > Accesibilidad."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"¿Quieres activar el acceso directo a <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Al mantener pulsadas ambas teclas de volumen durante unos segundos se activa <xliff:g id="SERVICE">%1$s</xliff:g>, una función de accesibilidad. Esta función puede modificar el funcionamiento del dispositivo.\n\nPuedes asignar este acceso directo a otra función en Ajustes > Accesibilidad."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Activar"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 4dd7d9469f4c..683026d36894 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Jätkamiseks kasutage oma sõrmejälge või ekraanilukku"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Sõrmejälje ikoon"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Näoga avamine"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Probleem funktsiooniga Näoga avamine"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Jätkamiseks kasutage oma nägu või ekraanilukku"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Näoikoon"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"loe sünkroonimisseadeid"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Võimaldab rakendusel lugeda konto sünkroonimisseadeid. Näiteks võib see määrata, kas rakendus Inimesed on kontoga sünkroonitud."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Kui otsetee on sisse lülitatud, käivitab mõlema helitugevuse nupu kolm sekundit all hoidmine juurdepääsetavuse funktsiooni."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Kas lülitada juurdepääsufunktsioonide otsetee sisse?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Hoidke juurdepääsufunktsioonide sisselülitamiseks mõlemat helitugevuse klahvi mõni sekund all. See võib teie seadme tööviisi muuta.\n\nPraegused funktsioonid:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nValitud funktsioone saab muuta jaotises Seaded > Juurdepääsetavus."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Kas lülitada teenuse <xliff:g id="SERVICE">%1$s</xliff:g> otsetee sisse?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Kui hoiate mõlemat helitugevuse klahvi mõni sekund all, lülitatakse juurdepääsufunktsioon <xliff:g id="SERVICE">%1$s</xliff:g> sisse. See võib teie seadme tööviisi muuta.\n\nSelle otsetee saab asendada muu otseteega jaotises Seaded > Juurdepääsetavus."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Lülita sisse"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index d4705c100a8f..9fd95de4cefc 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Aurrera egiteko, erabili hatz-marka edo pantailaren blokeoa"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Hatz-markaren ikonoa"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Aurpegi bidez desblokeatzeko eginbidea"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Arazoak ditugu aurpegi bidez desblokeatzeko eginbidearekin"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Aurrera egiteko, erabili aurpegia edo pantailaren blokeoa"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Aurpegiaren ikonoa"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"irakurri sinkronizazio-ezarpenak"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Kontu baten sinkronizazio-ezarpenak irakurtzeko baimena ematen die aplikazioei. Adibidez, Jendea aplikazioa konturen batekin sinkronizatuta dagoen zehatz dezake."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Lasterbidea aktibatuta dagoenean, bi bolumen-botoiak hiru segundoz sakatuta abiaraziko da erabilerraztasun-eginbidea."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Erabilerraztasun-eginbideetarako lasterbidea aktibatu nahi duzu?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Eduki sakatuta bolumen-botoiak segundo batzuez erabilerraztasun-eginbideak aktibatzeko. Hori eginez gero, baliteke zure mugikorraren funtzionamendua aldatzea.\n\nEginbideak:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nHautatutako eginbideak aldatzeko, joan Ezarpenak > Erabilerraztasuna atalera."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> zerbitzuaren lasterbidea aktibatu nahi duzu?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Eduki sakatuta bolumen-botoiak segundo batzuez <xliff:g id="SERVICE">%1$s</xliff:g> izeneko erabilerraztasun-eginbidea aktibatzeko. Honen bidez, baliteke zure mugikorraren funtzionamendua aldatzea.\n\nLasterbide hau beste eginbide batengatik aldatzeko, joan Ezarpenak > Erabilerraztasuna atalera."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Aktibatu"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index fcca1b39330a..823ef544ded3 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"برای ادامه، از اثر انگشت یا قفل صفحه استفاده کنید"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"نماد اثر انگشت"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"قفلگشایی با چهره"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"مشکل در «قفلگشایی با چهره»"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"برای ادامه، از تشخیص چهره یا قفل صفحه استفاده کنید"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"نماد چهره"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"خواندن تنظیمات همگامسازی"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"به برنامه اجازه میدهد تنظیمات را برای یک حساب بخواند. بهعنوان مثال، این ویژگی میتواند تعیین کند آیا حساب «افراد» شما با یک حساب همگامسازی شده است."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"وقتی میانبر روشن باشد، با فشار دادن هردو دکمه صدا بهمدت ۳ ثانیه ویژگی دسترسپذیری فعال میشود."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"میانبر برای ویژگیهای دسترسپذیری روشن شود؟"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"با پایین نگه داشتن هردو کلید میزان صدا بهمدت چند ثانیه، ویژگیهای دسترسپذیری روشن میشود. با این کار نحوه عملکرد دستگاهتان تغییر میکند.\n\nویژگیهای فعلی:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nمیتوانید ویژگیهای انتخابی را در «تنظیمات > دسترسپذیری» تغییر دهید."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"میانبر <xliff:g id="SERVICE">%1$s</xliff:g> روشن شود؟"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"با پایین نگه داشتن هردو کلید میزان صدا بهمدت چند ثانیه، <xliff:g id="SERVICE">%1$s</xliff:g> (یکی از ویژگیهای دسترسپذیری) روشن میشود. با این کار نحوه عملکرد دستگاهتان تغییر میکند.\n\nمیتوانید در «تنظیمات > دسترسپذیری»،این میانبر را به ویژگی دیگری تغییر دهید."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"روشن شود"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 5998269aae48..0a23c87bc808 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Jatka sormenjäljen tai näytön lukituksen avulla"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Sormenjälkikuvake"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Kasvojentunnistusavaus"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Face Unlockiin liittyvä ongelma"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Jatka kasvojentunnistuksen tai näytön lukituksen avulla"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Kasvokuvake"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"lue synkronointiasetuksia"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Antaa sovelluksen lukea tilien synkronointiasetuksia. Sovellus voi esimerkiksi määrittää, onko Henkilöt-sovellus synkronoitu tilin kanssa."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Kun pikanäppäin on käytössä, voit käynnistää esteettömyystoiminnon pitämällä molempia äänenvoimakkuuspainikkeita painettuna kolmen sekunnin ajan."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Laitetaanko esteettömyysominaisuuksien pikavalinta päälle?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Molempien äänenvoimakkuuspainikkeiden painaminen muutaman sekunnin ajan laittaa esteettömyysominaisuudet päälle. Tämä voi muuttaa laitteesi toimintaa.\n\nNykyiset ominaisuudet:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nVoit muuttaa valittuja ominaisuuksia kohdassa Asetukset > Esteettömyys."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Laitetaanko pikavalinta (<xliff:g id="SERVICE">%1$s</xliff:g>) päälle?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Molempien äänenvoimakkuuspainikkeiden pitkään painaminen laittaa päälle esteettömyysominaisuuden <xliff:g id="SERVICE">%1$s</xliff:g>. Tämä voi muuttaa laitteesi toimintaa.\n\nVoit muuttaa tätä pikanäppäintä kohdassa Asetukset > Esteettömyys."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Laita päälle"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 860e10bcff4d..bc92fc62c6b3 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Utilisez votre empreinte digitale ou le verrouillage de l\'écran pour continuer"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icône d\'empreinte digitale"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Déverrouillage par reconnaissance faciale"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problème avec la fonctionnalité de déverrouillage par reconnaissance faciale"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Utilisez votre visage ou le verrouillage de l\'écran pour continuer"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Icône visage"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"lire les paramètres de synchronisation"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Permet à l\'application d\'accéder aux paramètres de synchronisation d\'un compte. Par exemple, cette autorisation peut permettre de déterminer si l\'application Contacts est synchronisée avec un compte ou non."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Quand le raccourci est activé, appuyez sur les deux boutons de volume pendant trois secondes pour lancer une fonctionnalité d\'accessibilité."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Activer le raccourci pour les fonctionnalités d\'accessibilité?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Si vous maintenez enfoncées les deux touches de volume pendant quelques secondes, vous activez les fonctionnalités d\'accessibilité. Cela peut modifier le fonctionnement de votre appareil.\n\nFonctionnalités actuellement utilisées :\n<xliff:g id="SERVICE">%1$s</xliff:g>\nPour les modifier, sélectionnez Paramètres > Accessibilité."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Activer le raccourci pour <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Si vous maintenez enfoncées les deux touches de volume pendant quelques secondes, vous activez la fonctionnalité d\'accessibilité <xliff:g id="SERVICE">%1$s</xliff:g>. Cela peut modifier le fonctionnement de votre appareil.\n\nPour attribuer ce raccourci à une autre fonctionnalité, sélectionnez Paramètres > Accessibilité."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Activer"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 55fa1453caf8..d5c7ff2314f1 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Utilisez votre empreinte digitale ou le verrouillage de l\'écran pour continuer"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icône d\'empreinte digitale"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Déverrouillage par reconnaissance faciale"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problème lié au déverrouillage par reconnaissance faciale"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Utilisez la reconnaissance faciale ou le verrouillage de l\'écran pour continuer"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Icône visage"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"lire les paramètres de synchronisation"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Permet à l\'application d\'accéder aux paramètres de synchronisation d\'un compte. Par exemple, cette autorisation peut permettre de déterminer si l\'application Contacts est synchronisée avec un compte ou non."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Quand le raccourci est activé, appuyez sur les deux boutons de volume pendant trois secondes pour démarrer une fonctionnalité d\'accessibilité."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Activer le raccourci pour accéder aux fonctionnalités d\'accessibilité ?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Si vous appuyez sur les deux touches de volume pendant quelques secondes, vous activez des fonctionnalités d\'accessibilité. Cela peut affecter le fonctionnement de votre appareil.\n\nFonctionnalités actuellement utilisées :\n<xliff:g id="SERVICE">%1$s</xliff:g>\nPour les modifier, accédez à Paramètres > Accessibilité."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Activer le raccourci <xliff:g id="SERVICE">%1$s</xliff:g> ?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Si vous appuyez sur les deux touches de volume pendant quelques secondes, vous activez la fonctionnalité d\'accessibilité <xliff:g id="SERVICE">%1$s</xliff:g>. Cela peut affecter le fonctionnement de votre appareil.\n\nPour attribuer ce raccourci à une autre fonctionnalité, accédez à Paramètres > Accessibilité."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Activer"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 76f54ff26b09..6d2909a7d715 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Para continuar, utiliza a impresión dixital ou o bloqueo de pantalla"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icona de impresión dixital"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Desbloqueo facial"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Produciuse un problema co desbloqueo facial"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Para continuar, utiliza o desbloqueo facial ou a credencial do dispositivo"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Icona cara"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ler a configuración de vinculación"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Permite á aplicación ler a configuración de vinculación dunha conta. Por exemplo, esta acción pode determinar se a aplicación Contactos se vincula cunha conta."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Cando o atallo está activado, podes premer os dous botóns de volume durante 3 segundos para iniciar unha función de accesibilidade."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Queres activar as funcións de accesibilidade?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Ao manter as dúas teclas de volume premidas durante uns segundos actívanse as funcións de accesibilidade. Esta acción pode cambiar o funcionamento do dispositivo.\n\nFuncións activadas actualmente:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nPodes cambiar as funcións seleccionadas en Configuración > Accesibilidade."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Queres activar o atallo a <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Ao manter as dúas teclas de volume premidas durante uns segundos actívase <xliff:g id="SERVICE">%1$s</xliff:g>, unha función de accesibilidade. Esta acción pode cambiar o funcionamento do dispositivo.\n\nPodes cambiar o uso deste atallo para outra función en Configuración > Accesibilidade."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Activar"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 3422d8e62f9d..4babc5884052 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"ચાલુ રાખવા માટે તમારા ફિંગરપ્રિન્ટ અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ફિંગરપ્રિન્ટ આયકન"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"ફેસ અનલૉક"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"ફેસ અનલૉકની સુવિધામાં સમસ્યા"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ચાલુ રાખવા માટે તમારા ફેસ લૉક અથવા સ્ક્રીન લૉકનો ઉપયોગ કરો"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"ચહેરા આઇકન"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"સિંક સેટિંગ વાંચો"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ઍપને એકાઉન્ટ માટે સિંક સેટિંગને વાંચવાની મંજૂરી આપે છે. ઉદાહરણ તરીકે, આ એકાઉન્ટ સાથે લોકો ઍપ સિંક થઈ છે કે કેમ તે નિર્ધારિત કરી શકે છે."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"જ્યારે શૉર્ટકટ ચાલુ હોય, ત્યારે બન્ને વૉલ્યૂમ બટનને 3 સેકન્ડ સુધી દબાવી રાખવાથી ઍક્સેસિબિલિટી સુવિધા શરૂ થઈ જશે."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"ઍક્સેસિબિલિટી સુવિધાઓ માટે શૉર્ટકટ ચાલુ કરીએ?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"બન્ને વૉલ્યૂમ કીને થોડી સેકન્ડ સુધી દબાવી રાખવાથી ઍક્સેસિબિલિટી સુવિધાઓ ચાલુ થઈ જાય છે. આનાથી તમારા ડિવાઇસની કામ કરવાની રીત બદલાઈ શકે છે.\n\nવર્તમાન સુવિધાઓ:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nતમે સેટિંગ > ઍક્સેસિબિલિટીમાં જઈને પસંદ કરેલી સુવિધાઓને બદલી શકો છો."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> શૉર્ટકટ ચાલુ કરીએ?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"બન્ને વૉલ્યૂમ કીને થોડી સેકન્ડ સુધી દબાવી રાખવાથી ઍક્સેસિબિલિટી સુવિધા એવી <xliff:g id="SERVICE">%1$s</xliff:g> ચાલુ થઈ જાય છે. આનાથી તમારા ડિવાઇસની કામ કરવાની રીત બદલાઈ શકે છે.\n\nતમે સેટિંગ > ઍક્સેસિબિલિટીમાં જઈને આ શૉર્ટકટને બીજી સુવિધામાં બદલી શકો છો."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ચાલુ કરો"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index dcf357b2307a..62e1774533c2 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -326,7 +326,7 @@ <string name="permgroupdesc_phone" msgid="270048070781478204">"फ़ोन कॉल करने और उन्हें प्रबंधित करने की अनुमति दें"</string> <string name="permgrouplab_sensors" msgid="9134046949784064495">"बॉडी सेंसर"</string> <string name="permgroupdesc_sensors" msgid="2610631290633747752">"अपने महत्वपूर्ण संकेतों के बारे में सेंसर डेटा को ऐक्सेस करें"</string> - <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"विंडो की सामग्री वापस पाएं"</string> + <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"विंडो का कॉन्टेंट वापस पाएं"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"उस विंडो की सामग्री की जाँच करें, जिसका आप इस्तेमाल कर रहे हैं."</string> <string name="capability_title_canRequestTouchExploration" msgid="327598364696316213">"छूकर, किसी चीज़ से जुड़ी जानकारी सुनने की सुविधा चालू करें"</string> <string name="capability_desc_canRequestTouchExploration" msgid="4394677060796752976">"जिन चीज़ों पर आप टैप करेंगे उन्हें ज़ोर से बोला जाएगा और स्क्रीन को जेस्चर के ज़रिए एक्सप्लोर किया जा सकेगा."</string> @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"जारी रखने के लिए, फ़िंगरप्रिंट या स्क्रीन लॉक क्रेडेंशियल डालकर पुष्टि करें"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"फ़िंगरप्रिंट आइकॉन"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"फ़ेस अनलॉक"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"फ़ेस अनलॉक से जुड़ी समस्या"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"जारी रखने के लिए, अपना चेहरा दिखाकर या स्क्रीन लॉक क्रेडेंशियल डालकर पुष्टि करें"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"चेहरे का आइकॉन"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"समन्वयन सेटिंग पढ़ें"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ऐप्स को किसी खाते की समन्वयन सेटिंग पढ़ने देता है. उदाहरण के लिए, इससे यह तय किया जा सकता है कि लोग ऐप्स किसी खाते के साथ समन्वयित है या नहीं."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"शॉर्टकट के चालू होने पर, दाेनाें वॉल्यूम बटन (आवाज़ कम या ज़्यादा करने वाले बटन) को तीन सेकंड तक दबाने से, सुलभता सुविधा शुरू हाे जाएगी."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"क्या आप सुलभता सुविधाओं के लिए शॉर्टकट चालू करना चाहते हैं?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"आवाज़ कम और ज़्यादा करने वाले दोनों बटन को कुछ सेकंड तक दबाकर रखने से सुलभता सुविधाएं चालू हो जाती हैं. ऐसा करने से आपके डिवाइस के काम करने के तरीके में बदलाव हो सकता है.\n\nमौजूदा सुविधाएं:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nआप सेटिंग और सुलभता में जाकर चुनी हुई सुविधाएं बदल सकते हैं."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"क्या आप <xliff:g id="SERVICE">%1$s</xliff:g> शॉर्टकट चालू करना चाहते हैं?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"आवाज़ कम और ज़्यादा करने वाले दोनों बटन को कुछ सेकंड तक दबाकर रखने से <xliff:g id="SERVICE">%1$s</xliff:g> चालू हो जाती है, जो एक सुलभता सुविधा है. ऐसा करने से आपके डिवाइस के काम करने के तरीके में बदलाव हो सकता है.\n\nआप सेटिंग और सुलभता में जाकर इस शॉर्टकट को किसी दूसरी सुविधा के लिए बदल सकते हैं."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"चालू करें"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 9aa3350d6ecd..c557b2f7bc10 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -612,6 +612,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Za nastavak se identificirajte otiskom prsta ili vjerodajnicom zaključavanja zaslona"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona otiska prsta"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Otključavanje licem"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Poteškoće s otključavanjem licem"</string> @@ -664,6 +666,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Za nastavak se identificirajte licem ili vjerodajnicom zaključavanja zaslona"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ikona lica"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"čitanje postavki sinkronizacije"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Aplikaciji omogućuje čitanje postavki sinkronizacije za račun. Time se, primjerice, može utvrditi je li aplikacija Osobe sinkronizirana s računom."</string> @@ -1713,7 +1717,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Kad je taj prečac uključen, pritiskom na obje tipke za glasnoću na tri sekunde pokrenut će se značajka pristupačnosti."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Želite li uključiti prečac za značajke pristupačnosti?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Značajke pristupačnosti uključuju se ako na nekoliko sekundi pritisnete obje tipke za glasnoću. Time se može promijeniti način na koji vaš uređaj radi.\n\nTrenutačne značajke:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nOdabrane značajke možete promijeniti u odjeljku Postavke > Pristupačnost."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Želite li uključiti prečac za uslugu <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Ako na nekoliko sekundi pritisnete obje tipke za glasnoću, uključuje se značajka pristupačnosti <xliff:g id="SERVICE">%1$s</xliff:g>. Time se može promijeniti način na koji vaš uređaj radi.\n\nZnačajku na koju se taj prečac odnosi možete promijeniti u odjeljku Postavke > Pristupačnost."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Uključi"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 908b77956b44..39547b179981 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"A folytatás ujjlenyomattal vagy a képernyőzár feloldásával lehetséges"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ujjlenyomat ikon"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Arcalapú feloldás"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Arcalapú feloldással kapcsolatos problémák"</string> @@ -661,6 +663,8 @@ <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> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Arcikon"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"szinkronizálási beállítások olvasása"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Lehetővé teszi az alkalmazás számára egy fiók szinkronizálási beállításainak beolvasását. Például ellenőrizheti, hogy a Személyek alkalmazás szinkronizálva van-e egy fiókkal."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Ha a gyorsparancs aktív, akkor a két hangerőgomb három másodpercig tartó együttes lenyomásával kisegítő funkciót indíthat el."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Bekapcsol gyorsparancsot a kisegítő lehetőségekhez?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"A kisegítő lehetőségek bekapcsolásához tartsa nyomva néhány másodpercig mindkét hangerőgombot. Ez hatással lehet az eszköz működésére.\n\nJelenlegi funkciók:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nA kiválasztott funkciókat a Beállítások > Kisegítő lehetőségek pontban módosíthatja."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Bekapcsolja a(z) <xliff:g id="SERVICE">%1$s</xliff:g> szolgáltatás gyorsparancsát?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"A(z) <xliff:g id="SERVICE">%1$s</xliff:g> kisegítő lehetőség bekapcsolásához tartsa nyomva néhány másodpercig mindkét hangerőgombot. Ez hatással lehet az eszköz működésére.\n\nEzt a gyorsparancsot a Beállítások > Kisegítő lehetőségek pontban módosíthatja másik funkció használatára."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Bekapcsolom"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index a7992f968ea0..51a07dd5dd64 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Շարունակելու համար օգտագործեք ձեր մատնահետքը կամ էկրանի կողպումը"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Մատնահետքի պատկերակ"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Դեմքով ապակողպում"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Դեմքով ապակողպման հետ կապված խնդիր"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Շարունակելու համար օգտագործեք ձեր դեմքը կամ էկրանի կողպումը"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Դեմքի պատկերակ"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"կարդալ համաժամացման կարգավորումները"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Թույլ է տալիս հավելվածին կարդալ համաժամացման կարգավորումները հաշվի համար: Օրինակ՝ այն կարող է որոշել, արդյոք Մարդիկ հավելվածը համաժամացված է հաշվի հետ:"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Հատուկ գործառույթն օգտագործելու համար սեղմեք և 3 վայրկյան սեղմած պահեք ձայնի ուժգնության երկու կոճակները, երբ գործառույթը միացված է:"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Միացնե՞լ հատուկ գործառույթների դյուրանցումը"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Ձայնի կարգավորման երկու կոճակները մի քանի վայրկյան սեղմած պահելով կմիացնեք հատուկ գործառույթները։ Դրա արդյունքում սարքի աշխատաեղանակը կարող է փոխվել։\n\nԸնթացիկ գործառույթներ՝\n<xliff:g id="SERVICE">%1$s</xliff:g>\nԸնտրված գործառույթները փոխելու համար անցեք Կարգավորումներ > Հատուկ գործառույթներ։"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Միացնե՞լ <xliff:g id="SERVICE">%1$s</xliff:g>-ի դյուրանցումը"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Ձայնի կարգավորման երկու կոճակները մի քանի վայրկյան սեղմած պահելով կմիացնեք <xliff:g id="SERVICE">%1$s</xliff:g> ծառայությունը, որը հատուկ գործառույթ է։ Դրա արդյունքում սարքի աշխատաեղանակը կարող է փոխվել։\n\nԱյս դյուրանցումը մեկ այլ գործառույթով փոխելու համար անցեք Կարգավորումներ > Հատուկ գործառույթներ։"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Միացնել"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 8ae4bc742d40..7f9dc7e8bcc3 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -58,8 +58,8 @@ <string name="meid" msgid="3291227361605924674">"MEID"</string> <string name="ClipMmi" msgid="4110549342447630629">"Nomor Penelepon Masuk"</string> <string name="ClirMmi" msgid="6752346475055446417">"Menyembunyikan ID Penelepon untuk Panggilan Keluar"</string> - <string name="ColpMmi" msgid="4736462893284419302">"ID Saluran yang Tersambung"</string> - <string name="ColrMmi" msgid="5889782479745764278">"Batasan ID Saluran yang Tersambung"</string> + <string name="ColpMmi" msgid="4736462893284419302">"ID Saluran yang Terhubung"</string> + <string name="ColrMmi" msgid="5889782479745764278">"Batasan ID Saluran yang Terhubung"</string> <string name="CfMmi" msgid="8390012691099787178">"Penerusan panggilan"</string> <string name="CwMmi" msgid="3164609577675404761">"Nada tunggu"</string> <string name="BaMmi" msgid="7205614070543372167">"Pemblokiran panggilan"</string> @@ -162,7 +162,7 @@ <string name="httpErrorUnsupportedAuthScheme" msgid="3976195595501606787">"Skema autentikasi situs tidak didukung."</string> <string name="httpErrorAuth" msgid="469553140922938968">"Tidak dapat mengautentikasi."</string> <string name="httpErrorProxyAuth" msgid="7229662162030113406">"Autentikasi via proxy server gagal."</string> - <string name="httpErrorConnect" msgid="3295081579893205617">"Tidak dapat tersambung ke server."</string> + <string name="httpErrorConnect" msgid="3295081579893205617">"Tidak dapat terhubung ke server."</string> <string name="httpErrorIO" msgid="3860318696166314490">"Tidak dapat berkomunikasi dengan server. Coba lagi nanti."</string> <string name="httpErrorTimeout" msgid="7446272815190334204">"Koneksi ke server terputus."</string> <string name="httpErrorRedirectLoop" msgid="8455757777509512098">"Halaman ini berisi terlalu banyak pengalihan server."</string> @@ -468,7 +468,7 @@ <string name="permlab_accessImsCallService" msgid="442192920714863782">"akses layanan panggilan IMS"</string> <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"Memungkinkan aplikasi menggunakan layanan IMS untuk melakukan panggilan tanpa campur tangan Anda."</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"baca identitas dan status ponsel"</string> - <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Memungkinkan aplikasi mengakses fitur telepon perangkat. Izin ini memungkinkan aplikasi menentukan nomor telepon dan ID perangkat, apakah suatu panggilan aktif atau tidak, dan nomor jarak jauh yang tersambung oleh sebuah panggilan."</string> + <string name="permdesc_readPhoneState" msgid="7229063553502788058">"Memungkinkan aplikasi mengakses fitur telepon perangkat. Izin ini memungkinkan aplikasi menentukan nomor telepon dan ID perangkat, apakah suatu panggilan aktif atau tidak, dan nomor jarak jauh yang terhubung oleh sebuah panggilan."</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"sambungkan panggilan telepon melalui sistem"</string> <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"Mengizinkan aplikasi menyambungkan panggilan telepon melalui sistem untuk menyempurnakan pengalaman menelepon."</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"melihat dan mengontrol panggilan melalui sistem."</string> @@ -504,7 +504,7 @@ <string name="permdesc_getAccounts" product="tv" msgid="437604680436540822">"Mengizinkan aplikasi mendapatkan daftar akun yang dikenal oleh perangkat Android TV. Ini mungkin mencakup akun yang dibuat oleh aplikasi yang telah Anda instal."</string> <string name="permdesc_getAccounts" product="default" msgid="2491273043569751867">"Memungkinkan aplikasi mendapatkan daftar akun yang dikenal oleh ponsel. Ini mungkin termasuk akun yang dibuat oleh aplikasi yang telah Anda instal."</string> <string name="permlab_accessNetworkState" msgid="2349126720783633918">"lihat koneksi jaringan"</string> - <string name="permdesc_accessNetworkState" msgid="4394564702881662849">"Memungkinkan aplikasi melihat informasi tentang koneksi jaringan, misalnya jaringan yang ada dan tersambung."</string> + <string name="permdesc_accessNetworkState" msgid="4394564702881662849">"Memungkinkan aplikasi melihat informasi tentang koneksi jaringan, misalnya jaringan yang ada dan terhubung."</string> <string name="permlab_createNetworkSockets" msgid="3224420491603590541">"dapatkan akses jaringan penuh"</string> <string name="permdesc_createNetworkSockets" msgid="7722020828749535988">"Memungkinkan aplikasi membuat soket jaringan dan menggunakan protokol jaringan khusus. Browser dan aplikasi lain menyediakan sarana untuk mengirim data ke internet sehingga izin ini tidak diperlukan untuk mengirim data ke internet."</string> <string name="permlab_changeNetworkState" msgid="8945711637530425586">"ubah konektivitas jaringan"</string> @@ -512,7 +512,7 @@ <string name="permlab_changeTetherState" msgid="9079611809931863861">"mengubah konektivitas yang tertambat"</string> <string name="permdesc_changeTetherState" msgid="3025129606422533085">"Mengizinkan apl mengubah status konektivitas jaringan yang tertambat."</string> <string name="permlab_accessWifiState" msgid="5552488500317911052">"lihat sambungan Wi-Fi"</string> - <string name="permdesc_accessWifiState" msgid="6913641669259483363">"Memungkinkan aplikasi melihat informasi tentang jaringan Wi-Fi, misalnya apakah Wi-Fi diaktifkan dan nama perangkat Wi-Fi yang tersambung."</string> + <string name="permdesc_accessWifiState" msgid="6913641669259483363">"Memungkinkan aplikasi melihat informasi tentang jaringan Wi-Fi, misalnya apakah Wi-Fi diaktifkan dan nama perangkat Wi-Fi yang terhubung."</string> <string name="permlab_changeWifiState" msgid="7947824109713181554">"sambung dan putuskan Wi-Fi"</string> <string name="permdesc_changeWifiState" msgid="7170350070554505384">"Memungkinkan aplikasi menyambung ke dan memutus dari titik akses Wi-Fi, dan mengubah konfigurasi perangkat untuk jaringan Wi-Fi."</string> <string name="permlab_changeWifiMulticastState" msgid="285626875870754696">"Izinkan penerimaan Wi-Fi Multicast"</string> @@ -524,14 +524,14 @@ <string name="permdesc_bluetoothAdmin" product="tv" msgid="1623992984547014588">"Mengizinkan aplikasi mengonfigurasi Bluetooth di perangkat Android TV, serta menemukan dan menyambungkan dengan perangkat jarak jauh."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"Mengizinkan apl mengonfigurasi ponsel Bluetooth lokal, dan menemukan serta menyandingkan dengan perangkat jarak jauh."</string> <string name="permlab_accessWimaxState" msgid="7029563339012437434">"sambungkan dan putuskan dari WiMAX"</string> - <string name="permdesc_accessWimaxState" msgid="5372734776802067708">"Memungkinkan aplikasi menentukan apakah WiMAX diaktifkan dan informasi tentang jaringan WiMAX apa saja yang tersambung."</string> + <string name="permdesc_accessWimaxState" msgid="5372734776802067708">"Memungkinkan aplikasi menentukan apakah WiMAX diaktifkan dan informasi tentang jaringan WiMAX apa saja yang terhubung."</string> <string name="permlab_changeWimaxState" msgid="6223305780806267462">"Ganti status WiMAX"</string> <string name="permdesc_changeWimaxState" product="tablet" msgid="4011097664859480108">"Memungkinkan aplikasi menyambungkan tablet ke dan memutus tablet dari jaringan WiMAX."</string> <string name="permdesc_changeWimaxState" product="tv" msgid="5373274458799425276">"Mengizinkan aplikasi menghubungkan perangkat Android TV ke, dan memutuskan hubungan perangkat Android TV dari, jaringan WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="1551666203780202101">"Memungkinkan aplikasi menyambungkan ponsel ke dan memutus ponsel dari jaringan WiMAX."</string> <string name="permlab_bluetooth" msgid="586333280736937209">"sambungkan dengan perangkat Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"Memungkinkan aplikasi melihat konfigurasi Bluetooth di tablet, dan membuat serta menerima sambungan dengan perangkat yang disandingkan."</string> - <string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"Mengizinkan aplikasi melihat konfigurasi Bluetooth di perangkat Android TV, serta melakukan dan menerima sambungan dengan perangkat yang tersambung."</string> + <string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"Mengizinkan aplikasi melihat konfigurasi Bluetooth di perangkat Android TV, serta melakukan dan menerima sambungan dengan perangkat yang terhubung."</string> <string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"Memungkinkan aplikasi melihat konfigurasi Bluetooth di ponsel, dan membuat serta menerima sambungan dengan perangkat yang disandingkan."</string> <string name="permlab_bluetooth_scan" msgid="5402587142833124594">"temukan & sambungkan perangkat Bluetooth di sekitar"</string> <string name="permdesc_bluetooth_scan" product="default" msgid="6540723536925289276">"Mengizinkan aplikasi menemukan dan menyambungkan perangkat Bluetooth di sekitar"</string> @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Gunakan sidik jari atau kunci layar untuk melanjutkan"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikon sidik jari"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Masalah pada Face Unlock"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gunakan face lock atau kunci layar untuk melanjutkan"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ikon wajah"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"baca setelan sinkronisasi"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Memungkinkan aplikasi membaca setelan sinkronisasi untuk sebuah akun. Misalnya, izin ini dapat menentukan apakah aplikasi Orang disinkronkan dengan sebuah akun."</string> @@ -1365,7 +1369,7 @@ <string name="usb_ptp_notification_title" msgid="5043437571863443281">"PTP via USB diaktifkan"</string> <string name="usb_tether_notification_title" msgid="8828527870612663771">"Tethering USB diaktifkan"</string> <string name="usb_midi_notification_title" msgid="7404506788950595557">"MIDI via USB diaktifkan"</string> - <string name="usb_accessory_notification_title" msgid="1385394660861956980">"Aksesori USB tersambung"</string> + <string name="usb_accessory_notification_title" msgid="1385394660861956980">"Aksesori USB terhubung"</string> <string name="usb_notification_message" msgid="4715163067192110676">"Ketuk untuk opsi lainnya."</string> <string name="usb_power_notification_message" msgid="7284765627437897702">"Mengisi daya perangkat yang terhubung. Ketuk untuk opsi lainnya."</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Aksesori audio analog terdeteksi"</string> @@ -1497,9 +1501,9 @@ <string name="vpn_title" msgid="5906991595291514182">"VPN diaktifkan"</string> <string name="vpn_title_long" msgid="6834144390504619998">"VPN diaktifkan oleh <xliff:g id="APP">%s</xliff:g>"</string> <string name="vpn_text" msgid="2275388920267251078">"Ketuk untuk mengelola jaringan."</string> - <string name="vpn_text_long" msgid="278540576806169831">"Tersambung ke <xliff:g id="SESSION">%s</xliff:g>. Ketuk untuk mengelola jaringan."</string> + <string name="vpn_text_long" msgid="278540576806169831">"Terhubung ke <xliff:g id="SESSION">%s</xliff:g>. Ketuk untuk mengelola jaringan."</string> <string name="vpn_lockdown_connecting" msgid="6096725311950342607">"Menyambungkan VPN selalu aktif..."</string> - <string name="vpn_lockdown_connected" msgid="2853127976590658469">"VPN selalu aktif tersambung"</string> + <string name="vpn_lockdown_connected" msgid="2853127976590658469">"VPN selalu aktif terhubung"</string> <string name="vpn_lockdown_disconnected" msgid="5573611651300764955">"Terputus dari VPN yang selalu aktif"</string> <string name="vpn_lockdown_error" msgid="4453048646854247947">"Tidak dapat terhubung ke VPN yang selalu aktif"</string> <string name="vpn_lockdown_config" msgid="8331697329868252169">"Ubah setelan jaringan atau VPN"</string> @@ -1634,7 +1638,7 @@ <string name="media_route_chooser_extended_settings" msgid="2506352159381327741">"Setelan"</string> <string name="media_route_controller_disconnect" msgid="7362617572732576959">"Putuskan koneksi"</string> <string name="media_route_status_scanning" msgid="8045156315309594482">"Memindai..."</string> - <string name="media_route_status_connecting" msgid="5845597961412010540">"Menyambung..."</string> + <string name="media_route_status_connecting" msgid="5845597961412010540">"Menghubungkan..."</string> <string name="media_route_status_available" msgid="1477537663492007608">"Tersedia"</string> <string name="media_route_status_not_available" msgid="480912417977515261">"Tidak tersedia"</string> <string name="media_route_status_in_use" msgid="6684112905244944724">"Sedang digunakan"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Saat pintasan aktif, menekan kedua tombol volume selama 3 detik akan memulai fitur aksesibilitas."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Aktifkan pintasan untuk fitur aksesibilitas?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Menahan kedua tombol volume selama beberapa detik akan mengaktifkan fitur aksesibilitas. Tindakan ini dapat mengubah cara kerja perangkat Anda.\n\nFitur saat ini:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nAnda dapat mengubah fitur yang dipilih di Setelan > Aksesibilitas."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Aktifkan pintasan <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Menahan kedua tombol volume selama beberapa detik akan mengaktifkan <xliff:g id="SERVICE">%1$s</xliff:g>, yang merupakan fitur aksesibilitas. Tindakan ini dapat mengubah cara kerja perangkat Anda.\n\nAnda dapat mengubah pintasan ini ke fitur lain di Setelan > Aksesibilitas."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Aktifkan"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 93e25a6b014e..470a516c4b8c 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Notaðu fingrafar eða skjálás til að halda áfram"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Fingrafaratákn"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Andlitskenni"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Vandamál varðandi andlitskenni"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Notaðu andlitið eða skjálás til að halda áfram"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Andlitstákn"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"lesa samstillingar"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Leyfir forriti að lesa kosti samstillingar fyrir reikning. Þetta er til dæmis hægt að nota til að komast að því hvort forritið Fólk er samstillt við reikning."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Þegar flýtileiðin er virk er kveikt á aðgengiseiginleikanum með því að halda báðum hljóðstyrkshnöppunum inni í þrjár sekúndur."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Kveikja á flýtileið fyrir aðgangseiginleika?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Kveikt er á aðgengiseiginleikum þegar báðum hljóðstyrkstökkunum er haldið inni í nokkrar sekúndur. Þetta getur breytt því hvernig tækið virkar.\n\nNúverandi eiginleikar:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nÞú getur breytt völdum eiginleikum í Stillingar > Aðgengi."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Kveikja á flýtileið <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Ef báðum hljóðstyrkstökkunum er haldið inni í nokkrar sekúndur er kveikt á aðgengiseiginleikanum <xliff:g id="SERVICE">%1$s</xliff:g>. Þetta getur breytt því hvernig tækið virkar.\n\nÞú getur breytt þessari flýtileið í annan eiginleika í Stillingar > Aðgengi."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Kveikja"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 316514e6cc29..f60664319bf0 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -609,6 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Per continuare devi usare la tua impronta o il tuo blocco schermo"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Si è verificato un errore. Riprova."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icona dell\'impronta"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Sblocco con il volto"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problema con Sblocco con il volto"</string> @@ -661,6 +662,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Per continuare devi usare il tuo volto o il tuo blocco schermo"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Si è verificato un errore. Riprova."</string> <string name="face_icon_content_description" msgid="465030547475916280">"Icona volto"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"lettura impostazioni di sincronizz."</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Consente all\'applicazione di leggere le impostazioni di sincronizzazione per un account. Ad esempio, questa autorizzazione può determinare se l\'applicazione Persone è sincronizzata con un account."</string> @@ -1691,7 +1693,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Quando la scorciatoia è attiva, puoi premere entrambi i pulsanti del volume per tre secondi per avviare una funzione di accessibilità."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Vuoi attivare la scorciatoia per le funzioni di accessibilità?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Se tieni premuti entrambi i tasti del volume per qualche secondo, vengono attivate le funzioni di accessibilità. Questa operazione potrebbe modificare il funzionamento del dispositivo.\n\nFunzioni correnti:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nPuoi modificare le funzioni selezionate in Impostazioni > Accessibilità."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Vuoi attivare la scorciatoia per <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Se tieni premuti entrambi i tasti del volume per qualche secondo verrà attivata la funzione di accessibilità <xliff:g id="SERVICE">%1$s</xliff:g>. Questa operazione potrebbe modificare il funzionamento del dispositivo.\n\nPuoi associare questa scorciatoia a un\'altra funzionalità in Impostazioni > Accessibilità."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Attiva"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 716e97c70768..8a91d1bbad4d 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -615,6 +615,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"יש להשתמש בטביעת האצבע או בנעילת המסך כדי להמשיך"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"סמל טביעת אצבע"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"פתיחה ע\"י זיהוי הפנים"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"בעיה בפתיחה ע\"י זיהוי הפנים"</string> @@ -667,6 +669,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"יש להשתמש בזיהוי הפנים או בנעילת המסך כדי להמשיך"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"סמל הפנים"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"קריאת הגדרות הסנכרון"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"מאפשרת לאפליקציה לקרוא את הגדרות הסנכרון של חשבון. לדוגמה, כך אפשר לדעת אם האפליקציה \'אנשים\' מסונכרנת עם חשבון כלשהו."</string> @@ -1735,7 +1739,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"כשקיצור הדרך מופעל, לחיצה על שני לחצני עוצמת הקול למשך שלוש שניות מפעילה את תכונת הנגישות."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"האם להפעיל את מקש הקיצור לתכונות הנגישות?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"לחיצה ארוכה על שני לחצני עוצמת הקול למשך מספר שניות מפעילה את תכונות הנגישות. בעקבות זאת, ייתכן שאופן הפעולה של המכשיר ישתנה.\n\nהתכונות הנוכחיות:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nניתן לשנות את התכונות שנבחרו ב\'הגדרות\' > \'נגישות\'."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"האם להפעיל את מקש הקיצור של <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"לחיצה על שני מקשי עוצמת הקול למשך מספר שניות מפעילה את תכונת הנגישות <xliff:g id="SERVICE">%1$s</xliff:g>. ייתכן שאופן הפעולה של המכשיר ישתנה בעקבות זאת.\n\nאפשר לשנות את מקשי הקיצור האלה לתכונה אחרת ב\'הגדרות\' > \'נגישות\'."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"אני רוצה להפעיל"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 30a62e3d8df0..8e78e30bdbe1 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"続行するには、指紋認証または画面ロックを使用してください"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"指紋アイコン"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"顔認証"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"顔認証に関する問題"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"続行するには、顔認証または画面ロックを使用してください"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"顔アイコン"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"同期設定の読み取り"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"アカウントの同期設定の読み取りをアプリに許可します。たとえば、連絡帳アプリがアカウントと同期しているかどうかをアプリから特定できるようになります。"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ショートカットが ON の場合、両方の音量ボタンを 3 秒ほど長押しするとユーザー補助機能が起動します。"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"ユーザー補助機能のショートカットを ON にしますか?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"音量大と音量小の両方のボタンを数秒ほど長押しすると、ユーザー補助機能が ON になります。この機能が ON になると、デバイスの動作が変わることがあります。\n\n現在の機能:\n<xliff:g id="SERVICE">%1$s</xliff:g>\n選択した機能は [設定] > [ユーザー補助] で変更できます。"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> のショートカットを ON にしますか?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"音量大と音量小の両方のボタンを数秒ほど長押しすると、ユーザー補助機能の <xliff:g id="SERVICE">%1$s</xliff:g> が ON になります。この機能が ON になると、デバイスの動作が変わることがあります。\n\nこのショートカットは [設定] > [ユーザー補助] で別の機能に変更できます。"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ON にする"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 789e2794e083..58501aa0139d 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"გასაგრძელებლად გამოიყენეთ თქვენი თითის ანაბეჭდი ან ეკრანის განბლოკვის ნიმუში"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"თითის ანაბეჭდის ხატულა"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"განბლოკვა სახით"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"პრობლემა სახით განბლოკვასთან დაკავშირებით"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"გასაგრძელებლად გამოიყენეთ თქვენი სახე ან ეკრანის განბლოკვის ნიმუში"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"სახის ხატულა"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"სინქრონიზაციის პარამეტრების წაკითხვა"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"აპს შეეძლება, წაიკითხოს ანგარიშის სინქრონიზაციის პარამეტრები. მაგალითად, მას შეეძლება განსაზღვროს, არის თუ არა People აპი სინქრონიზებული ანგარიშთან."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"თუ მალსახმობი ჩართულია, ხმის ორივე ღილაკზე 3 წამის განმავლობაში დაჭერით მარტივი წვდომის ფუნქცია ჩაირთვება."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"ჩაირთოს მარტივი წვდომის ფუნქციების მალსახმობი?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"ხმის ორივე ღილაკზე ხანგრძლივად დაჭერა რამდენიმე წამის განმავლობაში ჩართავს მარტივი წვდომის ფუნქციებს. ამ ქმედებამ შეიძლება შეცვალოს თქვენი მოწყობილობის მუშაობის პრინციპი.\n\nამჟამინდელი ფუნქციები:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nარჩეული ფუნქციების შეცვლა შესაძლებელია აქ: პარამეტრები > მარტივი წვდომა."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"ჩაირთოს <xliff:g id="SERVICE">%1$s</xliff:g>-ის მალსახმობი?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"ხმის ორივე ღილაკზე რამდენიმე წამის განმავლობაში დაჭერით ჩაირთვება <xliff:g id="SERVICE">%1$s</xliff:g>, რომელიც მარტივი წვდომის ფუნქციაა. ამან შეიძლება შეცვალოს თქვენი მოწყობილობის მუშაობის პრინციპი.\n\nამ მალსახმობის შეცვლა სხვა ფუნქციით შეგიძლიათ აქ: პარამეტრები > აპები."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ჩართვა"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 6e8281326606..1b4b36f6b888 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Жалғастыру үшін саусақ ізін немесе экран құлпын пайдаланыңыз."</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Саусақ ізі белгішесі"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Бет тану"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Бет тану функциясына қатысты мәселе шықты"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Жалғастыру үшін бетті анықтау функциясын немесе экран құлпын пайдаланыңыз."</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Бет белгішесі"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"синх параметрлерін оқу"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Қолданбаға есептік жазба синхрондау параметрлерін оқу мүмкіндігін береді. Мысалы, бұл арқылы People қолданбасының есептік жазбамен сихрондалғаны анықталуы мүмкін."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Түймелер тіркесімі қосулы кезде, екі дыбыс түймесін 3 секунд басып тұрсаңыз, \"Арнайы мүмкіндіктер\" функциясы іске қосылады."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Арнайы мүмкіндіктердің жылдам пәрмені іске қосылсын ба?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Дыбыс деңгейі пернелерін бірнеше секунд басып тұрсаңыз, арнайы мүмкіндіктер іске қосылады. Бұл – құрылғының жұмысына әсер етуі мүмкін.\n\nҚазіргі функциялар:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nТаңдалған функцияларды \"Параметрлер > Арнайы мүмкіндіктер\" бөлімінен өзгерте аласыз."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> жылдам пәрмені іске қосылсын ба?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Дыбыс деңгейі пернелерін бірнеше секунд басып тұрсаңыз, <xliff:g id="SERVICE">%1$s</xliff:g> арнайы қызметі іске қосылады. Бұл – құрылғының жүмысына әсер етуі мүмкін.\n\nБұл таңбашаны басқа функцияға \"Параметрлер > Арнайы мүмкіндіктер\" бөлімінен өзгерте аласыз."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Қосылсын"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index d56a55ded4a9..c7eea0bf2277 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"ប្រើការចាក់សោអេក្រង់ ឬស្នាមម្រាមដៃរបស់អ្នក ដើម្បីបន្ត"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"រូបស្នាមម្រាមដៃ"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"ដោះសោតាមទម្រង់មុខ"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"មានបញ្ហាពាក់ព័ន្ធនឹងមុខងារដោះសោតាមទម្រង់មុខ"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ប្រើការចាក់សោអេក្រង់ ឬមុខរបស់អ្នក ដើម្បីបន្ត"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"រូបផ្ទៃមុខ"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"អានការកំណត់ធ្វើសមកាលកម្ម"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ឲ្យកម្មវិធីអានការកំណត់ធ្វើសមកាលកម្មសម្រាប់គណនី។ ឧទាហរណ៍ វាអាចកំណត់ថាតើកម្មវិធីត្រូវបានបើកជាមួយគណនីដែរឬទេ។"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"នៅពេលបើកផ្លូវកាត់ ការចុចប៊ូតុងកម្រិតសំឡេងទាំងពីររយៈពេល 3 វិនាទីនឹងចាប់ផ្តើមមុខងារភាពងាយប្រើ។"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"បើកផ្លូវកាត់សម្រាប់មុខងារភាពងាយស្រួលឬ?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"ការសង្កត់គ្រាប់ចុចកម្រិតសំឡេងទាំងពីរឱ្យជាប់រយៈពេលពីរបីវិនាទីនឹងបើកមុខងារភាពងាយប្រើ។ ការធ្វើបែបនេះអាចផ្លាស់ប្ដូររបៀបដែលឧបករណ៍របស់អ្នកដំណើរការ។\n\nមុខងារបច្ចុប្បន្ន៖\n<xliff:g id="SERVICE">%1$s</xliff:g>\nអ្នកអាចប្ដូរមុខងារដែលបានជ្រើសរើសនៅក្នុងការកំណត់ > ភាពងាយស្រួល។"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"បើកផ្លូវកាត់ <xliff:g id="SERVICE">%1$s</xliff:g> ឬ?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"ការសង្កត់គ្រាប់ចុចកម្រិតសំឡេងទាំងពីរឱ្យជាប់រយៈពេលពីរបីវិនាទីនឹងបើក <xliff:g id="SERVICE">%1$s</xliff:g> ដែលជាមុខងារភាពងាយប្រើ។ ការធ្វើបែបនេះអាចផ្លាស់ប្ដូររបៀបដែលឧបករណ៍របស់អ្នកដំណើរការ។\n\nអ្នកអាចប្ដូរផ្លូវកាត់នេះទៅមុខងារផ្សេងទៀតនៅក្នុងការកំណត់ > ភាពងាយស្រួល។"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"បើក"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index c5b57e96e24b..03ad2c5d2e42 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"ಮುಂದುವರಿಸಲು ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"ಫೇಸ್ ಅನ್ಲಾಕ್"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಕುರಿತು ಸಮಸ್ಯೆ ಇದೆ"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ಮುಂದುವರಿಸಲು ನಿಮ್ಮ ಮುಖ ಅಥವಾ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಬಳಸಿ"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"ಮುಖದ ಐಕಾನ್"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ರೀಡ್ ಮಾಡು"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ಒಂದು ಖಾತೆಯ ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಖಾತೆಯೊಂದಿಗೆ ಜನರ ಅಪ್ಲಿಕೇಶನ್ ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಇದು ನಿರ್ಧರಿಸಬಹುದು."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ಶಾರ್ಟ್ಕಟ್ ಆನ್ ಆಗಿರುವಾಗ, ಎರಡೂ ವಾಲ್ಯೂಮ್ ಬಟನ್ಗಳನ್ನು 3 ಸೆಕೆಂಡುಗಳ ಕಾಲ ಒತ್ತಿದರೆ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವೊಂದು ಪ್ರಾರಂಭವಾಗುತ್ತದೆ."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯಗಳಿಗಾಗಿ ಶಾರ್ಟ್ಕಟ್ ಆನ್ ಮಾಡಬೇಕೇ?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಕೆಲವು ಸೆಕೆಂಡುಗಳ ಕಾಲ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವುದರಿಂದ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯಗಳು ಆನ್ ಆಗುತ್ತವೆ. ಇದು ನಿಮ್ಮ ಸಾಧನವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಬದಲಾಯಿಸಬಹುದು.\n\n ಪ್ರಸ್ತುತ ವೈಶಿಷ್ಟ್ಯಗಳು:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿಯಲ್ಲಿ ಆಯ್ದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ನೀವು ಬದಲಾಯಿಸಬಹುದು."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"ಶಾರ್ಟ್ಕಟ್ <xliff:g id="SERVICE">%1$s</xliff:g>ಆನ್ ಮಾಡಬೇಕೇ?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಕೆಲವು ಸೆಕೆಂಡುಗಳ ಕಾಲ ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವುದರಿಂದ ಪ್ರವೇಶಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವಾದ <xliff:g id="SERVICE">%1$s</xliff:g> ಆನ್ ಆಗುತ್ತದೆ. ಇದು ನಿಮ್ಮ ಸಾಧನವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಬದಲಾಯಿಸಬಹುದು.\n\nನೀವು ಈ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಅಕ್ಸೆಸಿಬಿಲಿಟಿಯಲ್ಲಿನ ಮತ್ತೊಂದು ವೈಶಿಷ್ಟ್ಯಕ್ಕೆ ಬದಲಾಯಿಸಬಹುದು."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ಆನ್ ಮಾಡಿ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index ea8fe228896a..aa3df7373b85 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"계속하려면 지문이나 화면 잠금을 사용하세요"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"지문 아이콘"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"얼굴 인식 잠금 해제"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"얼굴 인식 잠금 해제 문제"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"계속하려면 얼굴 또는 화면 잠금을 사용하세요"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"얼굴 아이콘"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"동기화 설정 읽기"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"앱이 계정의 동기화 설정을 읽을 수 있도록 허용합니다. 예를 들어, 계정에서 주소록 앱을 동기화할지 여부를 확인할 수 있습니다."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"단축키가 사용 설정된 경우 볼륨 버튼 두 개를 동시에 3초간 누르면 접근성 기능이 시작됩니다."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"접근성 기능 바로가기를 사용 설정하시겠습니까?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"볼륨 키 2개를 몇 초 동안 길게 누르면 접근성 기능이 사용 설정됩니다. 이때 기기 작동 방식이 달라질 수 있습니다.\n\n현재 기능:\n<xliff:g id="SERVICE">%1$s</xliff:g>\n설정 > 접근성에서 선택한 기능을 변경할 수 있습니다."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> 바로가기를 사용 설정하시겠습니까?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"볼륨 키 2개를 몇 초 동안 길게 누르면 <xliff:g id="SERVICE">%1$s</xliff:g> 접근성 기능이 사용 설정됩니다. 이렇게 되면 기기 작동 방식이 달라질 수 있습니다.\n\n설정 > 접근성에서 이 단축키를 다른 기능으로 변경할 수 있습니다."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"사용"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 421608687033..cb6e3e439aa3 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Улантуу үчүн манжа изин же экрандын кулпусун колдонуңуз"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Манжа изинин сүрөтчөсү"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Жүзүнөн таанып ачуу"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Жүзүнөн таанып ачуу функциясында маселе келип чыкты"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Улантуу үчүн жүзүңүздү же экрандын кулпусун колдонуңуз"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Жүздүн сүрөтчөсү"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"шайкештирүү жөндөөлөрүн окуу"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Колдонмого эсеп менен синхрондошуу тууралоолорун окуганга уруксат берет. Мисалы, Кишилер колдонмосу эсеп менен синхрондошкондугун аныктай алат."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Атайын мүмкүнчүлүктөр функциясын пайдалануу үчүн ал күйгүзүлгөндө, үндү катуулатып/акырындаткан эки баскычты тең 3 секунддай коё бербей басып туруңуз."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Атайын мүмкүнчүлүктөрдүн ыкчам баскычын иштетесизби?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Атайын мүмкүнчүлүктөр функциясын иштетүү үчүн үндү чоңойтуп/кичирейтүү баскычтарын бир нече секунд коё бербей басып туруңуз. Ушуну менен, түзмөгүңүз бир аз башкача иштеп калышы мүмкүн.\n\nУчурдагы функциялар:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nТандалган функцияларды өзгөртүү үчүн Жөндөөлөр > Атайын мүмкүнчүлүктөр бөлүмүнө өтүңүз."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> ыкчам баскычын иштетесизби?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"<xliff:g id="SERVICE">%1$s</xliff:g> кызматын иштетүү үчүн үндү чоңойтуп/кичирейтүү баскычтарын бир нече секунд коё бербей басып туруңуз. Ушуну менен, түзмөгүңүз бир аз башкача иштеп калышы мүмкүн.\n\nБаскычтардын ушул айкалышын башка функцияга дайындоо үчүн, Жөндөөлөр > Атайын мүмкүнчүлүктөр бөлүмүнө өтүңүз."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Ооба"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index b1c0d591c4fb..e27cc1e1c8f4 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"ໃຊ້ລາຍນິ້ວມື ຫຼື ການລັອກໜ້າຈໍຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ໄອຄອນລາຍນິ້ວມື"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"ປົດລັອກດ້ວຍໜ້າ"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"ເກີດບັນຫາກັບການປົດລັອກດ້ວຍໜ້າ"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ໃຊ້ໃບໜ້າ ຫຼື ການລັອກໜ້າຈໍຂອງທ່ານເພື່ອດຳເນີນການຕໍ່"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"ໄອຄອນໃບໜ້າ"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ອ່ານການຕັ້ງຄ່າຊິ້ງຂໍ້ມູນ"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ອະນຸຍາດໃຫ້ແອັບຯ ອ່ານການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນຂອງບັນຊີໄດ້. ຕົວຢ່າງເຊັ່ນ: ມັນຈະສາມາດກວດສອບໄດ້ແອັບຯ People ຖືກຊິ້ງຂໍ້ມູນກັບບັນຊີໃດນຶ່ງແລ້ວຫຼືຍັງ."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ເມື່ອເປີດໃຊ້ທາງລັດແລ້ວ, ການກົດປຸ່ມລະດັບສຽງທັງສອງຄ້າງໄວ້ 3 ວິນາທີຈະເປັນການເລີ່ມຄຸນສົມບັດການຊ່ວຍເຂົ້າເຖິງ."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"ເປີດໃຊ້ທາງລັດສຳລັບຄຸນສົມບັດການຊ່ວຍເຂົ້າເຖິງບໍ?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"ກົດປຸ່ມລະດັບສຽງທັງສອງຄ້າງໄວ້ສອງສາມວິນາທີເພື່ອເປີດໃຊ້ຄຸນສົມບັດການຊ່ວຍເຂົ້າເຖິງ. ນີ້ອາດປ່ຽນວິທີການເຮັດວຽກຂອງອຸປະກອນທ່ານ.\n\nຄຸນສົມບັດປັດຈຸບັນ:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nທ່ານສາມາດປ່ຽນຄຸນສົມບັດທີ່ເລືອກໄດ້ໃນການຕັ້ງຄ່າ > ການຊ່ວຍເຂົ້າເຖິງ."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"ເປີດໃຊ້ທາງລັດ <xliff:g id="SERVICE">%1$s</xliff:g> ບໍ?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"ກົດປຸ່ມລະດັບສຽງທັງສອງຄ້າງໄວ້ສອງສາມວິນາທີເພື່ອເປີດໃຊ້ <xliff:g id="SERVICE">%1$s</xliff:g>, ຄຸນສົມບັດການຊ່ວຍເຂົ້າເຖິງ. ນີ້ອາດປ່ຽນວິທີການເຮັດວຽກຂອງອຸປະກອນທ່ານ.\n\nທ່ານສາມາດປ່ຽນທາງລັດນີ້ເປັນຄຸນສົມບັດອື່ນໄດ້ໃນການຕັ້ງຄ່າ > ການຊ່ວຍເຂົ້າເຖິງ."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ເປີດໃຊ້"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 1879dcc85513..6b95757b4307 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -615,6 +615,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Jei norite tęsti, naudokite kontrolinį kodą arba ekrano užraktą"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Piršto antspaudo piktograma"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Atrakinimas pagal veidą"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Su atrakinimu pagal veidą susijusi problema"</string> @@ -667,6 +669,8 @@ <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> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Veido pkt."</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"skaityti sinchronizavimo nustatymus"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Leidžiama programai skaityti ir sinchronizuoti paskyros nustatymus. Pvz., taip gali būti nustatoma, ar su paskyra sinchronizuota Žmonių programa."</string> @@ -1735,7 +1739,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Kai spartusis klavišas įjungtas, paspaudus abu garsumo mygtukus ir palaikius 3 sekundes bus įjungta pritaikymo neįgaliesiems funkcija."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Įjungti pritaikymo neįgaliesiems funkcijų spartųjį klavišą?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Paspaudus abu garsumo klavišus ir palaikius kelias sekundes įjungiamos pritaikymo neįgaliesiems funkcijos. Tai gali pakeisti įrenginio veikimą.\n\nDabartinės funkcijos:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nPasirinktas funkcijas galite pakeisti skiltyje „Nustatymai“ > „Pritaikomumas“."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Įjungti „<xliff:g id="SERVICE">%1$s</xliff:g>“ spartųjį klavišą?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Paspaudus abu garsumo klavišus ir palaikius kelias sekundes įjungiama pritaikymo neįgaliesiems funkcija „<xliff:g id="SERVICE">%1$s</xliff:g>“. Tai gali pakeisti įrenginio veikimą.\n\nGalite pakeisti šį spartųjį klavišą į kitą funkciją skiltyje „Nustatymai“ > „Pritaikomumas“."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Įjungti"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 15eda966c48c..da391406181a 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -612,6 +612,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Izmantojiet pirksta nospiedumu vai ekrāna bloķēšanas opciju, lai turpinātu"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Pirksta nospieduma ikona"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Autorizācija pēc sejas"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problēma ar autorizāciju pēc sejas"</string> @@ -664,6 +666,8 @@ <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> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Sejas ikona"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"lasīt sinhronizācijas iestatījumus"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Ļauj lietotnei lasīt konta sinhronizācijas iestatījumus. Piemēram, šādi var noteikt, vai lietotne Personas ir sinhronizēta ar kontu."</string> @@ -1713,7 +1717,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Kad īsinājumtaustiņš ir ieslēgts, nospiežot abas skaļuma pogas un 3 sekundes turot tās, tiks aktivizēta pieejamības funkcija."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Vai ieslēgt pieejamības funkciju saīsni?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Turot nospiestus abus skaļuma taustiņus dažas sekundes, tiek ieslēgtas pieejamības funkcijas. Tas var mainīt ierīces darbību.\n\nPašreizējās funkcijas:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nAtlasītās funkcijas varat mainīt šeit: Iestatījumi > Pieejamība."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Vai ieslēgt <xliff:g id="SERVICE">%1$s</xliff:g> saīsni?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Turot nospiestus abus skaļuma taustiņus dažas sekundes, tiek ieslēgta pieejamības funkcija <xliff:g id="SERVICE">%1$s</xliff:g>. Tas var mainīt ierīces darbību.\n\nŠo saīsni uz citu funkciju varat mainīt šeit: Iestatījumi > Pieejamība."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Ieslēgt"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index b29d49ef8dbe..e193c336a37c 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Користете го вашиот отпечаток или заклучување екран за да продолжите"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Икона за отпечатоци"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Отклучување со лик"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Проблем со „Отклучување со лик“"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Користете отклучување со лик или заклучување екран за да продолжите"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Икона"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"чита поставки за синхронизација"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Овозможува апликацијата да ги чита поставките за синхронизирање на сметка. На пример, така може да се утврди дали апликацијата „Луѓе“ е синхронизирана со сметка."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Кога е вклучена кратенката, ако ги притиснете двете копчиња за јачина на звук во времетраење од 3 секунди, ќе се стартува функција за пристапност."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Да се вклучи кратенка за функциите за пристапност?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Ако ги задржите притиснати двете копчиња за јачина на звук неколку секунди, ќе се вклучат функциите за пристапност. Ова може да го промени начинот на функционирање на уредот.\n\nТековни функции:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nМоже да ги промените избраните функции во „Поставки > Пристапност“."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Да се вклучи кратенка за <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Ако ги задржите притиснати двете копчиња за јачина на звук неколку секунди, ќе се вклучи функцијата за пристапност <xliff:g id="SERVICE">%1$s</xliff:g>. Ова може да го промени начинот на функционирање на уредот.\n\nМоже да ја измените кратенкава да биде за друга функција во „Поставки > Пристапност“."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Вклучи"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index fb7c4daa8e45..2bbaa3abfc52 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"തുടരാൻ നിങ്ങളുടെ ഫിംഗർപ്രിന്റ് അല്ലെങ്കിൽ സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ഫിംഗർപ്രിന്റ് ഐക്കൺ"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"ഫെയ്സ് അൺലോക്ക്"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"ഫെയ്സ് അൺലോക്കുമായി ബന്ധപ്പെട്ട പ്രശ്നം"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"തുടരാൻ നിങ്ങളുടെ മുഖം അല്ലെങ്കിൽ സ്ക്രീൻ ലോക്ക് ഉപയോഗിക്കുക"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"മുഖത്തിന്റെ ഐക്കൺ"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"സമന്വയ ക്രമീകരണങ്ങൾ റീഡുചെയ്യുക"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ഒരു അക്കൗണ്ടിനായി സമന്വയ ക്രമീകരണങ്ങൾ റീഡുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഉദാഹരണത്തിന്, ആളുകൾ അപ്ലിക്കേഷൻ ഒരു അക്കൗണ്ടിൽ സമന്വയിപ്പിച്ചിട്ടുണ്ടോയെന്നത് നിർണ്ണയിക്കാൻ ഇതിനാകും."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"കുറുക്കുവഴി ഓണായിരിക്കുമ്പോൾ, രണ്ട് വോളിയം ബട്ടണുകളും 3 സെക്കൻഡ് നേരത്തേക്ക് അമർത്തുന്നത് ഉപയോഗസഹായി ഫീച്ചർ ആരംഭിക്കും."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"ഉപയോഗസഹായി ഫീച്ചറുകൾക്കുള്ള കുറുക്കുവഴി ഓണാക്കണോ?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"രണ്ട് വോളിയം കീകളും അൽപ്പ നേരത്തേക്ക് അമർത്തിപ്പിടിക്കുന്നത്, ഉപയോഗസഹായി ഫീച്ചറുകൾ ഓണാക്കുന്നു. നിങ്ങളുടെ ഉപകരണം പ്രവർത്തിക്കുന്ന രീതിയെ ഇത് മാറ്റിയേക്കാം.\n\nനിലവിലുള്ള ഫീച്ചറുകൾ:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nതിരഞ്ഞെടുത്ത ഫീച്ചറുകൾ ക്രമീകരണം > ഉപയോഗസഹായി എന്നതിൽ മാറ്റാനാവും."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> കുറുക്കുവഴി ഓണാക്കണോ?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"രണ്ട് വോളിയം കീകളും അൽപ്പ നേരത്തേക്ക് അമർത്തിപ്പിടിക്കുന്നത് ഉപയോഗസഹായി ഫീച്ചറായ <xliff:g id="SERVICE">%1$s</xliff:g> എന്നതിനെ ഓണാക്കുന്നു. നിങ്ങളുടെ ഉപകരണം പ്രവർത്തിക്കുന്ന വിധം ഇത് മാറ്റിയേക്കാം.\n\nക്രമീകരണം > ഉപയോഗസഹായി എന്നതിലെ മറ്റൊരു ഫീച്ചറിലേക്ക് നിങ്ങൾക്ക് ഈ കുറുക്കുവഴി മാറ്റാനാവും."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ഓണാക്കുക"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 424401584b83..bac7aa79bc4a 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Үргэлжлүүлэхийн тулд хурууны хээ эсвэл дэлгэцийн түгжээгээ ашиглана уу"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Хурууны хээний дүрс"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Царайгаар түгжээ тайлах"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Царайгаар түгжээ тайлахтай холбоотой асуудал"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Үргэлжлүүлэхийн тулд царай эсвэл дэлгэцийн түгжээгээ ашиглана уу"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Царайны дүрс тэмдэг"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"синк тохиргоог унших"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Апп нь бүртгэлийн синк тохиргоог унших боломжтой. Жишээ нь энэ нь Хүмүүс апп бүртгэлтэй синк хийгдсэн эсэхийг тодорхойлох боломжтой."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Товчлол асаалттай үед дууны түвшний хоёр товчлуурыг хамтад нь 3 секунд дарснаар хандалтын онцлогийг эхлүүлнэ."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Хандалтын онцлогуудын товчлолыг асаах уу?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Дууны түвшний түлхүүрийг хэдэн секундийн турш зэрэг дарснаар хандалтын онцлогууд асна. Энэ нь таны төхөөрөмжийн ажиллах зарчмыг өөрчилж болзошгүй.\n\nОдоогийн онцлогууд:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nТа сонгосон онцлогуудыг Тохиргоо > Хандалт хэсэгт өөрчлөх боломжтой."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g>-н товчлолыг асаах уу?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Дууны түвшний түлхүүрийг хэдэн секундийн турш зэрэг дарах нь хандалтын онцлог болох <xliff:g id="SERVICE">%1$s</xliff:g>-г асаадаг. Энэ нь таны төхөөрөмжийн ажиллах зарчмыг өөрчилж болзошгүй.\n\nТа Тохиргоо > Хандалт хэсэгт энэ товчлолыг өөр онцлогт оноож өөрчлөх боломжтой."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Асаах"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 6b2cf96d6a4e..492c14d97f12 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"पुढे सुरू ठेवण्यासाठी तुमचे फिंगरप्रिंट किंवा स्क्रीन लॉक वापरा"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"फिंगरप्रिंट आयकन"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"फेस अनलॉक"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"फेस अनलॉकसंबंधित समस्या"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"पुढे सुरू ठेवण्यासाठी तुमचा चेहरा किंवा स्क्रीन लॉक वापरा"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"चेहरा आयकन"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"सिंक सेटिंग्ज वाचा"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"खात्याच्या सिंक सेटिंग्ज वाचण्यासाठी अॅप ला अनुमती देते. उदाहरणार्थ, हे खात्यासह लोकांचा अॅप संकालित केला आहे किंवा नाही हे निर्धारित करू शकते."</string> @@ -1040,7 +1044,7 @@ <string name="menu_delete_shortcut_label" msgid="4365787714477739080">"हटवा"</string> <string name="search_go" msgid="2141477624421347086">"Search"</string> <string name="search_hint" msgid="455364685740251925">"शोधा…"</string> - <string name="searchview_description_search" msgid="1045552007537359343">"Search"</string> + <string name="searchview_description_search" msgid="1045552007537359343">"शोधा"</string> <string name="searchview_description_query" msgid="7430242366971716338">"शोध क्वेरी"</string> <string name="searchview_description_clear" msgid="1989371719192982900">"क्वेरी साफ करा"</string> <string name="searchview_description_submit" msgid="6771060386117334686">"क्वेरी सबमिट करा"</string> @@ -1467,7 +1471,7 @@ <string name="tutorial_double_tap_to_zoom_message_short" msgid="1842872462124648678">"झूम नियंत्रणासाठी दोनदा टॅप करा"</string> <string name="gadget_host_error_inflating" msgid="2449961590495198720">"विजेट जोडू शकलो नाही."</string> <string name="ime_action_go" msgid="5536744546326495436">"जा"</string> - <string name="ime_action_search" msgid="4501435960587287668">"Search"</string> + <string name="ime_action_search" msgid="4501435960587287668">"शोधा"</string> <string name="ime_action_send" msgid="8456843745664334138">"पाठवा"</string> <string name="ime_action_next" msgid="4169702997635728543">"पुढे"</string> <string name="ime_action_done" msgid="6299921014822891569">"पूर्ण झाले"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"शॉर्टकट सुरू असताना, दोन्ही व्हॉल्यूम बटणे तीन सेकंदांसाठी दाबून ठेवल्याने अॅक्सेसिबिलिटी वैशिष्ट्य सुरू होईल."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"अॅक्सेसिबिलिटी वैशिष्ट्यांसाठी शॉर्टकट सुरू करायचा आहे का?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"दोन्ही व्हॉल्यूम की काही सेकंद धरून ठेवल्याने अॅक्सेसिबिलिटी वैशिष्ट्ये सुरू होतात. यामुळे तुमचे डिव्हाइस कसे काम करते हे पूर्णपणे बदलते.\n\nसध्याची वैशिष्ट्ये:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nतुम्ही हा शॉर्टकट सेटिंग्ज > अॅक्सेसिबिलिटी मध्ये बदलू शकता."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> शॉर्टकट सुरू करायचा आहे का?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"दोन्ही व्हॉल्यूम की काही सेकंद धरून ठेवल्याने <xliff:g id="SERVICE">%1$s</xliff:g>, एक अॅक्सेसिबिलिटी वैशिष्ट्य सुरू होते. यामुळे तुमचे डिव्हाइस कसे काम करते हे पूर्णपणे बदलते.\n\nतुम्ही हा शॉर्टकट सेटिंग्ज > अॅक्सेसिबिलिटी मध्ये बदलू शकता."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"सुरू करा"</string> @@ -1972,7 +1977,7 @@ <string name="language_picker_section_suggested" msgid="6556199184638990447">"सुचवलेल्या भाषा"</string> <string name="language_picker_section_all" msgid="1985809075777564284">"सर्व भाषा"</string> <string name="region_picker_section_all" msgid="756441309928774155">"सर्व प्रदेश"</string> - <string name="locale_search_menu" msgid="6258090710176422934">"Search"</string> + <string name="locale_search_menu" msgid="6258090710176422934">"शोध"</string> <string name="app_suspended_title" msgid="888873445010322650">"अॅप उपलब्ध नाही"</string> <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> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 0bf24d7bcc10..2af0cf09750a 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Gunakan cap jari atau kunci skrin anda untuk meneruskan"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikon cap jari"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Buka Kunci Wajah"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Isu dengan Buka Kunci Wajah"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gunakan wajah atau kunci skrin anda untuk meneruskan"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ikon wajah"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"membaca tetapan penyegerakan"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Membenarkan apl membaca tetapan segerak untuk akaun. Sebagai contoh, ini boleh menentukan sama ada apl Orang disegerakkan dengan akaun."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Apabila pintasan dihidupkan, tindakan menekan kedua-dua butang kelantangan selama 3 saat akan memulakan ciri kebolehaksesan."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Hidupkan pintasan untuk ciri kebolehaksesan?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Tindakan menahan kedua-dua kekunci kelantangan selama beberapa saat akan menghidupkan ciri kebolehaksesan. Hal ini mungkin mengubah cara peranti anda berfungsi.\n\nCiri semasa:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nAnda boleh menukar ciri yang dipilih dalam Tetapan > Kebolehaksesan."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Hidupkan pintasan <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Tindakan menahan kedua-dua kekunci kelantangan selama beberapa saat akan menghidupkan <xliff:g id="SERVICE">%1$s</xliff:g>, iaitu satu ciri kebolehaksesan. Ini mungkin mengubah cara peranti anda berfungsi.\n\nAnda boleh menukar pintasan ini kepada ciri lain dalam Tetapan > Kebolehaksesan."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Hidupkan"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 14409d895099..10fd2e131622 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -609,6 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"ရှေ့ဆက်ရန် သင်၏ လက်ဗွေ (သို့) ဖန်သားပြင်လော့ခ်ကို သုံးပါ"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"တစ်ခုခုမှားသွားသည်။ ထပ်စမ်းကြည့်ပါ။"</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"လက်ဗွေ သင်္ကေတ"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"မျက်နှာပြ လော့ခ်ဖွင့်ခြင်း"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"‘မျက်နှာပြ လော့ခ်ဖွင့်ခြင်း’ ဆိုင်ရာ ပြဿနာ"</string> @@ -661,6 +662,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ရှေ့ဆက်ရန် သင်၏ မျက်နှာ (သို့) ဖန်သားပြင်လော့ခ်ကို သုံးပါ"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"တစ်ခုခုမှားသွားသည်။ ထပ်စမ်းကြည့်ပါ။"</string> <string name="face_icon_content_description" msgid="465030547475916280">"မျက်နှာသင်္ကေတ"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ထပ်တူပြုအဆင်အပြင်အားဖတ်ခြင်း"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"အပလီကေးရှင်းအား အကောင့်တစ်ခုအတွက် ထပ်တူညီအောင် လုပ်ဆောင်မှု ဆက်တင်အား ကြည့်ခွင့် ပြုပါ။ ဥပမာ People အက်ပ်က အကောင့်တစ်ခုနဲ့ ထပ်တူညီအောင် လုပ်ရန် ဆက်သွယ်ထားမှု ရှိမရှိ သိရှိနိုင်ခြင်း"</string> @@ -1691,7 +1693,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ဖြတ်လမ်းလင့်ခ်ကို ဖွင့်ထားစဉ် အသံထိန်းခလုတ် နှစ်ခုစလုံးကို ၃ စက္ကန့်ခန့် ဖိထားခြင်းဖြင့် အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုကို ဖွင့်နိုင်သည်။"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုများအတွက် ဖြတ်လမ်းကို ဖွင့်မလား။"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားခြင်းက အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုများ ဖွင့်ပေးသည်။ ဤလုပ်ဆောင်ချက်က သင့်စက်အလုပ်လုပ်ပုံကို ပြောင်းလဲနိုင်သည်။\n\nလက်ရှိ ဝန်ဆောင်မှုများ-\n<xliff:g id="SERVICE">%1$s</xliff:g>\n\'ဆက်တင်များ > အများသုံးစွဲနိုင်မှု\' တွင် ရွေးထားသည့် ဝန်ဆောင်မှုများကို ပြောင်းနိုင်သည်။"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> ဖြတ်လမ်းကို ဖွင့်မလား။"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားခြင်းက အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုဖြစ်သော <xliff:g id="SERVICE">%1$s</xliff:g> ကို ဖွင့်ပေးသည်။ ဤလုပ်ဆောင်ချက်က သင့်စက်အလုပ်လုပ်ပုံကို ပြောင်းလဲနိုင်သည်။\n\nဤဖြတ်လမ်းလင့်ခ်ကို \'ဆက်တင်များ > အများသုံးစွဲနိုင်မှု\' တွင် နောက်ဝန်ဆောင်မှုတစ်ခုသို့ ပြောင်းနိုင်သည်။"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ဖွင့်ရန်"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index d046447c82c8..ff76ed4b838e 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Bruk fingeravtrykket eller skjermlåsen for å fortsette"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikon for fingeravtrykk"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Ansiktslås"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problem med ansiktslås"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Bruk ansikts- eller skjermlåsen for å fortsette"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ansiktikon"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"lese synkroniseringsinnstillinger"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Lar appen lese synkroniseringsinnstillingene for en konto. For eksempel kan den finne ut om Personer-appen er synkronisert med en konto."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Når snarveien er på, starter en tilgjengelighetsfunksjon når du trykker inn begge volumknappene i tre sekunder."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Vil du slå på snarveien for tilgjengelighetsfunksjoner?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Hvis du holder inne volumtastene i noen sekunder, slås tilgjengelighetsfunksjoner på. Dette kan endre hvordan enheten din fungerer.\n\nNåværende funksjoner:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nDu kan endre valgte funksjoner i Innstillinger > Tilgjengelighet."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Vil du slå på <xliff:g id="SERVICE">%1$s</xliff:g>-snarveien?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Hvis du holder inne begge volumtastene i noen sekunder, slår du på <xliff:g id="SERVICE">%1$s</xliff:g>, en tilgjengelighetsfunksjon. Dette kan endre hvordan enheten din fungerer.\n\nDu kan endre denne snarveien til en annen funksjon i Innstillinger > Tilgjengelighet."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Slå på"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 6da40726d123..f4f30a751a35 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"जारी राख्न आफ्नो फिंगरप्रिन्ट वा स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"फिंगरप्रिन्ट आइकन"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"फेस अनलक"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"फेस अनलक सुविधामा अनुहार दर्ता गर्ने क्रममा त्रुटि भयो"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"जारी राख्न आफ्नो फेस वा स्क्रिन लक प्रयोग गरी पुष्टि गर्नुहोस्"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"अनुहारको आइकन"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"समीकरण सेटिङहरू पढ्नुहोस्"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"एपलाई खाताको लागि सिंक सेटिङहरू पढ्न अनुमति दिन्छ। उदाहरणको लागि यसले व्यक्तिहरको एप खातासँग सिंक भएको नभएको निर्धारण गर्न सक्दछ।"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"यो सर्टकट सक्रिय हुँदा, ३ सेकेन्डसम्म दुवै भोल्युम बटन थिच्नुले पहुँचसम्बन्धी कुनै सुविधा सुरु गर्ने छ।"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"एक्सेसिबिलिटीसम्बन्धी सुविधा प्रयोग गर्न सर्टकट अन गर्ने हो?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"केही सेकेन्डसम्म दुवै भोल्युम की थिचिराख्नुभयो भने पहुँचसम्बन्धी सुविधाहरू सक्रिय हुन्छ। यसले तपाईंको यन्त्रले काम गर्ने तरिका परिवर्तन गर्न सक्छ।\n\nहालका सुविधाहरू:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nतपाईं सेटिङ > पहुँचमा गएर चयन गरिएका सुविधाहरू परिवर्तन गर्न सक्नुहुन्छ।"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> प्रयोग गर्न सर्टकट अन गर्ने हो?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"केही सेकेन्डसम्म दुवै भोल्युम की थिचिराख्नुले <xliff:g id="SERVICE">%1$s</xliff:g> नामक पहुँचसम्बन्धी सुविधा सक्रिय गर्छ। यसले तपाईंको यन्त्रले काम गर्ने तरिका परिवर्तन गर्न सक्छ।\n\nतपाईं सेटिङ > पहुँचमा गई यो सर्टकटमार्फत अर्को सुविधा खुल्ने बनाउन सक्नुहुन्छ।"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"सक्रिय गरियोस्"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 75857ff45ccb..fd2692985568 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Gebruik je vingerafdruk of schermvergrendeling om door te gaan"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Vingerafdruk-icoon"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Ontgrendelen via gezichtsherkenning"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Probleem met Ontgrendelen via gezichtsherkenning"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gebruik je gezicht of schermvergrendeling om door te gaan"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Gezichtspictogram"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"synchronisatie-instellingen lezen"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Hiermee kan de app de synchronisatie-instellingen voor een account lezen. Dit kan bijvoorbeeld bepalen of de app Personen wordt gesynchroniseerd met een account."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Als de snelkoppeling aanstaat, houd je beide volumeknoppen 3 seconden ingedrukt om een toegankelijkheidsfunctie te starten."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Snelkoppeling voor toegankelijkheidsfuncties aanzetten?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Als je beide volumetoetsen een paar seconden ingedrukt houdt, zet je de toegankelijkheidsfuncties aan. Hierdoor kan de manier veranderen waarop je apparaat werkt.\n\nHuidige functies:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nJe kunt de geselecteerde functies wijzigen via Instellingen > Toegankelijkheid."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Snelkoppeling voor <xliff:g id="SERVICE">%1$s</xliff:g> aanzetten?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Als je beide volumetoetsen een paar seconden ingedrukt houdt, wordt de toegankelijkheidsfunctie <xliff:g id="SERVICE">%1$s</xliff:g> aangezet. Hierdoor kan de manier veranderen waarop je apparaat werkt.\n\nJe kunt deze sneltoets op een andere functie instellen via Instellingen > Toegankelijkheid."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Aanzetten"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 8ba02e606fb6..1c836f141875 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଟିପଚିହ୍ନ କିମ୍ବା ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ଟିପଚିହ୍ନ ଆଇକନ୍"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"ଫେସ୍ ଅନଲକ୍"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"ଫେସ୍ ଅନଲକ୍ ସହ ସମସ୍ୟା"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ଜାରି ରଖିବାକୁ ଆପଣଙ୍କ ଚେହେରା କିମ୍ବା ସ୍କ୍ରିନ୍ ଲକ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"ଫେସ୍ ଆଇକନ୍"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ସିଙ୍କ ସେଟିଙ୍ଗକୁ ପଢ଼ନ୍ତୁ"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ଏକ ଆକାଉଣ୍ଟ ପାଇଁ ସିଙ୍କ ସେଟିଙ୍ଗ ପଢ଼ିବାକୁ ଆପ୍ଟିକୁ ଅନୁମତି ଦିଏ। ଉଦାହରଣସ୍ୱରୂପ, ଲୋକଙ୍କ ଆପ୍ ଏକ ଆକାଉଣ୍ଟରେ ସିଙ୍କ ହୋଇଛି କି ନାହିଁ ଏହା ଜାଣିପାରେ।"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ସର୍ଟକଟ୍ ଚାଲୁ ଥିବା ବେଳେ, ଉଭୟ ଭଲ୍ୟୁମ୍ ବଟନ୍ 3 ସେକେଣ୍ଡ ପାଇଁ ଦବାଇବା ଦ୍ୱାରା ଏକ ଆକ୍ସେସବିଲିଟି ଫିଚର୍ ଆରମ୍ଭ ହେବ।"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"ଆକ୍ସେସିବିଲିଟୀ ଫିଚରଗୁଡ଼ିକ ପାଇଁ ସର୍ଟକଟ୍ ଚାଲୁ କରିବେ?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"କିଛି ସେକେଣ୍ଡ ପାଇଁ ଉଭୟ ଭଲ୍ୟୁମ୍ କୀ’କୁ ଧରି ରଖିବା ଫଳରେ ଆକ୍ସେସିବିଲିଟୀ ଫିଚରଗୁଡ଼ିକ ଚାଲୁ ହୁଏ। ଏହା ଆପଣଙ୍କ ଡିଭାଇସ୍ କିପରି କାମ କରେ ତାହା ପରିବର୍ତ୍ତନ କରିପାରେ।\n\nବର୍ତ୍ତମାନର ଫିଚରଗୁଡ଼ିକ:\n<xliff:g id="SERVICE">%1$s</xliff:g>\n ଆପଣ ସେଟିଂସ୍ &gt ଆକ୍ସେସିବିଲିଟୀରେ ଚୟନିତ ଫିଚରଗୁଡ଼ିକୁ ପରିବର୍ତ୍ତନ କରିପାରିବେ।"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> ସର୍ଟକଟ୍ ଚାଲୁ କରିବେ?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"କିଛି ସେକେଣ୍ଡ ପାଇଁ ଉଭୟ ଭଲ୍ୟୁମ୍ କୀ’କୁ ଧରି ରଖିବା ଫଳରେ ଏକ ଆକ୍ସେସିବିଲିଟୀ ଫିଚର୍ <xliff:g id="SERVICE">%1$s</xliff:g> ଚାଲୁ ହୁଏ। ଏହା ଆପଣଙ୍କ ଡିଭାଇସ୍ କିପରି କାମ କରେ ତାହା ପରିବର୍ତ୍ତନ କରିପାରେ।\n\nଆପଣ ସେଟିଂସ୍ &gt ଆକ୍ସେସିବିଲିଟୀରେ ଏହି ସର୍ଚକଟକୁ ଅନ୍ୟ ଏକ ଫିଚରରେ ପରିବର୍ତ୍ତନ କରିପାରିବେ।"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ଚାଲୁ କରନ୍ତୁ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 209c6a1fb88c..7788bf34ac41 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਤੀਕ"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"ਫ਼ੇਸ ਅਣਲਾਕ"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"ਫ਼ੇਸ ਅਣਲਾਕ ਨਾਲ ਸਮੱਸਿਆ"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣਾ ਚਿਹਰਾ ਜਾਂ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"ਚਿਹਰਾ ਪ੍ਰਤੀਕ"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ਸਿੰਕ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹੋ"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ਐਪ ਨੂੰ ਕਿਸੇ ਖਾਤੇ ਲਈ ਸਮਕਾਲੀਕਰਨ ਸੈਟਿੰਗਾਂ ਪੜ੍ਹਨ ਦੇ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਇਹ ਪਤਾ ਕਰ ਸਕਦਾ ਹੈ ਕਿ People ਐਪ ਦਾ ਕਿਸੇ ਖਾਤੇ ਨਾਲ ਸਮਕਾਲੀਕਿਰਤ ਕੀਤਾ ਗਿਆ ਹੈ ਜਾਂ ਨਹੀਂ।"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ਸ਼ਾਰਟਕੱਟ ਚਾਲੂ ਹੋਣ \'ਤੇ, ਕਿਸੇ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ ਬਟਨਾਂ ਨੂੰ 3 ਸਕਿੰਟ ਲਈ ਦਬਾ ਕੇ ਰੱਖੋ।"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"ਕੀ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਲਈ ਸ਼ਾਰਟਕੱਟ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"ਕੁਝ ਸਕਿੰਟਾਂ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ੀ ਕੁੰਜੀਆਂ ਨੂੰ ਦਬਾਈ ਰੱਖਣਾ, ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਚਾਲੂ ਕਰ ਦਿੰਦਾ ਹੈ। ਇਹ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਕੰਮ ਕਰਨ ਦੇ ਤਰੀਕੇ ਨੂੰ ਬਦਲ ਸਕਦਾ ਹੈ।\n\nਮੌਜੂਦਾ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nਸੈਟਿੰਗਾਂ ਅਤੇ ਪਹੁੰਚਯੋਗਤਾ ਵਿੱਚ ਤੁਸੀਂ ਚੁਣੀਆਂ ਗਈਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ।"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"ਕੀ <xliff:g id="SERVICE">%1$s</xliff:g> ਸ਼ਾਰਟਕੱਟ ਚਾਲੂ ਕਰਨਾ ਹੈ?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"ਕੁਝ ਸਕਿੰਟਾਂ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ੀ ਕੁੰਜੀਆਂ ਨੂੰ ਦਬਾਈ ਰੱਖਣਾ <xliff:g id="SERVICE">%1$s</xliff:g>, ਇੱਕ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਚਾਲੂ ਕਰ ਦਿੰਦਾ ਹੈ। ਇਹ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦੇ ਕੰਮ ਕਰਨ ਦੇ ਤਰੀਕੇ ਨੂੰ ਬਦਲ ਸਕਦਾ ਹੈ।\n\nਸੈਟਿੰਗਾਂ ਅਤੇ ਪਹੁੰਚਯੋਗਤਾ ਵਿੱਚ ਤੁਸੀਂ ਇਸ ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਕਿਸੇ ਹੋਰ ਵਿਸ਼ੇਸ਼ਤਾ ਵਿੱਚ ਬਦਲ ਸਕਦੇ ਹੋ।"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ਚਾਲੂ ਕਰੋ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index b72b0000ce00..3b90bc4837a5 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -615,6 +615,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Aby kontynuować, użyj odcisku palca lub blokady ekranu"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona odcisku palca"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Rozpoznawanie twarzy"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problem z rozpoznawaniem twarzy"</string> @@ -667,6 +669,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Aby kontynuować, użyj rozpoznawania twarzy lub blokady ekranu"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ikona twarzy"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"czytanie ustawień synchronizacji"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Zezwala aplikacji na odczyt ustawień synchronizacji konta. Pozwala to na przykład określić, czy aplikacja Ludzie jest zsynchronizowana z kontem."</string> @@ -1735,7 +1739,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Gdy skrót jest włączony, jednoczesne naciskanie przez trzy sekundy obu przycisków głośności uruchamia funkcję ułatwień dostępu."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Włączyć skrót ułatwień dostępu?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Przytrzymanie obu klawiszy głośności przez kilka sekund włącza ułatwienia dostępu. Może to zmienić sposób działania urządzenia.\n\nBieżące funkcje:\n<xliff:g id="SERVICE">%1$s</xliff:g>\naby zmienić wybrane funkcje, kliknij Ustawienia > Ułatwienia dostępu."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Włączyć skrót <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Przytrzymanie obu klawiszy głośności przez kilka sekund włącza usługę <xliff:g id="SERVICE">%1$s</xliff:g>, stanowiącą ułatwienie dostępu. Może to zmienić sposób działania urządzenia.\n\nAby zmienić ten skrót i wskazać inną funkcję, kliknij Ustawienia > Ułatwienia dostępu."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Włącz"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 8198ae939e3b..a38c6c6ec1a2 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -609,6 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Use sua impressão digital ou o bloqueio de tela para continuar"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Algo deu errado. Tente de novo."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ícone de impressão digital"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Desbloqueio facial"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problema com o Desbloqueio facial"</string> @@ -661,6 +662,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use seu rosto ou o bloqueio de tela para continuar"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Algo deu errado. Tente de novo."</string> <string name="face_icon_content_description" msgid="465030547475916280">"Ícone facial"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ler as configurações de sincronização"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Permite que o app leia as configurações de sincronização de uma conta. Por exemplo, pode determinar se o app People está sincronizado com uma conta."</string> @@ -1691,7 +1693,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Quando o atalho estiver ativado, pressione os dois botões de volume por três segundos para iniciar um recurso de acessibilidade."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Ativar atalho para recursos de acessibilidade?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Manter as duas teclas de volume pressionadas por alguns segundos ativa os recursos de acessibilidade. Isso pode mudar a forma como seu dispositivo funciona.\n\nRecursos atuais:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nÉ possível mudar os recursos selecionados em \"Config. > Acessibilidade\"."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Ativar atalho para <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Manter as duas teclas de volume pressionadas por alguns segundos ativa o serviço <xliff:g id="SERVICE">%1$s</xliff:g>, um recurso de acessibilidade. Isso pode mudar a forma como seu dispositivo funciona.\n\nÉ possível trocar o uso desse atalho para outro recurso em \"Config. > Acessibilidade\"."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Ativar"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 5a336ae237e5..0f5ddd945959 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -609,6 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Utilize a impressão digital ou o bloqueio de ecrã para continuar"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Algo correu mal. Tente novamente."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ícone de impressão digital"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Desbloqueio facial"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problema com o Desbloqueio facial"</string> @@ -661,6 +662,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Utilize o rosto ou o bloqueio de ecrã para continuar"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Algo correu mal. Tente novamente."</string> <string name="face_icon_content_description" msgid="465030547475916280">"Ícone de rosto"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ler definições de sincronização"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Permite que a app leia as definições de sincronização de uma conta. Por exemplo, pode determinar se a app Pessoas está sincronizada com uma conta."</string> @@ -1691,7 +1693,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Quando o atalho está ativado, premir ambos os botões de volume durante 3 segundos inicia uma funcionalidade de acessibilidade."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Pretende ativar o atalho das funcionalidades de acessibilidade?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Manter premidas ambas as teclas de volume durante alguns segundos ativa as funcionalidades de acessibilidade. Estas podem alterar a forma como o seu dispositivo funciona.\n\nFuncionalidades atuais:\n<xliff:g id="SERVICE">%1$s</xliff:g>\npode alterar as funcionalidades selecionadas em Definições > Acessibilidade."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Pretende ativar o atalho do serviço <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Manter premidas ambas as teclas de volume durante alguns segundos ativa o serviço <xliff:g id="SERVICE">%1$s</xliff:g>, uma funcionalidade de acessibilidade. Esta pode alterar a forma como o seu dispositivo funciona.\n\nPode alterar este atalho para outra funcionalidade em Definições > Acessibilidade."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Ativar"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 8198ae939e3b..a38c6c6ec1a2 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -609,6 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Use sua impressão digital ou o bloqueio de tela para continuar"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Algo deu errado. Tente de novo."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ícone de impressão digital"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Desbloqueio facial"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problema com o Desbloqueio facial"</string> @@ -661,6 +662,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Use seu rosto ou o bloqueio de tela para continuar"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Algo deu errado. Tente de novo."</string> <string name="face_icon_content_description" msgid="465030547475916280">"Ícone facial"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ler as configurações de sincronização"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Permite que o app leia as configurações de sincronização de uma conta. Por exemplo, pode determinar se o app People está sincronizado com uma conta."</string> @@ -1691,7 +1693,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Quando o atalho estiver ativado, pressione os dois botões de volume por três segundos para iniciar um recurso de acessibilidade."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Ativar atalho para recursos de acessibilidade?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Manter as duas teclas de volume pressionadas por alguns segundos ativa os recursos de acessibilidade. Isso pode mudar a forma como seu dispositivo funciona.\n\nRecursos atuais:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nÉ possível mudar os recursos selecionados em \"Config. > Acessibilidade\"."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Ativar atalho para <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Manter as duas teclas de volume pressionadas por alguns segundos ativa o serviço <xliff:g id="SERVICE">%1$s</xliff:g>, um recurso de acessibilidade. Isso pode mudar a forma como seu dispositivo funciona.\n\nÉ possível trocar o uso desse atalho para outro recurso em \"Config. > Acessibilidade\"."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Ativar"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index ae0a62901a94..02a5a56f40c5 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -612,6 +612,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Folosiți amprenta sau blocarea ecranului pentru a continua"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Pictograma amprentă"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Deblocare facială"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problemă cu Deblocarea facială"</string> @@ -664,6 +666,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Folosiți-vă chipul sau blocarea ecranului pentru a continua"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Pictograma chip"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"citire setări sincronizare"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Permite aplicației să citească setările de sincronizare ale unui cont. De exemplu, cu această permisiune aplicația poate determina dacă aplicația Persoane este sincronizată cu un anumit cont."</string> @@ -1713,7 +1717,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Atunci când comanda rapidă este activată, dacă apăsați ambele butoane de volum timp de trei secunde, veți lansa o funcție de accesibilitate."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Activați comanda rapidă pentru funcțiile de accesibilitate?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Dacă apăsați ambele taste de volum câteva secunde, activați funcțiile de accesibilitate. Acest lucru poate schimba funcționarea dispozitivului.\n\nFuncțiile actuale:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nPuteți schimba funcțiile selectate din Setări > Accesibilitate."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Activați comanda rapidă <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Dacă apăsați ambele taste de volum câteva secunde, activați funcția de accesibilitate <xliff:g id="SERVICE">%1$s</xliff:g>. Acest lucru poate schimba funcționarea dispozitivului.\n\nPuteți alege altă funcție pentru această comandă în Setări > Accesibilitate."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Activați"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 8d3edf1d79e3..f78bba2b9926 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -615,6 +615,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Чтобы продолжить, используйте отпечаток пальца или данные для разблокировки экрана."</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Значок отпечатка пальца"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Фейсконтроль"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Ошибка фейсконтроля"</string> @@ -667,6 +669,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Чтобы продолжить, посмотрите на экран или используйте данные для разблокировки."</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Значок лица"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"Просмотр настроек синхронизации"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Приложение сможет просматривать настройки синхронизации аккаунта, например определять, включена ли синхронизация для приложения \"Контакты\"."</string> @@ -1735,7 +1739,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Чтобы использовать функцию специальных возможностей, когда она включена, нажмите и удерживайте обе кнопки регулировки громкости в течение трех секунд."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Использовать быстрое включение?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Чтобы включить специальные возможности, нажмите обе кнопки регулировки громкости и удерживайте несколько секунд. Обратите внимание, что в работе устройства могут произойти изменения.\n\nТекущие функции:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nЧтобы изменить выбранные функции, перейдите в настройки и нажмите \"Специальные возможности\"."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Использовать быстрое включение сервиса \"<xliff:g id="SERVICE">%1$s</xliff:g>\"?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Чтобы включить функцию \"<xliff:g id="SERVICE">%1$s</xliff:g>\", нажмите обе кнопки регулировки громкости на несколько секунд. Обратите внимание, что в работе устройства могут произойти изменения.\n\nЧтобы назначить это сочетание клавиш другой функции, перейдите в настройки и выберите \"Специальные возможности\"."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Включить"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 132ee6f261c7..0fdb547e7c72 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"ඉදිරියට යාමට ඔබගේ ඇඟිලි සලකුණ හෝ තිර අගුල භාවිත කරන්න"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ඇඟිලි සලකුණු නිරූපකය"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"මුහුණෙන් අගුළු හැරීම"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"මුහුණෙන් අගුලු හැරීම සම්බන්ධව ගැටලුවකි"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ඉදිරියට යාමට ඔබගේ මුහුණු හෝ තිර අගුල භාවිත කරන්න"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"මුහුණ නිරූපකය"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"සමමුහුර්ත සැකසීම් කියවන්න"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ගිණුම සඳහා සමමුහුර්ත සැකසීම් කියවීමට යෙදුමට අවසර දෙන්න. උදාහරණයක් ලෙස, ගිණුමක් සමඟ පුද්ගල යෙදුම සමමුහුර්ත දැයි මෙයට හඳුනා ගත හැක."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"කෙටිමග ක්රියාත්මක විට, හඬ පරිමා බොත්තම් දෙකම තත්පර 3ක් තිස්සේ එබීමෙන් ප්රවේශ්යතා විශේෂාංගය ආරම්භ වනු ඇත."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"ප්රවේශ්යතා විශේෂාංග සඳහා කෙටි මග ක්රියාත්මක කරන්නද?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"හඬ පරිමා යතුරු දෙකම තත්පර කීපයකට පහළට අල්ලාගෙන සිටීම ප්රවේශ්යතා විශේෂාංග ක්රියාත්මක කරයි. මෙය ඔබේ උපාංගය ක්රියා කරන ආකාරය වෙනස් කළ හැකිය.\n\nවත්මන් විශේෂාංග:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nඔබට තේරූ විශේෂාංග සැකසීම් > ප්රවේශ්යතාව හි වෙනස් කළ හැකිය."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> කෙටි මග ක්රියාත්මක කරන්නද?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"හඬ පරිමා යතුරු දෙකම තත්පර කීපයකට පහළට අල්ලාගෙන සිටීම ප්රවේශ්යතා විශේෂාංගයක් වන <xliff:g id="SERVICE">%1$s</xliff:g> ක්රියාත්මක කරයි. මෙය ඔබේ උපාංගය ක්රියා කරන ආකාරය වෙනස් කළ හැකිය.\n\nඔබට මෙම කෙටිමග සැකසීම් > ප්රවේශ්යතාව හි තවත් විශේෂාංගයකට වෙනස් කළ හැකිය."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ක්රියාත්මක කරන්න"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 083c8464957e..b626cc8a3ec3 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -615,6 +615,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Pokračujte použitím odtlačku prsta alebo zámky obrazovky"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona odtlačku prsta"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Odomknutie tvárou"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problém s odomknutím tvárou"</string> @@ -667,6 +669,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Pokračujte použitím tváre alebo zámky obrazovky"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ikona tváre"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"čítať nastavenia synchronizácie"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Umožňuje aplikácii čítať nastavenia synchronizácie v účte. Môže napríklad určiť, či je s účtom synchronizovaná aplikácia Ľudia."</string> @@ -1735,7 +1739,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Keď je skratka zapnutá, stlačením obidvoch tlačidiel hlasitosti na tri sekundy spustíte funkciu dostupnosti."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Chcete zapnúť skratku pre funkcie dostupnosti?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Pridržaním oboch tlačidiel hlasitosti na niekoľko sekúnd zapnete funkcie dostupnosti. Môže sa tým zmeniť spôsob fungovania vášho zariadenia.\n\nAktuálne funkcie:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nVybrané funkcie môžete zmeniť v časti Nastavenia > Dostupnosť."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Chcete zapnúť skratku na službu <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Pridržaním oboch klávesov hlasitosti na niekoľko sekúnd zapnete funkciu dostupnosti <xliff:g id="SERVICE">%1$s</xliff:g>. Môže sa tým zmeniť spôsob fungovania vášho zariadenia.\n\nTúto skratku môžete zmeniť na inú funkciu v časti Nastavenia > Dostupnosť."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Zapnúť"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index d632e0c53b6f..9619cf14b762 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -615,6 +615,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Za nadaljevanje uporabite prstni odtis ali odklepanje s poverilnico."</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona prstnih odtisov"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Odklepanje z obrazom"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Težava z odklepanjem z obrazom"</string> @@ -667,6 +669,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Za nadaljevanje uporabite obraz ali odklepanje s poverilnico."</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ikona obraza"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"branje nastavitev sinhronizacije"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Aplikaciji omogoča branje nastavitev sinhronizacije za račun. S tem lahko aplikacija na primer ugotovi, ali je aplikacija Ljudje sinhronizirana z računom."</string> @@ -1735,7 +1739,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Ko je bližnjica vklopljena, pritisnite gumba za glasnost in ju pridržite tri sekunde, če želite zagnati funkcijo za ljudi s posebnimi potrebami."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Želite vklopiti bližnjico za funkcije za ljudi s posebnimi potrebami?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Če za nekaj sekund pridržite obe tipki za glasnost, boste vklopili funkcije za ljudi s posebnimi potrebami. To lahko spremeni način delovanja naprave.\n\nTrenutne funkcije:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nIzbrane funkcije lahko spremenite v meniju »Nastavitve« > »Funkcije za ljudi s posebnimi potrebami«."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Želite vklopiti bližnjico za <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Če za nekaj sekund pridržite obe tipki za glasnost, boste vklopili storitev <xliff:g id="SERVICE">%1$s</xliff:g>, ki je funkcija za ljudi s posebnimi potrebami. To lahko spremeni način delovanja naprave.\n\nTo bližnjico lahko v meniju »Nastavitve« > »Funkcije za ljudi s posebnimi potrebami« spremenite, da bo uporabljena za drugo funkcijo."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Vklopi"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 239c9f8709da..731962824eb4 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Përdor gjurmën tënde të gishtit ose kyçjen e ekranit për të vazhduar"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikona e gjurmës së gishtit"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Shkyçja me fytyrë"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problem me \"Shkyçjen me fytyrë\""</string> @@ -661,6 +663,8 @@ <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> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ikona e fytyrës"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"lexo cilësimet e sinkronizimit"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Lejon aplikacionin të lexojë cilësimet e sinkronizimit për një llogari. Për shembull, kjo mund të përcaktojë nëse aplikacioni \"Kontaktet\" është i sinkronizuar me një llogari."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Kur shkurtorja është e aktivizuar, shtypja e të dy butonave për 3 sekonda do të nisë një funksion qasshmërie."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Të aktivizohet shkurtorja për veçoritë e qasshmërisë?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Mbajtja shtypur e dy tasteve të volumit për pak sekonda aktivizon veçoritë e qasshmërisë. Kjo mund të ndryshojë mënyrën se si funksionon pajisja jote.\n\nVeçoritë aktuale:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nKe ndryshuar veçoritë e zgjedhura te Cilësimet > Qasshmëria."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Të aktivizohet shkurtorja për <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Mbajtja shtypur e dy tasteve të volumit për pak sekonda aktivizon <xliff:g id="SERVICE">%1$s</xliff:g>, një veçori të qasshmërisë. Kjo mund të ndryshojë mënyrën se si funksionon pajisja jote.\n\nMund të ndryshosh këtë shkurtore te një veçori tjetër te Cilësimet > Qasshmëria."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Aktivizo"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index cd03394c58d4..76076aa4c757 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -612,6 +612,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Користите отисак прста или закључавање екрана да бисте наставили"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Икона отиска прста"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Откључавање лицем"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Проблем са откључавање лицем"</string> @@ -664,6 +666,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Користите лице или закључавање екрана да бисте наставили"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Икона лица"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"читање подешавања синхронизације"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Дозвољава апликацији да чита подешавања синхронизације за налог. На пример, овако може да се утврди да ли је апликација Људи синхронизована са налогом."</string> @@ -1713,7 +1717,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Када је пречица укључена, притисните оба дугмета за јачину звука да бисте покренули функцију приступачности."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Желите да укључите пречицу за функције приступачности?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Ако задржите оба тастера за јачину звука пар секунди, укључиће се функције приступачности. То може да промени начин рада уређаја.\n\nПостојеће функције:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nМожете да промените изабране функције у одељку Подешавања > Приступачност."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Желите да укључите пречицу за услугу <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Ако задржите оба тастера за јачину звука пар секунди, укључује се <xliff:g id="SERVICE">%1$s</xliff:g>, функција приступачности. То може да промени начин рада уређаја.\n\nМожете да промените функцију на коју се односи ова пречица у одељку Подешавања > Приступачност."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Укључи"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 940ee568228d..3c41779fca49 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Fortsätt med hjälp av ditt fingeravtryck eller skärmlåset"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikon för fingeravtryck"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Ansiktslås"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Problem med ansiktslås"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Fortsätt med hjälp av ditt ansikte eller skärmlåset"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Ansikte"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"läsa synkroniseringsinställningar"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Tillåter att appen läser synkroniseringsinställningarna för ett konto. Detta kan användas till exempel för att avgöra om appen Personer är synkroniserad med ett konto."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"När kortkommandot har aktiverats startar du en tillgänglighetsfunktion genom att trycka ned båda volymknapparna i tre sekunder."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Vill du aktivera genvägen till tillgänglighetsfunktioner?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Om du trycker ned båda volymknapparna i ett par sekunder aktiveras tillgänglighetsfunktionerna. Det kan få enheten ett fungera annorlunda.\n\nAktuella funktioner:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nDu kan ändra vilka funktioner som aktiveras under Inställningar > Tillgänglighet."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Vill du aktivera genvägen till <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Om du trycker ned båda volymknapparna i ett par sekunder aktiveras <xliff:g id="SERVICE">%1$s</xliff:g>, en tillgänglighetsfunktion. Det kan leda till att enheten fungerar annorlunda.\n\nDu kan ändra vilken funktion som ska aktiveras med genvägen under Inställningar > Tillgänglighet."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Aktivera"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index fbee2c3d8ff8..d5536ab2446b 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Tumia alama ya kidole au mbinu yako ya kufunga skrini ili uendelee"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Aikoni ya alama ya kidole"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Kufungua kwa Uso"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Hitilafu imetokea kwenye kipengele cha Kufungua kwa Uso"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Tumia uso au mbinu yako ya kufunga skrini ili uendelee"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Aikoni ya uso"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"kusoma mipangilio ya usawazishaji"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Inaruhusu programu kusoma mipangilio ya upatanishi wa akaunti. Kwa mfano, huku kunaweza kuamua kama programu ya Watu imepatanishwa na akaunti."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Unapowasha kipengele cha njia ya mkato, hatua ya kubonyeza vitufe vyote viwili vya sauti kwa sekunde tatu itafungua kipengele cha ufikivu."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Ungependa kuwasha njia ya mkato ya vipengele vya ufikivu?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Hatua ya kushikilia chini vitufe vyote viwili vya sauti kwa sekunde chache huwasha vipengele vya ufikivu. Huenda hatua hii ikabadilisha jinsi kifaa chako kinavyofanya kazi.\n\nVipengele vya sasa:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nUnaweza kubadilisha vipengele ulivyochagua katika Mipangilio > Ufikivu."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Ungependa kuwasha njia ya mkato ya <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Hatua ya kushikilia chini vitufe vyote viwili vya sauti kwa sekunde chache huwasha <xliff:g id="SERVICE">%1$s</xliff:g>, kipengele cha ufikivu. Huenda hatua hii ikabadilisha jinsi kifaa chako kinavyofanya kazi.\n\nUnaweza kubadilisha njia hii ya mkato iwe kipengele kingine katika Mipangilio > Ufikivu."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Washa"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 9565db5c2296..481a69d8cfd0 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"தொடர, உங்கள் கைரேகையையோ திரைப் பூட்டையோ பயன்படுத்துங்கள்"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"கைரேகை ஐகான்"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"முகம் காட்டித் திறத்தல்"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"முகம் காட்டித் திறத்தல் அம்சத்தில் சிக்கல்"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"தொடர, உங்கள் முகத்தையோ திரைப் பூட்டையோ பயன்படுத்துங்கள்"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"முக ஐகான்"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"ஒத்திசைவு அமைப்புகளைப் படித்தல்"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"கணக்கிற்கான ஒத்திசைவு அமைப்புகளைப் படிக்க ஆப்ஸை அனுமதிக்கிறது. எடுத்துக்காட்டாக, பீப்பிள் ஆப்ஸ் கணக்குடன் ஒத்திசைக்கப்பட்டுள்ளதா என்பதை இது தீர்மானிக்கலாம்."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ஷார்ட்கட் இயக்கத்தில் இருக்கும்போது ஒலியளவு பட்டன்கள் இரண்டையும் 3 வினாடிகளுக்கு அழுத்தினால் அணுகல்தன்மை அம்சம் இயக்கப்படும்."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"அணுகல்தன்மை அம்சங்களுக்கான ஷார்ட்கட்டை ஆன் செய்யவா?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"இரண்டு ஒலியளவு விசைகளையும் சில விநாடிகள் பிடித்திருந்தால் அணுகல்தன்மை அம்சங்கள் ஆன் செய்யப்படும். இதனால் உங்கள் சாதனம் வேலை செய்யும் முறை மாறக்கூடும்.\n\nதற்போதைய அம்சங்கள்:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nதேர்ந்தெடுத்த அம்சங்களை அமைப்புகள் > அணுகல்தன்மைக்குச் சென்று உங்களால் மாற்ற முடியும்."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> அம்சத்துக்கான ஷார்ட்கட்டை ஆன் செய்யவா?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"இரண்டு ஒலியளவு விசைகளையும் சில விநாடிகள் பிடித்திருப்பதால் அணுகல்தன்மை அம்சமான <xliff:g id="SERVICE">%1$s</xliff:g> ஆன் ஆகும். இதனால் உங்கள் சாதனம் வேலை செய்யும் முறை மாறக்கூடும்.\n\nஅமைப்புகள் > அணுகல்தன்மைக்குச் சென்று இந்த ஷார்ட்கட்டை வேறு அம்சத்திற்கு மாற்ற முடியும்."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ஆன் செய்"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 81d82b1ea051..a96b6bf62c86 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -305,7 +305,7 @@ <string name="permgrouplab_contacts" msgid="4254143639307316920">"కాంటాక్ట్లు"</string> <string name="permgroupdesc_contacts" msgid="9163927941244182567">"మీ కాంటాక్ట్లను యాక్సెస్ చేయడానికి"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"లొకేషన్"</string> - <string name="permgroupdesc_location" msgid="1995955142118450685">"ఈ పరికర స్థానాన్ని యాక్సెస్ చేయడానికి"</string> + <string name="permgroupdesc_location" msgid="1995955142118450685">"ఈ పరికర లొకేషన్ను యాక్సెస్ చేయడానికి"</string> <string name="permgrouplab_calendar" msgid="6426860926123033230">"క్యాలెండర్"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"మీ క్యాలెండర్ను యాక్సెస్ చేయడానికి"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> @@ -410,11 +410,11 @@ <string name="permdesc_broadcastSticky" product="tablet" msgid="5058486069846384013">"ప్రసారం ముగిసిన తర్వాత భద్రపరచబడే ప్రసారాలను పంపడానికి యాప్ను అనుమతిస్తుంది. అత్యధిక వినియోగం వలన టాబ్లెట్ నెమ్మదిగా పని చేయవచ్చు లేదా అధిక పరిమాణంలో మెమరీని ఉపయోగించడం వలన అస్థిరంగా మారవచ్చు."</string> <string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"ప్రసారం ముగిసిన తర్వాత భద్రపరచబడే ప్రసారాలను పంపడానికి యాప్ని అనుమతిస్తుంది. ఎక్కువగా వినియోగిస్తే అధిక పరిమాణంలో మెమరీని ఉపయోగించడం వలన టీవీ నెమ్మదిగా పని చేయవచ్చు లేదా అస్థిరంగా మారవచ్చు."</string> <string name="permdesc_broadcastSticky" product="default" msgid="134529339678913453">"ప్రసారం ముగిసిన తర్వాత భద్రపరచబడే ప్రసారాలను పంపడానికి యాప్ను అనుమతిస్తుంది. అత్యధిక వినియోగం వలన ఫోన్ నెమ్మదిగా పని చేయవచ్చు లేదా అధిక పరిమాణంలో మెమరీని ఉపయోగించడం వలన అస్థిరంగా మారవచ్చు."</string> - <string name="permlab_readContacts" msgid="8776395111787429099">"మీ పరిచయాలను చదవడం"</string> + <string name="permlab_readContacts" msgid="8776395111787429099">"మీ కాంటాక్ట్లను చదవడం"</string> <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"టాబ్లెట్లో నిల్వ చేసిన మీ కాంటాక్ట్లకు సంబంధించిన డేటాను చదవడానికి యాప్ను అనుమతిస్తుంది. కాంటాక్ట్లను సృష్టించిన మీ టాబ్లెట్లోని ఖాతాలకు కూడా యాప్లకు యాక్సెస్ ఉంటుంది. ఇందులో మీరు ఇన్స్టాల్ చేసిన యాప్ల ద్వారా సృష్టించబడిన ఖాతాలు ఉండవచ్చు. ఈ అనుమతి, మీ కాంటాక్ట్ డేటాను సేవ్ చేయడానికి యాప్లను అనుమతిస్తుంది, హానికరమైన యాప్లు మీకు తెలియకుండానే కాంటాక్ట్ డేటాను షేర్ చేయవచ్చు."</string> <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"మీ Android TV పరికరంలో నిల్వ చేసిన కాంటాక్ట్లకు సంబంధించిన డేటాను చదవడానికి యాప్ను అనుమతిస్తుంది. కాంటాక్ట్లను సృష్టించిన మీ Android TV పరికరంలోని ఖాతాలకు కూడా యాప్లకు యాక్సెస్ ఉంటుంది. ఇందులో మీరు ఇన్స్టాల్ చేసిన యాప్ల ద్వారా సృష్టించబడిన ఖాతాలు ఉండవచ్చు. ఈ అనుమతి, మీ కాంటాక్ట్ డేటాను సేవ్ చేయడానికి యాప్లను అనుమతిస్తుంది, హానికరమైన యాప్లు మీకు తెలియకుండానే కాంటాక్ట్ డేటాను షేర్ చేయవచ్చు."</string> <string name="permdesc_readContacts" product="default" msgid="4911989776203207644">"ఫోన్లో నిల్వ చేసిన మీ కాంటాక్ట్లకు సంబంధించిన డేటాను చదవడానికి యాప్ను అనుమతిస్తుంది. కాంటాక్ట్లను సృష్టించిన మీ ఫోన్లోని ఖాతాలను కూడా యాప్లు యాక్సెస్ చేయగలవు. ఇందులో మీరు ఇన్స్టాల్ చేసిన యాప్ల ద్వారా సృష్టించబడిన ఖాతాలు ఉండవచ్చు. ఈ అనుమతి, మీ కాంటాక్ట్ డేటాను సేవ్ చేయడానికి యాప్లను అనుమతిస్తుంది, హానికరమైన యాప్లు మీకు తెలియకుండానే కాంటాక్ట్ డేటాను షేర్ చేయవచ్చు."</string> - <string name="permlab_writeContacts" msgid="8919430536404830430">"మీ పరిచయాలను సవరించడం"</string> + <string name="permlab_writeContacts" msgid="8919430536404830430">"మీ కాంటాక్ట్లను సవరించడం"</string> <string name="permdesc_writeContacts" product="tablet" msgid="6422419281427826181">"మీ టాబ్లెట్లో నిల్వ చేసి ఉన్న కాంటాక్ట్లకు సంబంధించిన డేటాను సవరించడానికి యాప్ను అనుమతిస్తుంది. ఈ అనుమతి, కాంటాక్ట్ డేటాను తొలగించడానికి యాప్లను అనుమతిస్తుంది."</string> <string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"మీ Android TV పరికరంలో నిల్వ చేసి ఉన్న కాంటాక్ట్లకు సంబంధించిన డేటాను సవరించడానికి యాప్ను అనుమతిస్తుంది. ఈ అనుమతి, కాంటాక్ట్ డేటాను తొలగించడానికి యాప్లను అనుమతిస్తుంది."</string> <string name="permdesc_writeContacts" product="default" msgid="8304795696237065281">"మీ ఫోన్లో నిల్వ చేసి ఉన్న కాంటాక్ట్లకు సంబంధించిన డేటాను సవరించడానికి యాప్ను అనుమతిస్తుంది. ఈ అనుమతి, కాంటాక్ట్ డేటాను తొలగించడానికి యాప్లను అనుమతిస్తుంది."</string> @@ -434,13 +434,13 @@ <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="permlab_accessLocationExtraCommands" msgid="5162339812057983988">"అదనపు స్థాన ప్రదాత ఆదేశాలను యాక్సెస్ చేయడం"</string> + <string name="permlab_accessLocationExtraCommands" msgid="5162339812057983988">"అదనపు లొకేషన్ ప్రొవైడర్ కమాండ్లను యాక్సెస్ చేయడం"</string> <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"అదనపు లొకేషన్ ప్రొవైడర్ కమాండ్లను యాక్సెస్ చేయడానికి యాప్ను అనుమతిస్తుంది. ఇది GPS లేదా ఇతర లొకేషన్ సోర్స్ల నిర్వహణలో యాప్ ప్రమేయం ఉండేలా అనుమతించవచ్చు."</string> <string name="permlab_accessFineLocation" msgid="6426318438195622966">"స్క్రీన్పై ఉన్నప్పుడు మాత్రమే ఖచ్చితమైన లొకేషన్ను యాక్సెస్ చేయండి"</string> <string name="permdesc_accessFineLocation" msgid="6732174080240016335">"యాప్ ఉపయోగంలో ఉన్నప్పుడు మాత్రమే ఈ యాప్ మీ ఖచ్చితమైన లొకేషన్ను లొకేషన్ సర్వీస్ల ద్వారా తెలుసుకోగలదు. లొకేషన్ను యాప్ పొందాలంటే, దాని కోసం మీ పరికరం యొక్క లొకేషన్ సర్వీస్లను తప్పనిసరిగా ఆన్ చేయాలి. ఇది బ్యాటరీ వినియోగాన్ని పెంచవచ్చు."</string> <string name="permlab_accessCoarseLocation" msgid="1561042925407799741">"స్క్రీన్పై ఉన్నప్పుడు మాత్రమే సుమారు లొకేషన్ను యాక్సెస్ చేయండి"</string> <string name="permdesc_accessCoarseLocation" msgid="778521847873199160">"యాప్ ఉపయోగంలో ఉన్నప్పుడు మాత్రమే ఈ యాప్ మీ ఇంచుమించు లొకేషన్ను లొకేషన్ సర్వీస్ల నుండి తెలుసుకోగలదు. లొకేషన్ను యాప్ పొందాలంటే, దాని కోసం మీ పరికరం యొక్క లొకేషన్ సర్వీస్లను తప్పనిసరిగా ఆన్ చేయాలి."</string> - <string name="permlab_accessBackgroundLocation" msgid="1721164702777366138">"నేపథ్యంలో స్థానాన్ని యాక్సెస్ చేయి"</string> + <string name="permlab_accessBackgroundLocation" msgid="1721164702777366138">"బ్యాక్గ్రౌండ్లో లొకేషన్ను యాక్సెస్ చేయి"</string> <string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"యాప్ ఉపయోగంలో లేనప్పటికీ కూడా, ఈ యాప్, లొకేషన్ను ఎప్పుడైనా యాక్సెస్ చేయగలదు."</string> <string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"మీ ఆడియో సెట్టింగ్లను మార్చడం"</string> <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"వాల్యూమ్ మరియు అవుట్పుట్ కోసం ఉపయోగించాల్సిన స్పీకర్ వంటి సార్వజనీన ఆడియో సెట్టింగ్లను సవరించడానికి యాప్ను అనుమతిస్తుంది."</string> @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"కొనసాగించడానికి మీ వేలిముద్ర లేదా స్క్రీన్ లాక్ను ఉపయోగించండి"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"వేలిముద్ర చిహ్నం"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"ఫేస్ అన్లాక్"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"ఫేస్ అన్లాక్తో సమస్య"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"కొనసాగించడానికి మీ ముఖం లేదా స్క్రీన్ లాక్ను ఉపయోగించండి"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"ముఖ చిహ్నం"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"సింక్ సెట్టింగ్లను చదవగలగడం"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ఖాతా యొక్క సింక్ సెట్టింగ్లను చదవడానికి యాప్ను అనుమతిస్తుంది. ఉదాహరణకు, వ్యక్తుల యాప్ ఖాతాతో సమకాలీకరించబడాలా లేదా అనే విషయాన్ని ఇది నిశ్చయించవచ్చు."</string> @@ -1006,7 +1010,7 @@ <string name="permlab_readHistoryBookmarks" msgid="9102293913842539697">"మీ వెబ్ బుక్మార్క్లు మరియు చరిత్రను చదవడం"</string> <string name="permdesc_readHistoryBookmarks" msgid="2323799501008967852">"బ్రౌజర్ సందర్శించిన అన్ని URLల చరిత్ర గురించి మరియు అన్ని బ్రౌజర్ బుక్మార్క్ల గురించి చదవడానికి యాప్ను అనుమతిస్తుంది. గమనిక: ఈ అనుమతి మూడవ పక్షం బ్రౌజర్లు లేదా వెబ్ బ్రౌజింగ్ సామర్థ్యాలు గల ఇతర యాప్ల ద్వారా అమలు చేయబడకపోవచ్చు."</string> <string name="permlab_writeHistoryBookmarks" msgid="6090259925187986937">"వెబ్ బుక్మార్క్లు మరియు చరిత్రను వ్రాయడం"</string> - <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="573341025292489065">"మీ టాబ్లెట్లో నిల్వ చేయబడిన బ్రౌజర్ చరిత్రను లేదా బుక్మార్క్లను సవరించడానికి యాప్ను అనుమతిస్తుంది. ఇది బ్రౌజర్ డేటాను ఎరేజ్ చేయడానికి లేదా సవరించడానికి యాప్ను అనుమతించవచ్చు. గమనిక: ఈ అనుమతి మూడవ పక్షం బ్రౌజర్లు లేదా వెబ్ బ్రౌజింగ్ సామర్థ్యాలు గల ఇతర యాప్ల ద్వారా అమలు చేయబడకపోవచ్చు."</string> + <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="573341025292489065">"మీ టాబ్లెట్లో నిల్వ చేయబడిన బ్రౌజర్ హిస్టరీని, బుక్మార్క్లను ఎడిట్ చేయడానికి యాప్ను అనుమతిస్తుంది. ఇది బ్రౌజర్ డేటాను ఎరేజ్ చేయడానికి లేదా ఎడిట్ చేయడానికి యాప్ను అనుమతించవచ్చు. గమనిక: ఈ అనుమతిని థర్డ్ పార్టీ బ్రౌజర్లు లేదా వెబ్ బ్రౌజింగ్ సామర్థ్యాలు గల ఇతర యాప్లు అమలు చేయకపోవచ్చు."</string> <string name="permdesc_writeHistoryBookmarks" product="tv" msgid="88642768580408561">"మీ Android TV పరికరంలో నిల్వ చేసిన బ్రౌజర్ చరిత్ర లేదా బుక్మార్క్లను సవరించడానికి యాప్ని అనుమతిస్తుంది. ఇది బ్రౌజర్ డేటాను తీసివేయడానికి లేదా సవరించడానికి యాప్ని అనుమతించవచ్చు. గమనిక: ఈ అనుమతి మూడవ-పక్ష బ్రౌజర్లు లేదా వెబ్ బ్రౌజింగ్ సామర్థ్యాలు గల ఇతర యాప్ల ద్వారా అమలు కాకపోవచ్చు."</string> <string name="permdesc_writeHistoryBookmarks" product="default" msgid="2245203087160913652">"మీ ఫోన్లో నిల్వ చేయబడిన బ్రౌజర్ చరిత్రను లేదా బుక్మార్క్లను సవరించడానికి యాప్ను అనుమతిస్తుంది. ఇది బ్రౌజర్ డేటాను ఎరేజ్ చేయడానికి లేదా సవరించడానికి యాప్ను అనుమతించవచ్చు. గమనిక: ఈ అనుమతి మూడవ పక్షం బ్రౌజర్లు లేదా వెబ్ బ్రౌజింగ్ సామర్థ్యాలు గల ఇతర యాప్ల ద్వారా అమలు చేయబడకపోవచ్చు."</string> <string name="permlab_setAlarm" msgid="1158001610254173567">"అలారం సెట్ చేయడం"</string> @@ -1386,8 +1390,8 @@ <string name="usb_contaminant_not_detected_message" msgid="892863190942660462">"ఫోన్ ఇకపై ద్రవ లేదా వ్యర్థ పదార్థాలను గుర్తించదు."</string> <string name="taking_remote_bugreport_notification_title" msgid="1582531382166919850">"బగ్ రిపోర్ట్ను తీస్తోంది…"</string> <string name="share_remote_bugreport_notification_title" msgid="6708897723753334999">"బగ్ రిపోర్ట్ను షేర్ చేయాలా?"</string> - <string name="sharing_remote_bugreport_notification_title" msgid="3077385149217638550">"బగ్ రిపోర్ట్ను భాగస్వామ్యం చేస్తోంది..."</string> - <string name="share_remote_bugreport_notification_message_finished" msgid="7325635795739260135">"మీ నిర్వాహకులు ఈ పరికరం సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ రిపోర్ట్ను అభ్యర్థించారు. యాప్లు మరియు డేటా భాగస్వామ్యం చేయబడవచ్చు."</string> + <string name="sharing_remote_bugreport_notification_title" msgid="3077385149217638550">"బగ్ రిపోర్ట్ను షేర్ చేస్తోంది..."</string> + <string name="share_remote_bugreport_notification_message_finished" msgid="7325635795739260135">"మీ అడ్మిన్ ఈ పరికరం సమస్యకు పరిష్కారాన్ని కనుగొనడంలో సహాయం కోసం బగ్ రిపోర్ట్ను రిక్వెస్ట్ చేశారు. యాప్లు మరియు డేటా షేర్ చేయబడవచ్చు."</string> <string name="share_remote_bugreport_action" msgid="7630880678785123682">"షేర్ చేయి"</string> <string name="decline_remote_bugreport_action" msgid="4040894777519784346">"తిరస్కరిస్తున్నాను"</string> <string name="select_input_method" msgid="3971267998568587025">"ఇన్పుట్ పద్ధతిని ఎంచుకోండి"</string> @@ -1419,7 +1423,7 @@ <string name="ext_media_unmountable_notification_message" product="automotive" msgid="2274596120715020680">"మీరు పరికరాన్ని తిరిగి ఫార్మాట్ చేయాల్సి ఉంటుంది. తొలగించడానికి ట్యాప్ చేయండి"</string> <string name="ext_media_unsupported_notification_title" msgid="4358280700537030333">"<xliff:g id="NAME">%s</xliff:g>కి మద్దతు లేదు"</string> <string name="ext_media_unsupported_notification_title" product="automotive" msgid="6004193172658722381">"<xliff:g id="NAME">%s</xliff:g> పని చేయటం లేదు"</string> - <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"ఈ పరికరం ఈ <xliff:g id="NAME">%s</xliff:g>కి మద్దతు ఇవ్వదు. మద్దతు కలిగిన ఆకృతిలో సెటప్ చేయడానికి నొక్కండి."</string> + <string name="ext_media_unsupported_notification_message" msgid="917738524888367560">"ఈ పరికరం ఈ <xliff:g id="NAME">%s</xliff:g>కు సపోర్ట్ ఇవ్వదు. సపోర్ట్ ఉన్న ఫార్మాట్లో సెటప్ చేయడానికి నొక్కండి."</string> <string name="ext_media_unsupported_notification_message" product="tv" msgid="1595482802187036532">"సపోర్ట్ చేసే ఫార్మాట్లో <xliff:g id="NAME">%s</xliff:g>ను సెటప్ చేయడానికి ఎంచుకోండి."</string> <string name="ext_media_unsupported_notification_message" product="automotive" msgid="3412494732736336330">"మీరు పరికరాన్ని తిరిగి ఫార్మాట్ చేయాల్సి ఉంటుంది"</string> <string name="ext_media_badremoval_notification_title" msgid="4114625551266196872">"<xliff:g id="NAME">%s</xliff:g> ఊహించని విధంగా తీసివేయబడింది"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"షార్ట్కట్ ఆన్ చేసి ఉన్నప్పుడు, రెండు వాల్యూమ్ బటన్లను 3 సెకన్ల పాటు నొక్కి ఉంచితే యాక్సెస్ సౌలభ్య ఫీచర్ ప్రారంభం అవుతుంది."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"యాక్సెస్ సౌలభ్య ఫీచర్ల కోసం షార్ట్కట్ను ఆన్ చేయాలా?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"రెండు వాల్యూమ్ కీలను కొంత సేపు నొక్కి పట్టుకుంటే యాక్సెసిబిలిటీ ఫీచర్లు ఆన్ అవుతాయి. ఇది మీ పరికరం పని చేసే విధానాన్ని మార్చవచ్చు.\n\nప్రస్తుత ఫీచర్లు:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nఎంపిక చేసిన ఫీచర్లను మీరు సెట్టింగ్లు>యాక్సెసిబిలిటీలో మార్చవచ్చు."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> షార్ట్కట్ను ఆన్ చేయాలా?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"రెండు వాల్యూమ్ కీలను కొన్ని సెకన్ల పాటు నొక్కి పట్టుకోవడం ద్వారా యాక్సెసిబిలిటీ అయిన <xliff:g id="SERVICE">%1$s</xliff:g> ఆన్ అవుతుంది. ఇది మీ పరికరం పని చేసే విధానాన్ని మార్చవచ్చు.\n\nసెట్టింగ్లు > యాక్సెసిబిలిటీలో, వేరొక ఫీచర్ను ప్రారంభించేలా ఈ షార్ట్ కట్ను మీరు మార్చవచ్చు."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ఆన్ చేయి"</string> @@ -2139,7 +2144,7 @@ <string name="accessibility_system_action_back_label" msgid="4205361367345537608">"వెనుకకు"</string> <string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"ఇటీవలి యాప్లు"</string> <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"నోటిఫికేషన్లు"</string> - <string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"శీఘ్ర సెట్టింగ్లు"</string> + <string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"క్విక్ సెట్టింగ్లు"</string> <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"పవర్ డైలాగ్ను తెరువు"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"స్క్రీన్ను లాక్ చేయి"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"స్క్రీన్షాట్"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 379830a8a189..b427b9e577b4 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"ใช้ลายนิ้วมือหรือการล็อกหน้าจอเพื่อดำเนินการต่อ"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"ไอคอนลายนิ้วมือ"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"การปลดล็อกด้วยใบหน้า"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"มีปัญหาเกี่ยวกับฟีเจอร์ปลดล็อกด้วยใบหน้า"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"ใช้ใบหน้าหรือการล็อกหน้าจอเพื่อดำเนินการต่อ"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"ไอคอนใบหน้า"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"อ่านการตั้งค่าการซิงค์"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"อนุญาตให้แอปพลิเคชันอ่านการตั้งค่าการซิงค์ของบัญชี ตัวอย่างเช่น การอนุญาตนี้สามารถระบุได้ว่าแอปพลิเคชัน People ซิงค์กับบัญชีหรือไม่"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"เมื่อทางลัดเปิดอยู่ การกดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มนาน 3 วินาทีจะเริ่มฟีเจอร์การช่วยเหลือพิเศษ"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"เปิดใช้ทางลัดสำหรับฟีเจอร์การช่วยเหลือพิเศษใช่ไหม"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"การกดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มค้างไว้ 2-3 วินาทีจะเปิดฟีเจอร์การช่วยเหลือพิเศษ การดำเนินการนี้อาจเปลี่ยนแปลงลักษณะการทำงานของอุปกรณ์\n\nฟีเจอร์ปัจจุบัน:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nคุณจะเปลี่ยนฟีเจอร์ที่เลือกไว้ได้ในการตั้งค่า > การช่วยเหลือพิเศษ"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"เปิดใช้ทางลัด <xliff:g id="SERVICE">%1$s</xliff:g> ใช่ไหม"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"การกดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มค้างไว้ 2-3 วินาทีจะเปิด <xliff:g id="SERVICE">%1$s</xliff:g> ซึ่งเป็นฟีเจอร์การช่วยเหลือพิเศษ การดำเนินการนี้อาจเปลี่ยนแปลงลักษณะการทำงานของอุปกรณ์\n\nคุณแก้ไขทางลัดนี้ให้เปิดฟีเจอร์อื่นได้ในการตั้งค่า > การช่วยเหลือพิเศษ"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"เปิด"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 73848a33abb8..c62da4a5b591 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Gamitin ang iyong fingerprint o lock ng screen para magpatuloy"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Icon ng fingerprint"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Pag-unlock Gamit ang Mukha"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Isyu sa Pag-unlock Gamit ang Mukha"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Gamitin ang iyong mukha o lock ng screen para magpatuloy"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Face icon"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"basahin ang mga setting ng sync"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Pinapayagan ang app na basahin ang mga setting ng pag-sync para sa isang account. Halimbawa, matutukoy nito kung naka-sync ang app na Mga Tao sa isang account."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Kapag naka-on ang shortcut, magsisimula ang isang feature ng pagiging naa-access kapag pinindot ang parehong button ng volume."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"I-on ang shortcut para sa mga feature ng pagiging naa-access?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Mao-on ang mga feature ng accessibility kapag pinindot nang matagal ang parehong volume key nang ilang segundo. Posibleng mabago nito ang paggana ng iyong device.\n\nMga kasalukuyang feature:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nPuwede mong baguhin ang mga napiling feature sa Mga Setting > Accessibility."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"I-on ang shortcut ng <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Mao-on ang feature ng accessibility na <xliff:g id="SERVICE">%1$s</xliff:g> kapag pinindot nang matagal ang parehong volume key nang ilang segundo. Posibleng mabago nito ang paggana ng iyong device.\n\nPuwede mong palitan ng ibang feature ang shortcut na ito sa Mga Setting > Accessibility."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"I-on"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 3325e7e96d5e..46d04096025f 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Devam etmek için parmak izi veya ekran kilidinizi kullanın"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Parmak izi simgesi"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Yüz Tanıma Kilidi"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Yüz Tanıma Kilidi sorunu"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Devam etmek için yüz veya ekran kilidinizi kullanın"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Yüz simgesi"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"senk. ayarlarını okuma"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Uygulamaya bir hesaba ait senkronizasyon ayarlarını okuma izni verir. Örneğin, bu izne sahip bir uygulama Kişiler uygulamasının bir hesapla senkronize olup olmadığını belirleyebilir."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Kısayol açıkken ses düğmelerinin ikisini birden 3 saniyeliğine basılı tutmanız bir erişilebilirlik özelliğini başlatır."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Erişilebilirlik özellikleri için kısayol açılsın mı?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Ses tuşlarının ikisini birden birkaç saniyeliğine basılı tutmak, erişilebilirlik özelliklerini açar. Bu, cihazınızın çalışma şeklini değiştirebilir.\n\nGeçerli özellikler:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nSeçilen özellikleri Ayarlar > Erişilebilirlik\'te değiştirebilirsiniz."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> kısayolu açılsın mı?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Ses tuşlarının ikisini birden birkaç saniyeliğine basılı tutmak <xliff:g id="SERVICE">%1$s</xliff:g> erişilebilirlik özelliğini etkinleştirir. Bu, cihazınızın çalışma şeklini değiştirebilir.\n\nBu kısayolu, Ayarlar > Erişilebilirlik\'te başka bir özellikle değiştirebilirsiniz."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Etkinleştir"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 4912be887d9e..b70cee045838 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -615,6 +615,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Щоб продовжити, скористайтеся відбитком пальця або даними для розблокування екрана"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Сталася помилка. Повторіть спробу."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Значок відбитка пальця"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Фейсконтроль"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Сталася помилка з фейсконтролем"</string> @@ -667,6 +668,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Щоб продовжити, скористайтеся фейсконтролем або даними для розблокування екрана"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Сталася помилка. Повторіть спробу."</string> <string name="face_icon_content_description" msgid="465030547475916280">"Значок обличчя"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"читати налаштування синхронізації"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Дозволяє програмі читати налаштування синхронізації для облікового запису, наприклад, визначати, чи програма Люди синхронізується з обліковим записом."</string> @@ -1735,7 +1737,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Якщо цей засіб увімкнено, ви можете активувати спеціальні можливості, утримуючи обидві кнопки гучності протягом трьох секунд."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Увімкнути засіб спеціальних можливостей?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Якщо втримувати обидві клавіші гучності впродовж кількох секунд, вмикаються спеціальні можливості. Це впливає на роботу пристрою.\n\nПоточні функції:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nВибрані функції можна змінити в налаштуваннях у меню спеціальних можливостей."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Увімкнути засіб швидкого доступу до сервісу <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Якщо втримувати обидві клавіші гучності впродовж кількох секунд, буде ввімкнено спеціальні можливості – <xliff:g id="SERVICE">%1$s</xliff:g>. Це може вплинути на роботу пристрою.\n\nДля цієї комбінації клавіш можна вибрати іншу функцію в меню \"Налаштування > Спеціальні можливості\"."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Увімкнути"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 2936a080723b..29f35402a58a 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"جاری رکھنے کے لیے اپنے فنگر پرنٹ یا اسکرین لاک کا استعمال کریں"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"فنگر پرنٹ آئیکن"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"فیس اَنلاک"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"فیس اَنلاک میں مسئلہ"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"جاری رکھنے کے لیے اپنے چہرے یا اسکرین لاک کا استعمال کریں"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"چہرے کا آئیکن"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"مطابقت پذیری کی ترتیبات پڑھیں"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"ایپ کو کسی اکاؤنٹ کیلئے مطابقت پذیری کی ترتیبات پڑھنے کی اجازت دیتا ہے۔ مثلا، یہ تعین کرسکتا ہے کہ آیا People ایپ کسی اکاؤنٹ کے ساتھ مطابقت پذیر ہے۔"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"شارٹ کٹ آن ہونے پر، 3 سیکنڈ تک دونوں والیوم بٹنز کو دبانے سے ایک ایکسیسبیلٹی خصوصیت شروع ہو جائے گی۔"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"ایکسیسبیلٹی خصوصیات کے لیے شارٹ کٹ آن کریں؟"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"دونوں والیوم کی کلیدوں کو کچھ سیکنڈز تک دبائیں رکھنے سے ایکسیسبیلٹی خصوصیات آن ہو جاتی ہیں۔ اس سے آپ کے آلے کے کام کرنے کا طریقہ تبدیل ہو سکتا ہے۔\n\nموجودہ خصوصیات:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nآپ ترتیبات اور ایکسیسبیلٹی میں منتخب کردہ خصوصیات کو تبدیل کر سکتے ہیں۔"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> شارٹ کٹ آن کریں؟"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"والیوم کی دونوں کلیدوں کو کچھ سیکنڈز تک دبائے رکھنے سے <xliff:g id="SERVICE">%1$s</xliff:g> ایکسیسبیلٹی خصوصیت آن ہو جاتی ہے۔ اس سے آپ کے آلے کے کام کرنے کا طریقہ تبدیل ہو سکتا ہے۔\n\nآپ ترتیبات اور ایکسیسبیلٹی میں دیگر خصوصیت کے لیے اس شارٹ کٹ کو تبدیل کر سکتے ہیں۔"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"آن کریں"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index df7d4670dc29..8838d2e41c69 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Davom etish uchun barmoq izi yoki ekran qulfidan foydalaning"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Barmoq izi belgisi"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Yuz bilan ochish"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Yuz bilan ochishda muammo bor"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Davom etish uchun yuz tekshiruvi yoki ekran qulfidan foydalaning"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Yuz belgisi"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"sinx-sh sozlamalarini o‘qish"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Ilovaga hisobning sinxronlash sozlamalarini o‘qish uchun ruxsat beradi. Masalan, bu \"Odamlar\" ilovasi hisob bilan sinxronlangan yoki aksini aniqlay oladi."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Maxsus imkoniyatlar funksiyasidan foydalanish uchun u yoniqligida ikkala tovush tugmasini 3 soniya bosib turing."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Maxsus imkoniyatlar uchun tezkor tugma yoqilsinmi?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Maxsus imkoniyatlarni yoqish uchun ikkala tovush tugmalarini bir necha soniya bosib turing. Qurilmangiz ishlashida oʻzgarish yuz berishi mumkin.\n\nJoriy funksiyalar:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nTanlangan funksiyalarni Sozlamalar ichidagi Maxsus imkoniyatlar ustiga bosib oʻzgartirishingiz mumkin."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> tezkor tugmasi yoqilsinmi?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"<xliff:g id="SERVICE">%1$s</xliff:g> funksiyasini yoqish uchun ikkala tovush tugmalarini bir necha soniya bosib turing. Qurilmangiz ishlashida oʻzgarish yuz berishi mumkin.\n\nBu tezkor tugmalarni boshqa funksiyaga Sozlamalar ichidagi Maxsus imkoniyatlar orqali tayinlash mumkin."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Yoqilsin"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 259696dc587c..f66a21ccc37e 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Dùng vân tay của bạn hoặc phương thức khóa màn hình để tiếp tục"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Biểu tượng vân tay"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Mở khóa bằng khuôn mặt"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Vấn đề với tính năng Mở khóa bằng khuôn mặt"</string> @@ -661,6 +663,8 @@ <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> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Biểu tượng khuôn mặt"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"đọc cài đặt đồng bộ hóa"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Cho phép ứng dụng đọc cài đặt đồng bộ hóa cho tài khoản. Ví dụ: việc này có thể xác định liệu ứng dụng Mọi người đã được đồng bộ hóa với tài khoản chưa."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Khi phím tắt này đang bật, thao tác nhấn cả hai nút âm lượng trong 3 giây sẽ mở tính năng hỗ trợ tiếp cận."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Bật phím tắt cho các tính năng hỗ trợ tiếp cận?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Thao tác nhấn và giữ cả hai phím âm lượng trong vài giây sẽ bật các tính năng hỗ trợ tiếp cận. Việc bật các tính năng này có thể thay đổi cách thiết bị của bạn hoạt động.\n\nCác tính năng hiện tại:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nBạn có thể thay đổi những tính năng đã chọn trong phần Cài đặt > Hỗ trợ tiếp cận."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Bật phím tắt cho <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Thao tác nhấn và giữ cả hai phím âm lượng trong vài giây sẽ bật <xliff:g id="SERVICE">%1$s</xliff:g>, một tính năng hỗ trợ tiếp cận. Việc bật tính năng này có thể thay đổi cách thiết bị của bạn hoạt động.\n\nBạn có thể chuyển phím tắt này thành một tính năng khác trong phần Cài đặt > Hỗ trợ tiếp cận."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Bật"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index cc38de217a7b..3eaf7c7ca90e 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"使用指纹解锁或屏幕锁定凭据验证身份,才能继续操作"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"指纹图标"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"人脸解锁"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"人脸解锁存在问题"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"使用人脸解锁或屏幕锁定凭据验证身份,才能继续操作"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"面孔图标"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"读取同步设置"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"允许该应用读取某个帐号的同步设置。例如,此权限可确定“联系人”应用是否与某个帐号同步。"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"启用这项快捷方式后,同时按下两个音量按钮 3 秒钟即可启动无障碍功能。"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"要开启无障碍功能快捷方式吗?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"同时按住两个音量键几秒钟,即可开启无障碍功能。这样做可能会改变您设备的工作方式。\n\n当前功能:\n<xliff:g id="SERVICE">%1$s</xliff:g>\n您可以在“设置”>“无障碍”中更改所选功能。"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"要开启<xliff:g id="SERVICE">%1$s</xliff:g>快捷方式吗?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"同时按住两个音量键几秒钟,即可开启<xliff:g id="SERVICE">%1$s</xliff:g>无障碍功能。这样做可能会改变您设备的工作方式。\n\n您可以在“设置”>“无障碍”中将此快捷方式更改为开启另一项功能。"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"开启"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index fa2fee5f4083..deae9a380dc6 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -609,6 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"請使用指紋解鎖或螢幕鎖定功能驗證身分,才能繼續操作"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"發生錯誤,請再試一次。"</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"指紋圖示"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"面孔解鎖"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"「面孔解鎖」功能發生問題"</string> @@ -661,6 +662,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"請使用面孔解鎖或螢幕鎖定功能驗證身分,才能繼續操作"</string> <string-array name="face_error_vendor"> </string-array> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"發生錯誤,請再試一次。"</string> <string name="face_icon_content_description" msgid="465030547475916280">"臉孔圖示"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"讀取同步處理設定"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"允許應用程式讀取帳戶的同步設定,例如確定「通訊錄」應用程式是否和某個帳戶保持同步。"</string> @@ -1691,7 +1693,7 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"啟用快速鍵後,同時按住音量按鈕 3 秒便可啟用無障礙功能。"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"要開啟無障礙功能捷徑嗎?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"同時按下兩個音量鍵幾秒,以開啟無障礙功能。這可能會變更裝置的運作。\n\n目前功能:\n<xliff:g id="SERVICE">%1$s</xliff:g>\n您可在「設定」>「無障礙功能」中變更所選功能。"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"要開啟 <xliff:g id="SERVICE">%1$s</xliff:g> 捷徑嗎?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"同時按下兩個音量鍵幾秒,以開啟 <xliff:g id="SERVICE">%1$s</xliff:g> 無障礙功能。這可能會變更裝置的運作。\n\n您可在「設定」>「無障礙功能」中變更此快速鍵。"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"開啟"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 1c02c6bbb285..7cecc4bfb040 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"請使用指紋解鎖或螢幕鎖定功能驗證身分,才能繼續操作"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"指紋圖示"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"人臉解鎖"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"人臉解鎖功能發生問題"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"請使用人臉解鎖或螢幕鎖定功能驗證身分,才能繼續操作"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"臉孔圖示"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"讀取同步處理設定"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"允許應用程式讀取帳戶的同步處理設定,例如判斷「使用者」應用程式是否和某個帳戶進行同步處理。"</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"啟用捷徑功能,只要同時按下兩個音量按鈕 3 秒,就能啟動無障礙功能。"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"要開啟無障礙功能快速鍵嗎?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"同時按住音量調高鍵和調低鍵數秒,即可開啟無障礙功能。這麼做可能會改變裝置的運作方式。\n\n目前的功能:\n<xliff:g id="SERVICE">%1$s</xliff:g>\n你可以在 [設定] > [無障礙設定] 中變更選取的功能。"</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"要開啟「<xliff:g id="SERVICE">%1$s</xliff:g>」快速鍵嗎?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"同時按住音量調高鍵和調低鍵數秒,即可開啟「<xliff:g id="SERVICE">%1$s</xliff:g>」無障礙功能。這麼做可能會改變裝置的運作方式。\n\n你可以在 [設定] > [無障礙設定] 中變更這個快速鍵觸發的功能。"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"開啟"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index f93b84463874..f02eceda0bc4 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -609,6 +609,8 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Sebenzisa izigxivizo zakho zomunwe noma ukukhiya isikrini ukuze uqhubeke"</string> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- no translation found for fingerprint_error_vendor_unknown (4170002184907291065) --> + <skip /> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Isithonjana sezigxivizo zeminwe"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Ukuvula ubuso"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Inkinga Ngokuvula ngobuso"</string> @@ -661,6 +663,8 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Sebenzisa ubuso bakho noma ukukhiya isikrini ukuze uqhubeke"</string> <string-array name="face_error_vendor"> </string-array> + <!-- no translation found for face_error_vendor_unknown (7387005932083302070) --> + <skip /> <string name="face_icon_content_description" msgid="465030547475916280">"Isithonjana sobuso"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"funda izilungiselelo zokuvumelanisa"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Ivumela uhlelo lokusebenza ukufunda izilungiselelo zokuvumelanisa ze-akhawunti. Isibonelo, lokhu kungacacisa ukuthi noma ngabe uhlelo lokusebenza le-People livumelanisiwe ne-akhawunti."</string> @@ -1691,7 +1695,8 @@ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Uma isinqamuleli sivuliwe, ukucindezela zombili izinkinobho zevolumu amasekhondi angu-3 kuzoqalisa isici sokufinyelela."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Vula isinqamuleli sezici zokufinyeleleka?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Ukubambela phansi bobabili okhiye bevolumu amasekhondi ambalwa kuvula izici zokufinyelela. Lokhu kungashintsha indlela idivayisi yakho esebenza ngayo.\n\nIzici zamanje:\n<xliff:g id="SERVICE">%1$s</xliff:g>\nUngashintsha izici ezikhethiwe Kuzilungiselelo > Ukufinyeleleka."</string> - <string name="accessibility_shortcut_multiple_service_list" msgid="6935581470716541531">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> + <!-- no translation found for accessibility_shortcut_multiple_service_list (2128323171922023762) --> + <skip /> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"Vula isinqamuleli se-<xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Ukubambela phansi bobabili okhiye bevolumu amasekhondi ambalwa kuvula i-<xliff:g id="SERVICE">%1$s</xliff:g>, eyisici sokufinyelela Lokhu kungashintsha indlela idivayisi yakho esebenza ngayo.\n\nUngashintshela lesi sinqamuleli kwesinye isici Kuzilungiselelo > Ukufinyeleleka."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Vula"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index a4954e3fae5c..797ff867e00c 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -660,6 +660,9 @@ <!-- Indicates whether to enable an animation when unfolding a device or not --> <bool name="config_unfoldTransitionEnabled">false</bool> + <!-- Indicates whether to enable hinge angle sensor when using unfold animation --> + <bool name="config_unfoldTransitionHingeAngle">false</bool> + <!-- Indicates that the device supports having more than one internal display on at the same time. Only applicable to devices with more than one internal display. If this option is set to false, DisplayManager will make additional effort to ensure no more than 1 internal @@ -5092,6 +5095,14 @@ - config_fillBuiltInDisplayCutoutArray - config_maskBuiltInDisplayCutoutArray - config_waterfallCutoutArray + - config_roundedCornerRadiusArray + - config_roundedCornerTopRadiusArray + - config_roundedCornerBottomRadiusArray + - config_builtInDisplayIsRoundArray (config in SystemUI resource) + - config_roundedCornerMultipleRadiusArray (config in SystemUI resource) + - config_roundedCornerDrawableArray (config in SystemUI resource) + - config_roundedCornerTopDrawableArray (config in SystemUI resource) + - config_roundedCornerBottomDrawableArray (config in SystemUI resource) Leave this array empty for single display device and the system will load the default main built-in related configs. @@ -5153,4 +5164,48 @@ This flag should be enabled only when the product does not have any UI to toggle airplane mode like automotive devices.--> <bool name="config_autoResetAirplaneMode">false</bool> + + <bool name="config_secondaryBuiltInDisplayIsRound">@bool/config_windowIsRound</bool> + + <!-- The display round config for each display in a multi-display device. --> + <array name="config_builtInDisplayIsRoundArray" translatable="false"> + <item>@bool/config_mainBuiltInDisplayIsRound</item> + <item>@bool/config_secondaryBuiltInDisplayIsRound</item> + </array> + + <!-- The rounded corner radius for each display in a multi-display device. --> + <array name="config_roundedCornerRadiusArray" translatable="false"> + <item>@dimen/rounded_corner_radius</item> + <item>@dimen/secondary_rounded_corner_radius</item> + </array> + + <!-- The top rounded corner radius for each display in a multi-display device. --> + <array name="config_roundedCornerTopRadiusArray" translatable="false"> + <item>@dimen/rounded_corner_radius_top</item> + <item>@dimen/secondary_rounded_corner_radius_top</item> + </array> + + <!-- The bottom rounded corner radius for each display in a multi-display device. --> + <array name="config_roundedCornerBottomRadiusArray" translatable="false"> + <item>@dimen/rounded_corner_radius_bottom</item> + <item>@dimen/secondary_rounded_corner_radius_bottom</item> + </array> + + <!-- The rounded corner radius adjustment for each display in a multi-display device. --> + <array name="config_roundedCornerRadiusAdjustmentArray" translatable="false"> + <item>@dimen/rounded_corner_radius_adjustment</item> + <item>@dimen/secondary_rounded_corner_radius_adjustment</item> + </array> + + <!-- The rounded corner radius top adjustment for each display in a multi-display device. --> + <array name="config_roundedCornerTopRadiusAdjustmentArray" translatable="false"> + <item>@dimen/rounded_corner_radius_top_adjustment</item> + <item>@dimen/secondary_rounded_corner_radius_top_adjustment</item> + </array> + + <!-- The rounded corner radius bottom adjustment for each display in a multi-display device. --> + <array name="config_roundedCornerBottomRadiusAdjustmentArray" translatable="false"> + <item>@dimen/rounded_corner_radius_bottom_adjustment</item> + <item>@dimen/secondary_rounded_corner_radius_bottom_adjustment</item> + </array> </resources> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index e8bb6067932e..9ed4e65f7c91 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -55,6 +55,8 @@ <dimen name="navigation_bar_height_landscape">48dp</dimen> <!-- Width of the navigation bar when it is placed vertically on the screen --> <dimen name="navigation_bar_width">48dp</dimen> + <!-- Height of the bottom taskbar not including decorations like rounded corners. --> + <dimen name="taskbar_frame_height">60dp</dimen> <!-- How much we expand the touchable region of the status bar below the notch to catch touches that just start below the notch. --> <dimen name="display_cutout_touchable_region_size">12dp</dimen> @@ -952,4 +954,12 @@ <dimen name="secondary_waterfall_display_top_edge_size">0px</dimen> <dimen name="secondary_waterfall_display_right_edge_size">0px</dimen> <dimen name="secondary_waterfall_display_bottom_edge_size">0px</dimen> + + <!-- Rounded corner settings for secondary built-in display --> + <dimen name="secondary_rounded_corner_radius">0px</dimen> + <dimen name="secondary_rounded_corner_radius_top">0px</dimen> + <dimen name="secondary_rounded_corner_radius_bottom">0px</dimen> + <dimen name="secondary_rounded_corner_radius_adjustment">0px</dimen> + <dimen name="secondary_rounded_corner_radius_top_adjustment">0px</dimen> + <dimen name="secondary_rounded_corner_radius_bottom_adjustment">0px</dimen> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index a99a22009e3b..bb56b8d21a03 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1650,6 +1650,8 @@ <!-- Array containing custom error messages from vendor. Vendor is expected to add and translate these strings --> <string-array name="fingerprint_error_vendor"> </string-array> + <!-- Default error message to use when fingerprint_error_vendor does not contain a message. [CHAR LIMIT=NONE] --> + <string name="fingerprint_error_vendor_unknown">Something went wrong. Try again.</string> <!-- Content description which should be used for the fingerprint icon. --> <string name="fingerprint_icon_content_description">Fingerprint icon</string> @@ -1760,6 +1762,8 @@ <!-- Array containing custom error messages from vendor. Vendor is expected to add and translate these strings --> <string-array name="face_error_vendor"> </string-array> + <!-- Default error message to use when face_error_vendor does not contain a message. [CHAR LIMIT=NONE] --> + <string name="face_error_vendor_unknown">Something went wrong. Try again.</string> <!-- Content description which should be used for the face icon. [CHAR LIMIT=10] --> <string name="face_icon_content_description">Face icon</string> @@ -4554,7 +4558,7 @@ <string name="accessibility_shortcut_multiple_service_warning">Holding down both volume keys for a few seconds turns on accessibility features. This may change how your device works.\n\nCurrent features:\n<xliff:g id="service" example="TalkBack">%1$s</xliff:g>\nYou can change selected features in Settings > Accessibility.</string> <!-- Used in multiple service warning to list current features. [CHAR LIMIT=none] --> - <string name="accessibility_shortcut_multiple_service_list">\t• <xliff:g id="service" example="TalkBack">%1$s</xliff:g>\n</string> + <string name="accessibility_shortcut_multiple_service_list">\u0020• <xliff:g id="service" example="TalkBack">%1$s</xliff:g>\n</string> <!-- Dialog title for dialog shown when this accessibility shortcut is activated, and we want to confirm that the user understands what's going to happen. [CHAR LIMIT=none] --> <string name="accessibility_shortcut_single_service_warning_title">Turn on <xliff:g id="service" example="TalkBack">%1$s</xliff:g> shortcut?</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 77a45f9caf7f..a26963a922aa 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1741,6 +1741,7 @@ <java-symbol type="dimen" name="navigation_bar_height_car_mode" /> <java-symbol type="dimen" name="navigation_bar_height_landscape_car_mode" /> <java-symbol type="dimen" name="navigation_bar_width_car_mode" /> + <java-symbol type="dimen" name="taskbar_frame_height" /> <java-symbol type="dimen" name="status_bar_height" /> <java-symbol type="dimen" name="display_cutout_touchable_region_size" /> <java-symbol type="dimen" name="quick_qs_offset_height" /> @@ -2526,6 +2527,7 @@ <java-symbol type="string" name="fingerprint_error_no_space" /> <java-symbol type="string" name="fingerprint_error_timeout" /> <java-symbol type="array" name="fingerprint_error_vendor" /> + <java-symbol type="string" name="fingerprint_error_vendor_unknown" /> <java-symbol type="string" name="fingerprint_acquired_partial" /> <java-symbol type="string" name="fingerprint_acquired_insufficient" /> <java-symbol type="string" name="fingerprint_acquired_imager_dirty" /> @@ -2565,6 +2567,7 @@ <java-symbol type="string" name="face_error_no_space" /> <java-symbol type="string" name="face_error_timeout" /> <java-symbol type="array" name="face_error_vendor" /> + <java-symbol type="string" name="face_error_vendor_unknown" /> <java-symbol type="string" name="face_error_canceled" /> <java-symbol type="string" name="face_error_user_canceled" /> <java-symbol type="string" name="face_error_lockout" /> @@ -3842,6 +3845,7 @@ <java-symbol type="string" name="config_foldedArea" /> <java-symbol type="bool" name="config_supportsConcurrentInternalDisplays" /> <java-symbol type="bool" name="config_unfoldTransitionEnabled" /> + <java-symbol type="bool" name="config_unfoldTransitionHingeAngle" /> <java-symbol type="array" name="config_perDeviceStateRotationLockDefaults" /> @@ -4449,4 +4453,19 @@ <java-symbol type="array" name="config_mainBuiltInDisplayWaterfallCutout" /> <java-symbol type="array" name="config_secondaryBuiltInDisplayWaterfallCutout" /> <java-symbol type="array" name="config_waterfallCutoutArray" /> + + <java-symbol type="dimen" name="secondary_rounded_corner_radius" /> + <java-symbol type="dimen" name="secondary_rounded_corner_radius_top" /> + <java-symbol type="dimen" name="secondary_rounded_corner_radius_bottom" /> + <java-symbol type="dimen" name="secondary_rounded_corner_radius_adjustment" /> + <java-symbol type="dimen" name="secondary_rounded_corner_radius_top_adjustment" /> + <java-symbol type="dimen" name="secondary_rounded_corner_radius_bottom_adjustment" /> + <java-symbol type="array" name="config_roundedCornerRadiusArray" /> + <java-symbol type="array" name="config_roundedCornerTopRadiusArray" /> + <java-symbol type="array" name="config_roundedCornerBottomRadiusArray" /> + <java-symbol type="array" name="config_roundedCornerRadiusAdjustmentArray" /> + <java-symbol type="array" name="config_roundedCornerTopRadiusAdjustmentArray" /> + <java-symbol type="array" name="config_roundedCornerBottomRadiusAdjustmentArray" /> + <java-symbol type="bool" name="config_secondaryBuiltInDisplayIsRound" /> + <java-symbol type="array" name="config_builtInDisplayIsRoundArray" /> </resources> diff --git a/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java b/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java index 3d820acf2d22..6884f13d4cc9 100644 --- a/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java +++ b/core/tests/coretests/src/android/app/appsearch/external/app/GenericDocumentTest.java @@ -62,18 +62,4 @@ public class GenericDocumentTest { assertThat(outDoc.getPropertyDocument("propDocument").getPropertyBytesArray("propBytes")) .isEqualTo(new byte[][] {{3, 4}}); } - - @Test - public void testPutLargeDocument_exceedLimit() throws Exception { - // Create a String property that has a very large property. - char[] chars = new char[10_000_000]; - String property = new StringBuilder().append(chars).append("the end.").toString(); - - GenericDocument doc = - new GenericDocument.Builder<>("namespace", "id1", "schema1") - .setPropertyString("propString", property) - .build(); - - assertThat(doc.getPropertyString("propString")).isEqualTo(property); - } } diff --git a/core/tests/coretests/src/android/graphics/FontListParserTest.java b/core/tests/coretests/src/android/graphics/FontListParserTest.java index 22f6ec0b24b1..701e6194d4ee 100644 --- a/core/tests/coretests/src/android/graphics/FontListParserTest.java +++ b/core/tests/coretests/src/android/graphics/FontListParserTest.java @@ -27,6 +27,7 @@ import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.fail; +import android.graphics.fonts.FontCustomizationParser; import android.graphics.fonts.FontStyle; import android.os.LocaleList; import android.text.FontConfig; @@ -46,6 +47,7 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.List; @SmallTest @RunWith(AndroidJUnit4.class) @@ -318,6 +320,52 @@ public final class FontListParserTest { } } + @Test + public void alias() throws Exception { + String xml = "<?xml version='1.0' encoding='UTF-8'?>" + + "<familyset>" + + " <family name='sans-serif'>" + + " <font>test.ttf</font>" + + " </family>" + + " <family name='custom-family'>" + + " <font>missing.ttf</font>" + + " </family>" + + " <alias name='custom-alias' to='sans-serif'/>" + + "</familyset>"; + FontConfig config = readFamilies(xml, true /* include non-existing font files */); + List<FontConfig.Alias> aliases = config.getAliases(); + assertThat(aliases.size()).isEqualTo(1); + assertThat(aliases.get(0).getName()).isEqualTo("custom-alias"); + assertThat(aliases.get(0).getOriginal()).isEqualTo("sans-serif"); + } + + @Test + public void dropped_FamilyAlias() throws Exception { + String xml = "<?xml version='1.0' encoding='UTF-8'?>" + + "<familyset>" + + " <family name='sans-serif'>" + + " <font>test.ttf</font>" + + " </family>" + + " <family name='custom-family'>" + + " <font>missing.ttf</font>" + + " </family>" + + " <alias name='custom-alias' to='custom-family'/>" + + "</familyset>"; + FontConfig config = readFamilies(xml, false /* exclude not existing file */); + assertThat(config.getAliases()).isEmpty(); + } + + private FontConfig readFamilies(String xml, boolean allowNonExisting) + throws IOException, XmlPullParserException { + ByteArrayInputStream buffer = new ByteArrayInputStream( + xml.getBytes(StandardCharsets.UTF_8)); + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(buffer, "UTF-8"); + parser.nextTag(); + return FontListParser.readFamilies(parser, "", new FontCustomizationParser.Result(), null, + 0L /* last modified date */, 0 /* config version */, allowNonExisting); + } + private FontConfig.FontFamily readFamily(String xml) throws IOException, XmlPullParserException { ByteArrayInputStream buffer = new ByteArrayInputStream( diff --git a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java index 8fd1af801094..4f1da1b29616 100644 --- a/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java +++ b/core/tests/coretests/src/android/view/InsetsAnimationControlImplTest.java @@ -111,7 +111,7 @@ public class InsetsAnimationControlImplTest { new Rect(0, 0, 500, 500), mInsetsState, mMockListener, systemBars(), mMockController, 10 /* durationMs */, new LinearInterpolator(), 0 /* animationType */, 0 /* layoutInsetsDuringAnimation */, null /* translator */); - mController.mReadyDispatched = true; + mController.setReadyDispatched(true); } @Test @@ -197,7 +197,7 @@ public class InsetsAnimationControlImplTest { @Test public void testCancelled_beforeReadyDispatched() { - mController.mReadyDispatched = false; + mController.setReadyDispatched(false); mController.cancel(); assertFalse(mController.isReady()); assertFalse(mController.isFinished()); diff --git a/core/tests/coretests/src/android/view/InsetsControllerTest.java b/core/tests/coretests/src/android/view/InsetsControllerTest.java index 507638e45abe..227a86576113 100644 --- a/core/tests/coretests/src/android/view/InsetsControllerTest.java +++ b/core/tests/coretests/src/android/view/InsetsControllerTest.java @@ -19,13 +19,17 @@ package android.view; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.view.InsetsController.ANIMATION_TYPE_HIDE; import static android.view.InsetsController.ANIMATION_TYPE_NONE; +import static android.view.InsetsController.ANIMATION_TYPE_RESIZE; import static android.view.InsetsController.ANIMATION_TYPE_SHOW; +import static android.view.InsetsController.AnimationType; import static android.view.InsetsSourceConsumer.ShowResult.IME_SHOW_DELAYED; import static android.view.InsetsSourceConsumer.ShowResult.SHOW_IMMEDIATELY; +import static android.view.InsetsState.FIRST_TYPE; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; +import static android.view.InsetsState.LAST_TYPE; import static android.view.WindowInsets.Type.ime; import static android.view.WindowInsets.Type.navigationBars; import static android.view.WindowInsets.Type.statusBars; @@ -662,6 +666,97 @@ public class InsetsControllerTest { } @Test + public void testResizeAnimation_insetsTypes() { + for (@InternalInsetsType int type = FIRST_TYPE; type <= LAST_TYPE; type++) { + final @AnimationType int expectedAnimationType = + (InsetsState.toPublicType(type) & Type.systemBars()) != 0 + ? ANIMATION_TYPE_RESIZE + : ANIMATION_TYPE_NONE; + doTestResizeAnimation_insetsTypes(type, expectedAnimationType); + } + } + + private void doTestResizeAnimation_insetsTypes(@InternalInsetsType int type, + @AnimationType int expectedAnimationType) { + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + final InsetsState state1 = new InsetsState(); + state1.getSource(type).setVisible(true); + state1.getSource(type).setFrame(0, 0, 500, 50); + final InsetsState state2 = new InsetsState(state1, true /* copySources */); + state2.getSource(type).setFrame(0, 0, 500, 60); + final String message = "Animation type of " + InsetsState.typeToString(type) + ":"; + + // New insets source won't cause the resize animation. + mController.onStateChanged(state1); + assertEquals(message, ANIMATION_TYPE_NONE, mController.getAnimationType(type)); + + // Changing frame might cause the resize animation. This depends on the insets type. + mController.onStateChanged(state2); + assertEquals(message, expectedAnimationType, mController.getAnimationType(type)); + + // Cancel the existing animations for the next iteration. + mController.cancelExistingAnimations(); + assertEquals(message, ANIMATION_TYPE_NONE, mController.getAnimationType(type)); + }); + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + } + + @Test + public void testResizeAnimation_displayFrame() { + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + final @InternalInsetsType int type = ITYPE_STATUS_BAR; + final InsetsState state1 = new InsetsState(); + state1.setDisplayFrame(new Rect(0, 0, 500, 1000)); + state1.getSource(type).setFrame(0, 0, 500, 50); + final InsetsState state2 = new InsetsState(state1, true /* copySources */); + state2.setDisplayFrame(new Rect(0, 0, 500, 1010)); + state2.getSource(type).setFrame(0, 0, 500, 60); + final String message = "There must not be resize animation."; + + // New insets source won't cause the resize animation. + mController.onStateChanged(state1); + assertEquals(message, ANIMATION_TYPE_NONE, mController.getAnimationType(type)); + + // Changing frame won't cause the resize animation if the display frame is also changed. + mController.onStateChanged(state2); + assertEquals(message, ANIMATION_TYPE_NONE, mController.getAnimationType(type)); + }); + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + } + + @Test + public void testResizeAnimation_visibility() { + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + final @InternalInsetsType int type = ITYPE_STATUS_BAR; + final InsetsState state1 = new InsetsState(); + state1.getSource(type).setVisible(true); + state1.getSource(type).setFrame(0, 0, 500, 50); + final InsetsState state2 = new InsetsState(state1, true /* copySources */); + state2.getSource(type).setVisible(false); + state2.getSource(type).setFrame(0, 0, 500, 60); + final InsetsState state3 = new InsetsState(state2, true /* copySources */); + state3.getSource(type).setVisible(true); + state3.getSource(type).setFrame(0, 0, 500, 70); + final String message = "There must not be resize animation."; + + // New insets source won't cause the resize animation. + mController.onStateChanged(state1); + assertEquals(message, ANIMATION_TYPE_NONE, mController.getAnimationType(type)); + + // Changing source visibility (visible --> invisible) won't cause the resize animation. + // The previous source and the current one must be both visible. + mController.onStateChanged(state2); + assertEquals(message, ANIMATION_TYPE_NONE, mController.getAnimationType(type)); + + // Changing source visibility (invisible --> visible) won't cause the resize animation. + // The previous source and the current one must be both visible. + mController.onStateChanged(state3); + assertEquals(message, ANIMATION_TYPE_NONE, mController.getAnimationType(type)); + }); + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + } + + @Test public void testCaptionInsetsStateAssemble() { InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { mController.onFrameChanged(new Rect(0, 0, 100, 300)); diff --git a/core/tests/coretests/src/android/view/InsetsStateTest.java b/core/tests/coretests/src/android/view/InsetsStateTest.java index 3bd29398325f..bf8bb76891d7 100644 --- a/core/tests/coretests/src/android/view/InsetsStateTest.java +++ b/core/tests/coretests/src/android/view/InsetsStateTest.java @@ -216,9 +216,9 @@ public class InsetsStateTest { mState.getSource(ITYPE_CAPTION_BAR).setFrame(new Rect(0, 0, 100, 300)); mState.getSource(ITYPE_CAPTION_BAR).setVisible(true); - Rect visibleInsets = mState.calculateVisibleInsets( + Insets visibleInsets = mState.calculateVisibleInsets( new Rect(0, 0, 100, 400), SOFT_INPUT_ADJUST_NOTHING); - assertEquals(new Rect(0, 300, 0, 0), visibleInsets); + assertEquals(Insets.of(0, 300, 0, 0), visibleInsets); } @Test @@ -226,9 +226,9 @@ public class InsetsStateTest { mState.getSource(ITYPE_CAPTION_BAR).setFrame(new Rect(0, 0, 100, 300)); mState.getSource(ITYPE_CAPTION_BAR).setVisible(true); - Rect visibleInsets = mState.calculateVisibleInsets( + Insets visibleInsets = mState.calculateVisibleInsets( new Rect(0, 0, 150, 400), SOFT_INPUT_ADJUST_NOTHING); - assertEquals(new Rect(0, 300, 0, 0), visibleInsets); + assertEquals(Insets.of(0, 300, 0, 0), visibleInsets); } @Test @@ -413,9 +413,9 @@ public class InsetsStateTest { // Make sure bottom gestures are ignored mState.getSource(ITYPE_BOTTOM_GESTURES).setFrame(new Rect(0, 100, 100, 300)); mState.getSource(ITYPE_BOTTOM_GESTURES).setVisible(true); - Rect visibleInsets = mState.calculateVisibleInsets( + Insets visibleInsets = mState.calculateVisibleInsets( new Rect(0, 0, 100, 300), SOFT_INPUT_ADJUST_PAN); - assertEquals(new Rect(0, 100, 0, 100), visibleInsets); + assertEquals(Insets.of(0, 100, 0, 100), visibleInsets); } @Test @@ -428,9 +428,9 @@ public class InsetsStateTest { // Make sure bottom gestures are ignored mState.getSource(ITYPE_BOTTOM_GESTURES).setFrame(new Rect(0, 100, 100, 300)); mState.getSource(ITYPE_BOTTOM_GESTURES).setVisible(true); - Rect visibleInsets = mState.calculateVisibleInsets( + Insets visibleInsets = mState.calculateVisibleInsets( new Rect(0, 0, 100, 300), SOFT_INPUT_ADJUST_NOTHING); - assertEquals(new Rect(0, 100, 0, 0), visibleInsets); + assertEquals(Insets.of(0, 100, 0, 0), visibleInsets); } @Test diff --git a/graphics/java/android/graphics/FontListParser.java b/graphics/java/android/graphics/FontListParser.java index 93a336e7a408..96b33259e739 100644 --- a/graphics/java/android/graphics/FontListParser.java +++ b/graphics/java/android/graphics/FontListParser.java @@ -25,6 +25,7 @@ import android.graphics.fonts.FontVariationAxis; import android.os.Build; import android.os.LocaleList; import android.text.FontConfig; +import android.util.ArraySet; import android.util.Xml; import org.xmlpull.v1.XmlPullParser; @@ -37,6 +38,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.regex.Pattern; /** @@ -120,7 +122,23 @@ public class FontListParser { } } - private static FontConfig readFamilies( + /** + * Parses the familyset tag in font.xml + * @param parser a XML pull parser + * @param fontDir A system font directory, e.g. "/system/fonts" + * @param customization A OEM font customization + * @param updatableFontMap A map of updated font files + * @param lastModifiedDate A date that the system font is updated. + * @param configVersion A version of system font config. + * @param allowNonExistingFile true if allowing non-existing font files during parsing fonts.xml + * @return result of fonts.xml + * + * @throws XmlPullParserException + * @throws IOException + * + * @hide + */ + public static FontConfig readFamilies( @NonNull XmlPullParser parser, @NonNull String fontDir, @NonNull FontCustomizationParser.Result customization, @@ -159,7 +177,24 @@ public class FontListParser { } families.addAll(oemNamedFamilies.values()); - return new FontConfig(families, aliases, lastModifiedDate, configVersion); + + // Filters aliases that point to non-existing families. + Set<String> namedFamilies = new ArraySet<>(); + for (int i = 0; i < families.size(); ++i) { + String name = families.get(i).getName(); + if (name != null) { + namedFamilies.add(name); + } + } + List<FontConfig.Alias> filtered = new ArrayList<>(); + for (int i = 0; i < aliases.size(); ++i) { + FontConfig.Alias alias = aliases.get(i); + if (namedFamilies.contains(alias.getOriginal())) { + filtered.add(alias); + } + } + + return new FontConfig(families, filtered, lastModifiedDate, configVersion); } private static boolean keepReading(XmlPullParser parser) diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/SplitContainer.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/SplitContainer.java index 4fd2126dfa27..a41557d41e30 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/SplitContainer.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/SplitContainer.java @@ -40,7 +40,15 @@ class SplitContainer { mSplitRule = splitRule; if (shouldFinishPrimaryWithSecondary(splitRule)) { - mSecondaryContainer.addActivityToFinishOnExit(primaryActivity); + if (mPrimaryContainer.getRunningActivityCount() == 1 + && mPrimaryContainer.hasActivity(primaryActivity.getActivityToken())) { + mSecondaryContainer.addContainerToFinishOnExit(mPrimaryContainer); + } else { + // Only adding the activity to be finished vs. the entire TaskFragment while + // the secondary container exits because there are other unrelated activities in the + // primary TaskFragment. + mSecondaryContainer.addActivityToFinishOnExit(primaryActivity); + } } if (shouldFinishSecondaryWithPrimary(splitRule)) { mPrimaryContainer.addContainerToFinishOnExit(mSecondaryContainer); diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/TaskFragmentContainer.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/TaskFragmentContainer.java index a4f5c75276f5..a9155cf152fe 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/TaskFragmentContainer.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/TaskFragmentContainer.java @@ -125,6 +125,14 @@ class TaskFragmentContainer { return false; } + int getRunningActivityCount() { + int count = mPendingAppearedActivities.size(); + if (mInfo != null) { + count += mInfo.getRunningActivityCount(); + } + return count; + } + @Nullable TaskFragmentInfo getInfo() { return mInfo; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java index 9a3bdab9f418..a1fb658ccb9d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayController.java @@ -67,7 +67,10 @@ public class DisplayController { */ public void initialize() { try { - mWmService.registerDisplayWindowListener(mDisplayContainerListener); + int[] displayIds = mWmService.registerDisplayWindowListener(mDisplayContainerListener); + for (int i = 0; i < displayIds.length; i++) { + onDisplayAdded(displayIds[i]); + } } catch (RemoteException e) { throw new RuntimeException("Unable to register display controller"); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java index 826e2f5c2f74..f35c8e1c5929 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java @@ -58,16 +58,8 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { // TODO(b/191269755): use the value defined in InsetsController. private static final int ANIMATION_DURATION_RESIZE = 300; - /** - * The task bar height defined in launcher. Used to determine whether to insets divider bounds - * or not. - */ - private static final int EXPANDED_TASK_BAR_HEIGHT_IN_DP = 60; - /** The task bar expanded height. Used to determine whether to insets divider bounds or not. */ - private final float mExpandedTaskBarHeight = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, EXPANDED_TASK_BAR_HEIGHT_IN_DP, - getResources().getDisplayMetrics()); + private float mExpandedTaskBarHeight; private final int mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); @@ -167,6 +159,8 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { mDividerBar = findViewById(R.id.divider_bar); mHandle = findViewById(R.id.docked_divider_handle); mBackground = findViewById(R.id.docked_divider_background); + mExpandedTaskBarHeight = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.taskbar_frame_height); mTouchElevation = getResources().getDimensionPixelSize( R.dimen.docked_stack_divider_lift_elevation); mDoubleTapDetector = new GestureDetector(getContext(), new DoubleTapListener()); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DropOutlineDrawable.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DropOutlineDrawable.java index 64f7be5be813..73deea54e52f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DropOutlineDrawable.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DropOutlineDrawable.java @@ -86,7 +86,7 @@ public class DropOutlineDrawable extends Drawable { public DropOutlineDrawable(Context context) { super(); // TODO(b/169894807): Use corner specific radii and maybe lower radius for non-edge corners - mCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context.getResources()); + mCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context); mColor = context.getColor(R.color.drop_outline_background); mMaxAlpha = Color.alpha(mColor); // Initialize as hidden diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl index 6ec514bd8331..2dd5393b4dba 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ISplitScreen.aidl @@ -22,7 +22,7 @@ import android.os.Bundle; import android.os.UserHandle; import android.view.RemoteAnimationAdapter; import android.view.RemoteAnimationTarget; -import android.window.IRemoteTransition; +import android.window.RemoteTransition; import com.android.wm.shell.splitscreen.ISplitScreenListener; @@ -82,7 +82,7 @@ interface ISplitScreen { * Starts tasks simultaneously in one transition. */ oneway void startTasks(int mainTaskId, in Bundle mainOptions, int sideTaskId, - in Bundle sideOptions, int sidePosition, in IRemoteTransition remoteTransition) = 10; + in Bundle sideOptions, int sidePosition, in RemoteTransition remoteTransition) = 10; /** * Version of startTasks using legacy transition system. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 437b52a31ee4..804fba7afbd9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -22,7 +22,6 @@ import static android.view.RemoteAnimationTarget.MODE_OPENING; import static com.android.wm.shell.common.ExecutorUtils.executeRemoteCallWithTaskPermission; import static com.android.wm.shell.common.split.SplitLayout.SPLIT_POSITION_BOTTOM_OR_RIGHT; import static com.android.wm.shell.common.split.SplitLayout.SPLIT_POSITION_TOP_OR_LEFT; -import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_MAIN; import android.app.ActivityManager; import android.app.ActivityTaskManager; @@ -44,7 +43,7 @@ import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.WindowManager; -import android.window.IRemoteTransition; +import android.window.RemoteTransition; import android.window.WindowContainerTransaction; import androidx.annotation.BinderThread; @@ -76,6 +75,7 @@ import java.util.concurrent.Executor; * {@link SplitScreen}. * @see StageCoordinator */ +// TODO(b/198577848): Implement split screen flicker test to consolidate CUJ of split screen. public class SplitScreenController implements DragAndDropPolicy.Starter, RemoteCallable<SplitScreenController> { private static final String TAG = SplitScreenController.class.getSimpleName(); @@ -241,46 +241,34 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, private void startIntentLegacy(PendingIntent intent, Intent fillInIntent, @SplitScreen.StageType int stage, @SplitPosition int position, @Nullable Bundle options) { - final boolean wasInSplit = isSplitScreenVisible(); - LegacyTransitions.ILegacyTransition transition = new LegacyTransitions.ILegacyTransition() { @Override public void onAnimationStart(int transit, RemoteAnimationTarget[] apps, RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps, IRemoteAnimationFinishedCallback finishedCallback, SurfaceControl.Transaction t) { - boolean cancelled = apps == null || apps.length == 0; mStageCoordinator.updateSurfaceBounds(null /* layout */, t); - if (cancelled) { - if (!wasInSplit) { - final WindowContainerTransaction undoWct = new WindowContainerTransaction(); - mStageCoordinator.prepareExitSplitScreen(STAGE_TYPE_MAIN, undoWct); - mSyncQueue.queue(undoWct); - mSyncQueue.runInSync(undoT -> { - // looks weird, but we want undoT to execute after t but still want the - // rest of the syncQueue runnables to aggregate. - t.merge(undoT); - undoT.merge(t); - }); - return; - } - } else { + + if (apps != null) { for (int i = 0; i < apps.length; ++i) { if (apps[i].mode == MODE_OPENING) { t.show(apps[i].leash); } } } - RemoteAnimationTarget divider = mStageCoordinator.getDividerBarLegacyTarget(); + + final RemoteAnimationTarget divider = mStageCoordinator.getDividerBarLegacyTarget(); if (divider.leash != null) { t.show(divider.leash); } + t.apply(); - if (cancelled) return; - try { - finishedCallback.onAnimationFinished(); - } catch (RemoteException e) { - Slog.e(TAG, "Error finishing legacy transition: ", e); + if (finishedCallback != null) { + try { + finishedCallback.onAnimationFinished(); + } catch (RemoteException e) { + Slog.e(TAG, "Error finishing legacy transition: ", e); + } } } }; @@ -565,7 +553,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, public void startTasks(int mainTaskId, @Nullable Bundle mainOptions, int sideTaskId, @Nullable Bundle sideOptions, @SplitPosition int sidePosition, - @Nullable IRemoteTransition remoteTransition) { + @Nullable RemoteTransition remoteTransition) { executeRemoteCallWithTaskPermission(mController, "startTasks", (controller) -> controller.mStageCoordinator.startTasks(mainTaskId, mainOptions, sideTaskId, sideOptions, sidePosition, remoteTransition)); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java index 69d0be6abc0b..86e7b0e4cb7f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java @@ -35,7 +35,7 @@ import android.graphics.Rect; import android.os.IBinder; import android.view.SurfaceControl; import android.view.WindowManager; -import android.window.IRemoteTransition; +import android.window.RemoteTransition; import android.window.TransitionInfo; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; @@ -169,7 +169,7 @@ class SplitScreenTransitions { /** Starts a transition to enter split with a remote transition animator. */ IBinder startEnterTransition(@WindowManager.TransitionType int transitType, - @NonNull WindowContainerTransaction wct, @Nullable IRemoteTransition remoteTransition, + @NonNull WindowContainerTransaction wct, @Nullable RemoteTransition remoteTransition, @NonNull Transitions.TransitionHandler handler) { if (remoteTransition != null) { // Wrapping it for ease-of-use (OneShot handles all the binder linking/death stuff) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 9e6edd2a5381..33c3fb70acb6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -72,7 +72,7 @@ import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.WindowManager; import android.window.DisplayAreaInfo; -import android.window.IRemoteTransition; +import android.window.RemoteTransition; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerToken; @@ -263,7 +263,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, /** Starts 2 tasks in one transition. */ void startTasks(int mainTaskId, @Nullable Bundle mainOptions, int sideTaskId, @Nullable Bundle sideOptions, @SplitPosition int sidePosition, - @Nullable IRemoteTransition remoteTransition) { + @Nullable RemoteTransition remoteTransition) { final WindowContainerTransaction wct = new WindowContainerTransaction(); mainOptions = mainOptions != null ? mainOptions : new Bundle(); sideOptions = sideOptions != null ? sideOptions : new Bundle(); @@ -358,7 +358,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, public void startIntent(PendingIntent intent, Intent fillInIntent, @SplitScreen.StageType int stage, @SplitPosition int position, @androidx.annotation.Nullable Bundle options, - @Nullable IRemoteTransition remoteTransition) { + @Nullable RemoteTransition remoteTransition) { final WindowContainerTransaction wct = new WindowContainerTransaction(); options = resolveStartStage(stage, position, options, wct); wct.sendPendingIntent(intent, fillInIntent, options); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java index 7d011e6521a2..cdc0795e0331 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java @@ -343,7 +343,7 @@ public class TaskSnapshotWindow { static Rect getSystemBarInsets(Rect frame, InsetsState state) { return state.calculateInsets(frame, WindowInsets.Type.systemBars(), - false /* ignoreVisibility */); + false /* ignoreVisibility */).toRect(); } private void drawSnapshot() { @@ -364,6 +364,7 @@ public class TaskSnapshotWindow { // In case window manager leaks us, make sure we don't retain the snapshot. mSnapshot = null; + mSurfaceControl.release(); } private void drawSizeMatchSnapshot() { @@ -431,6 +432,7 @@ public class TaskSnapshotWindow { mTransaction.setBuffer(mSurfaceControl, background); } mTransaction.apply(); + childSurfaceControl.release(); } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IShellTransitions.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IShellTransitions.aidl index dffc700a3690..bdcdb63d2cd6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IShellTransitions.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/IShellTransitions.aidl @@ -16,7 +16,7 @@ package com.android.wm.shell.transition; -import android.window.IRemoteTransition; +import android.window.RemoteTransition; import android.window.TransitionFilter; /** @@ -28,10 +28,10 @@ interface IShellTransitions { * Registers a remote transition handler. */ oneway void registerRemote(in TransitionFilter filter, - in IRemoteTransition remoteTransition) = 1; + in RemoteTransition remoteTransition) = 1; /** * Unregisters a remote transition handler. */ - oneway void unregisterRemote(in IRemoteTransition remoteTransition) = 2; + oneway void unregisterRemote(in RemoteTransition remoteTransition) = 2; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java index 6bd805323aa3..3be896e4aca3 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/OneShotRemoteHandler.java @@ -24,6 +24,7 @@ import android.util.Log; import android.view.SurfaceControl; import android.window.IRemoteTransition; import android.window.IRemoteTransitionFinishedCallback; +import android.window.RemoteTransition; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerTransaction; @@ -43,10 +44,10 @@ public class OneShotRemoteHandler implements Transitions.TransitionHandler { private IBinder mTransition = null; /** The remote to delegate animation to */ - private final IRemoteTransition mRemote; + private final RemoteTransition mRemote; public OneShotRemoteHandler(@NonNull ShellExecutor mainExecutor, - @NonNull IRemoteTransition remote) { + @NonNull RemoteTransition remote) { mMainExecutor = mainExecutor; mRemote = remote; } @@ -88,7 +89,7 @@ public class OneShotRemoteHandler implements Transitions.TransitionHandler { if (mRemote.asBinder() != null) { mRemote.asBinder().linkToDeath(remoteDied, 0 /* flags */); } - mRemote.startAnimation(transition, info, startTransaction, cb); + mRemote.getRemoteTransition().startAnimation(transition, info, startTransaction, cb); } catch (RemoteException e) { Log.e(Transitions.TAG, "Error running remote transition.", e); if (mRemote.asBinder() != null) { @@ -115,7 +116,7 @@ public class OneShotRemoteHandler implements Transitions.TransitionHandler { } }; try { - mRemote.mergeAnimation(transition, info, t, mergeTarget, cb); + mRemote.getRemoteTransition().mergeAnimation(transition, info, t, mergeTarget, cb); } catch (RemoteException e) { Log.e(Transitions.TAG, "Error merging remote transition.", e); } @@ -125,8 +126,9 @@ public class OneShotRemoteHandler implements Transitions.TransitionHandler { @Nullable public WindowContainerTransaction handleRequest(@NonNull IBinder transition, @Nullable TransitionRequestInfo request) { - IRemoteTransition remote = request.getRemoteTransition(); - if (remote != mRemote) return null; + RemoteTransition remote = request.getRemoteTransition(); + IRemoteTransition iRemote = remote != null ? remote.getRemoteTransition() : null; + if (iRemote != mRemote.getRemoteTransition()) return null; mTransition = transition; ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "RemoteTransition directly requested" + " for %s: %s", transition, remote); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java index bda884cd80d9..ac612a7063d2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/RemoteTransitionHandler.java @@ -27,6 +27,7 @@ import android.util.Slog; import android.view.SurfaceControl; import android.window.IRemoteTransition; import android.window.IRemoteTransitionFinishedCallback; +import android.window.RemoteTransition; import android.window.TransitionFilter; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; @@ -50,10 +51,10 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { private final ShellExecutor mMainExecutor; /** Includes remotes explicitly requested by, eg, ActivityOptions */ - private final ArrayMap<IBinder, IRemoteTransition> mRequestedRemotes = new ArrayMap<>(); + private final ArrayMap<IBinder, RemoteTransition> mRequestedRemotes = new ArrayMap<>(); /** Ordered by specificity. Last filters will be checked first */ - private final ArrayList<Pair<TransitionFilter, IRemoteTransition>> mFilters = + private final ArrayList<Pair<TransitionFilter, RemoteTransition>> mFilters = new ArrayList<>(); private final ArrayMap<IBinder, RemoteDeathHandler> mDeathHandlers = new ArrayMap<>(); @@ -62,19 +63,12 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { mMainExecutor = mainExecutor; } - void addFiltered(TransitionFilter filter, IRemoteTransition remote) { - try { - RemoteDeathHandler handler = new RemoteDeathHandler(remote.asBinder()); - remote.asBinder().linkToDeath(handler, 0 /* flags */); - mDeathHandlers.put(remote.asBinder(), handler); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to link to death"); - return; - } + void addFiltered(TransitionFilter filter, RemoteTransition remote) { + handleDeath(remote.asBinder(), null /* finishCallback */); mFilters.add(new Pair<>(filter, remote)); } - void removeFiltered(IRemoteTransition remote) { + void removeFiltered(RemoteTransition remote) { boolean removed = false; for (int i = mFilters.size() - 1; i >= 0; --i) { if (mFilters.get(i).second == remote) { @@ -83,8 +77,7 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { } } if (removed) { - RemoteDeathHandler handler = mDeathHandlers.remove(remote.asBinder()); - remote.asBinder().unlinkToDeath(handler, 0 /* flags */); + unhandleDeath(remote.asBinder(), null /* finishCallback */); } } @@ -98,7 +91,7 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction, @NonNull Transitions.TransitionFinishCallback finishCallback) { - IRemoteTransition pendingRemote = mRequestedRemotes.get(transition); + RemoteTransition pendingRemote = mRequestedRemotes.get(transition); if (pendingRemote == null) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Transition %s doesn't have " + "explicit remote, search filters for match for %s", transition, info); @@ -120,21 +113,12 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { if (pendingRemote == null) return false; - final IRemoteTransition remote = pendingRemote; - final IBinder.DeathRecipient remoteDied = () -> { - Log.e(Transitions.TAG, "Remote transition died, finishing"); - mMainExecutor.execute(() -> { - mRequestedRemotes.remove(transition); - finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */); - }); - }; + final RemoteTransition remote = pendingRemote; IRemoteTransitionFinishedCallback cb = new IRemoteTransitionFinishedCallback.Stub() { @Override public void onTransitionFinished(WindowContainerTransaction wct, SurfaceControl.Transaction sct) { - if (remote.asBinder() != null) { - remote.asBinder().unlinkToDeath(remoteDied, 0 /* flags */); - } + unhandleDeath(remote.asBinder(), finishCallback); mMainExecutor.execute(() -> { if (sct != null) { finishTransaction.merge(sct); @@ -145,15 +129,11 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { } }; try { - if (remote.asBinder() != null) { - remote.asBinder().linkToDeath(remoteDied, 0 /* flags */); - } - remote.startAnimation(transition, info, startTransaction, cb); + handleDeath(remote.asBinder(), finishCallback); + remote.getRemoteTransition().startAnimation(transition, info, startTransaction, cb); } catch (RemoteException e) { Log.e(Transitions.TAG, "Error running remote transition.", e); - if (remote.asBinder() != null) { - remote.asBinder().unlinkToDeath(remoteDied, 0 /* flags */); - } + unhandleDeath(remote.asBinder(), finishCallback); mRequestedRemotes.remove(transition); mMainExecutor.execute( () -> finishCallback.onTransitionFinished(null /* wct */, null /* wctCB */)); @@ -165,7 +145,7 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { public void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget, @NonNull Transitions.TransitionFinishCallback finishCallback) { - final IRemoteTransition remote = mRequestedRemotes.get(mergeTarget); + final IRemoteTransition remote = mRequestedRemotes.get(mergeTarget).getRemoteTransition(); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Attempt merge %s into %s", transition, remote); if (remote == null) return; @@ -196,7 +176,7 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { @Nullable public WindowContainerTransaction handleRequest(@NonNull IBinder transition, @Nullable TransitionRequestInfo request) { - IRemoteTransition remote = request.getRemoteTransition(); + RemoteTransition remote = request.getRemoteTransition(); if (remote == null) return null; mRequestedRemotes.put(transition, remote); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "RemoteTransition directly requested" @@ -204,14 +184,70 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { return new WindowContainerTransaction(); } + private void handleDeath(@NonNull IBinder remote, + @Nullable Transitions.TransitionFinishCallback finishCallback) { + synchronized (mDeathHandlers) { + RemoteDeathHandler deathHandler = mDeathHandlers.get(remote); + if (deathHandler == null) { + deathHandler = new RemoteDeathHandler(remote); + try { + remote.linkToDeath(deathHandler, 0 /* flags */); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to link to death"); + return; + } + mDeathHandlers.put(remote, deathHandler); + } + deathHandler.addUser(finishCallback); + } + } + + private void unhandleDeath(@NonNull IBinder remote, + @Nullable Transitions.TransitionFinishCallback finishCallback) { + synchronized (mDeathHandlers) { + RemoteDeathHandler deathHandler = mDeathHandlers.get(remote); + if (deathHandler == null) return; + deathHandler.removeUser(finishCallback); + if (deathHandler.getUserCount() == 0) { + if (!deathHandler.mPendingFinishCallbacks.isEmpty()) { + throw new IllegalStateException("Unhandling death for binder that still has" + + " pending finishCallback(s)."); + } + remote.unlinkToDeath(deathHandler, 0 /* flags */); + mDeathHandlers.remove(remote); + } + } + } + /** NOTE: binder deaths can alter the filter order */ private class RemoteDeathHandler implements IBinder.DeathRecipient { private final IBinder mRemote; + private final ArrayList<Transitions.TransitionFinishCallback> mPendingFinishCallbacks = + new ArrayList<>(); + private int mUsers = 0; RemoteDeathHandler(IBinder remote) { mRemote = remote; } + void addUser(@Nullable Transitions.TransitionFinishCallback finishCallback) { + if (finishCallback != null) { + mPendingFinishCallbacks.add(finishCallback); + } + ++mUsers; + } + + void removeUser(@Nullable Transitions.TransitionFinishCallback finishCallback) { + if (finishCallback != null) { + mPendingFinishCallbacks.remove(finishCallback); + } + --mUsers; + } + + int getUserCount() { + return mUsers; + } + @Override @BinderThread public void binderDied() { @@ -221,6 +257,16 @@ public class RemoteTransitionHandler implements Transitions.TransitionHandler { mFilters.remove(i); } } + for (int i = mRequestedRemotes.size() - 1; i >= 0; --i) { + if (mRemote.equals(mRequestedRemotes.valueAt(i).asBinder())) { + mRequestedRemotes.removeAt(i); + } + } + for (int i = mPendingFinishCallbacks.size() - 1; i >= 0; --i) { + mPendingFinishCallbacks.get(i).onTransitionFinished( + null /* wct */, null /* wctCB */); + } + mPendingFinishCallbacks.clear(); }); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ShellTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ShellTransitions.java index bc42c6e2f12c..802d25f66340 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ShellTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ShellTransitions.java @@ -17,7 +17,7 @@ package com.android.wm.shell.transition; import android.annotation.NonNull; -import android.window.IRemoteTransition; +import android.window.RemoteTransition; import android.window.TransitionFilter; import com.android.wm.shell.common.annotations.ExternalThread; @@ -39,10 +39,10 @@ public interface ShellTransitions { * Registers a remote transition. */ void registerRemote(@NonNull TransitionFilter filter, - @NonNull IRemoteTransition remoteTransition); + @NonNull RemoteTransition remoteTransition); /** * Unregisters a remote transition. */ - void unregisterRemote(@NonNull IRemoteTransition remoteTransition); + void unregisterRemote(@NonNull RemoteTransition remoteTransition); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index 8d21ce25bcd0..27201572d3e8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -40,8 +40,8 @@ import android.provider.Settings; import android.util.Log; import android.view.SurfaceControl; import android.view.WindowManager; -import android.window.IRemoteTransition; import android.window.ITransitionPlayer; +import android.window.RemoteTransition; import android.window.TransitionFilter; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; @@ -176,13 +176,13 @@ public class Transitions implements RemoteCallable<Transitions> { return new ShellTransitions() { @Override public void registerRemote(@androidx.annotation.NonNull TransitionFilter filter, - @androidx.annotation.NonNull IRemoteTransition remoteTransition) { + @androidx.annotation.NonNull RemoteTransition remoteTransition) { // Do nothing } @Override public void unregisterRemote( - @androidx.annotation.NonNull IRemoteTransition remoteTransition) { + @androidx.annotation.NonNull RemoteTransition remoteTransition) { // Do nothing } }; @@ -218,12 +218,12 @@ public class Transitions implements RemoteCallable<Transitions> { /** Register a remote transition to be used when `filter` matches an incoming transition */ public void registerRemote(@NonNull TransitionFilter filter, - @NonNull IRemoteTransition remoteTransition) { + @NonNull RemoteTransition remoteTransition) { mRemoteTransitionHandler.addFiltered(filter, remoteTransition); } /** Unregisters a remote transition and all associated filters */ - public void unregisterRemote(@NonNull IRemoteTransition remoteTransition) { + public void unregisterRemote(@NonNull RemoteTransition remoteTransition) { mRemoteTransitionHandler.removeFiltered(remoteTransition); } @@ -704,14 +704,14 @@ public class Transitions implements RemoteCallable<Transitions> { @Override public void registerRemote(@NonNull TransitionFilter filter, - @NonNull IRemoteTransition remoteTransition) { + @NonNull RemoteTransition remoteTransition) { mMainExecutor.execute(() -> { mRemoteTransitionHandler.addFiltered(filter, remoteTransition); }); } @Override - public void unregisterRemote(@NonNull IRemoteTransition remoteTransition) { + public void unregisterRemote(@NonNull RemoteTransition remoteTransition) { mMainExecutor.execute(() -> { mRemoteTransitionHandler.removeFiltered(remoteTransition); }); @@ -738,7 +738,7 @@ public class Transitions implements RemoteCallable<Transitions> { @Override public void registerRemote(@NonNull TransitionFilter filter, - @NonNull IRemoteTransition remoteTransition) { + @NonNull RemoteTransition remoteTransition) { executeRemoteCallWithTaskPermission(mTransitions, "registerRemote", (transitions) -> { transitions.mRemoteTransitionHandler.addFiltered(filter, remoteTransition); @@ -746,7 +746,7 @@ public class Transitions implements RemoteCallable<Transitions> { } @Override - public void unregisterRemote(@NonNull IRemoteTransition remoteTransition) { + public void unregisterRemote(@NonNull RemoteTransition remoteTransition) { executeRemoteCallWithTaskPermission(mTransitions, "unregisterRemote", (transitions) -> { transitions.mRemoteTransitionHandler.removeFiltered(remoteTransition); diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/PipAppHelper.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/PipAppHelper.kt index d4b4e5daf7cb..1529f5bcd7e1 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/PipAppHelper.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/PipAppHelper.kt @@ -17,11 +17,14 @@ package com.android.wm.shell.flicker.helpers import android.app.Instrumentation +import android.graphics.Rect import android.media.session.MediaController import android.media.session.MediaSessionManager import android.os.SystemClock import androidx.test.uiautomator.By import androidx.test.uiautomator.BySelector +import androidx.test.uiautomator.Until +import com.android.server.wm.flicker.helpers.FIND_TIMEOUT import com.android.server.wm.flicker.helpers.SYSTEMUI_PACKAGE import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper import com.android.wm.shell.flicker.pip.tv.closeTvPipWindow @@ -85,6 +88,10 @@ class PipAppHelper(instrumentation: Instrumentation) : BaseAppHelper( // Wait on WMHelper or simply wait for 3 seconds wmHelper?.waitFor("hasPipWindow") { it.wmState.hasPipWindow() } ?: SystemClock.sleep(3_000) + // when entering pip, the dismiss button is visible at the start. to ensure the pip + // animation is complete, wait until the pip dismiss button is no longer visible. + // b/176822698: dismiss-only state will be removed in the future + uiDevice.wait(Until.gone(By.res(SYSTEMUI_PACKAGE, "dismiss")), FIND_TIMEOUT) } fun clickStartMediaSessionButton() { @@ -113,25 +120,25 @@ class PipAppHelper(instrumentation: Instrumentation) : BaseAppHelper( } } + private fun getWindowRect(wmHelper: WindowManagerStateHelper): Rect { + val windowRegion = wmHelper.getWindowRegion(component) + require(!windowRegion.isEmpty) { + "Unable to find a PIP window in the current state" + } + return windowRegion.bounds + } + /** * Expands the pip window and dismisses it by clicking on the X button. - * - * Note, currently the View coordinates reported by the accessibility are relative to - * the window, so the correct coordinates need to be calculated - * - * For example, in a PIP window located at Rect(508, 1444 - 1036, 1741), the - * dismiss button coordinates are shown as Rect(650, 0 - 782, 132), with center in - * Point(716, 66), instead of Point(970, 1403) - * - * See b/179337864 */ fun closePipWindow(wmHelper: WindowManagerStateHelper) { if (isTelevision) { uiDevice.closeTvPipWindow() } else { - expandPipWindow(wmHelper) + val windowRect = getWindowRect(wmHelper) + uiDevice.click(windowRect.centerX(), windowRect.centerY()) val exitPipObject = uiDevice.findObject(By.res(SYSTEMUI_PACKAGE, "dismiss")) - requireNotNull(exitPipObject) { "PIP window dismiss button not found" } + ?: error("PIP window dismiss button not found") val dismissButtonBounds = exitPipObject.visibleBounds uiDevice.click(dismissButtonBounds.centerX(), dismissButtonBounds.centerY()) } @@ -142,32 +149,29 @@ class PipAppHelper(instrumentation: Instrumentation) : BaseAppHelper( } /** - * Click once on the PIP window to expand it + * Close the pip window by pressing the expand button */ - fun expandPipWindow(wmHelper: WindowManagerStateHelper) { - val windowRegion = wmHelper.getWindowRegion(component) - require(!windowRegion.isEmpty) { - "Unable to find a PIP window in the current state" - } - val windowRect = windowRegion.bounds + fun expandPipWindowToApp(wmHelper: WindowManagerStateHelper) { + val windowRect = getWindowRect(wmHelper) uiDevice.click(windowRect.centerX(), windowRect.centerY()) - // Ensure WindowManagerService wait until all animations have completed + // search and interact with the expand button + val expandSelector = By.res(SYSTEMUI_PACKAGE, "expand_button") + uiDevice.wait(Until.hasObject(expandSelector), FIND_TIMEOUT) + val expandPipObject = uiDevice.findObject(expandSelector) + ?: error("PIP window expand button not found") + val expandButtonBounds = expandPipObject.visibleBounds + uiDevice.click(expandButtonBounds.centerX(), expandButtonBounds.centerY()) + wmHelper.waitFor("!hasPipWindow") { !it.wmState.hasPipWindow() } wmHelper.waitForAppTransitionIdle() - mInstrumentation.uiAutomation.syncInputTransactions() } /** - * Double click on the PIP window to reopen to app + * Double click on the PIP window to expand it */ - fun expandPipWindowToApp(wmHelper: WindowManagerStateHelper) { - val windowRegion = wmHelper.getWindowRegion(component) - require(!windowRegion.isEmpty) { - "Unable to find a PIP window in the current state" - } - val windowRect = windowRegion.bounds + fun doubleClickPipWindow(wmHelper: WindowManagerStateHelper) { + val windowRect = getWindowRect(wmHelper) uiDevice.click(windowRect.centerX(), windowRect.centerY()) uiDevice.click(windowRect.centerX(), windowRect.centerY()) - wmHelper.waitFor("!hasPipWindow") { !it.wmState.hasPipWindow() } wmHelper.waitForAppTransitionIdle() } diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ExitPrimarySplitScreenShowSecondaryFullscreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ExitPrimarySplitScreenShowSecondaryFullscreen.kt index af99fc4af1a0..ff34364261f2 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ExitPrimarySplitScreenShowSecondaryFullscreen.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ExitPrimarySplitScreenShowSecondaryFullscreen.kt @@ -17,7 +17,6 @@ package com.android.wm.shell.flicker.legacysplitscreen import android.content.ComponentName -import android.platform.test.annotations.Postsubmit import android.platform.test.annotations.Presubmit import android.view.Surface import androidx.test.filters.FlakyTest @@ -113,7 +112,7 @@ class ExitPrimarySplitScreenShowSecondaryFullscreen( override fun visibleLayersShownMoreThanOneConsecutiveEntry() = super.visibleLayersShownMoreThanOneConsecutiveEntry() - @Postsubmit + @Presubmit @Test override fun visibleWindowsShownMoreThanOneConsecutiveEntry() = super.visibleWindowsShownMoreThanOneConsecutiveEntry() diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenToLauncher.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenToLauncher.kt index 7b4b71b41967..5fb6f1fa1076 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenToLauncher.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenToLauncher.kt @@ -104,7 +104,7 @@ class LegacySplitScreenToLauncher( @Presubmit @Test - fun entireScreenCovered() = testSpec.entireScreenCovered(testSpec.config.endRotation) + fun entireScreenCovered() = testSpec.entireScreenCovered() @Presubmit @Test diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/OpenAppToLegacySplitScreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/OpenAppToLegacySplitScreen.kt index ec0c73a58846..a7ac6a77d425 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/OpenAppToLegacySplitScreen.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/OpenAppToLegacySplitScreen.kt @@ -28,7 +28,6 @@ import com.android.server.wm.flicker.annotation.Group2 import com.android.server.wm.flicker.dsl.FlickerBuilder import com.android.server.wm.flicker.entireScreenCovered import com.android.server.wm.flicker.helpers.launchSplitScreen -import com.android.server.wm.flicker.startRotation import com.android.server.wm.flicker.statusBarLayerIsVisible import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper import com.android.wm.shell.flicker.appPairsDividerBecomesVisible @@ -77,7 +76,7 @@ class OpenAppToLegacySplitScreen( @Presubmit @Test - fun entireScreenCovered() = testSpec.entireScreenCovered(testSpec.config.startRotation) + fun entireScreenCovered() = testSpec.entireScreenCovered() @Presubmit @Test diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ResizeLegacySplitScreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ResizeLegacySplitScreen.kt index d7f71a83ba7e..cd150518f21f 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ResizeLegacySplitScreen.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/ResizeLegacySplitScreen.kt @@ -129,7 +129,7 @@ class ResizeLegacySplitScreen( fun statusBarLayerIsVisible() = testSpec.statusBarLayerIsVisible() @Test - fun entireScreenCovered() = testSpec.entireScreenCovered(testSpec.config.endRotation) + fun entireScreenCovered() = testSpec.entireScreenCovered() @Test fun navBarLayerRotatesAndScales() = diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt index 0f0a4abe30ef..046972d246e6 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt @@ -23,8 +23,10 @@ import androidx.test.filters.RequiresDevice import com.android.server.wm.flicker.FlickerParametersRunnerFactory import com.android.server.wm.flicker.FlickerTestParameter import com.android.server.wm.flicker.FlickerTestParameterFactory +import com.android.server.wm.flicker.LAUNCHER_COMPONENT import com.android.server.wm.flicker.annotation.Group3 import com.android.server.wm.flicker.dsl.FlickerBuilder +import com.android.server.wm.traces.parser.toLayerName import org.junit.FixMethodOrder import org.junit.Test import org.junit.runner.RunWith @@ -32,8 +34,21 @@ import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** - * Test Pip launch. + * Test entering pip from an app by interacting with the app UI + * * To run this test: `atest WMShellFlickerTests:EnterPipTest` + * + * Actions: + * Launch an app in full screen + * Press an "enter pip" button to put [pipApp] in pip mode + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited [PipTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup */ @RequiresDevice @RunWith(Parameterized::class) @@ -41,14 +56,19 @@ import org.junit.runners.Parameterized @FixMethodOrder(MethodSorters.NAME_ASCENDING) @Group3 class EnterPipTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) { + /** + * Defines the transition used to run the test + */ override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit get() = buildTransition(eachRun = true, stringExtras = emptyMap()) { transitions { pipApp.clickEnterPipButton(wmHelper) - pipApp.expandPipWindow(wmHelper) } } + /** + * Checks [pipApp] window remains visible throughout the animation + */ @Presubmit @Test fun pipAppWindowAlwaysVisible() { @@ -57,6 +77,9 @@ class EnterPipTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) { } } + /** + * Checks [pipApp] layer remains visible throughout the animation + */ @Presubmit @Test fun pipAppLayerAlwaysVisible() { @@ -65,19 +88,89 @@ class EnterPipTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) { } } - @FlakyTest + /** + * Checks that the pip app window remains inside the display bounds throughout the whole + * animation + */ + @Presubmit @Test - fun pipWindowBecomesVisible() { + fun pipWindowRemainInsideVisibleBounds() { testSpec.assertWm { - invoke("pipWindowIsNotVisible") { - verify("Has no pip window").that(it.wmState.hasPipWindow()).isTrue() - }.then().invoke("pipWindowIsVisible") { - verify("Has pip window").that(it.wmState.hasPipWindow()).isTrue() + coversAtMost(displayBounds, pipApp.component) + } + } + + /** + * Checks that the pip app layer remains inside the display bounds throughout the whole + * animation + */ + @Presubmit + @Test + fun pipLayerRemainInsideVisibleBounds() { + testSpec.assertLayers { + coversAtMost(displayBounds, pipApp.component) + } + } + + /** + * Checks that the visible region of [pipApp] always reduces during the animation + */ + @Presubmit + @Test + fun pipLayerReduces() { + val layerName = pipApp.component.toLayerName() + testSpec.assertLayers { + val pipLayerList = this.layers { it.name.contains(layerName) && it.isVisible } + pipLayerList.zipWithNext { previous, current -> + current.visibleRegion.coversAtMost(previous.visibleRegion.region) } } } + /** + * Checks that [pipApp] window becomes pinned + */ + @Presubmit + @Test + fun pipWindowBecomesPinned() { + testSpec.assertWm { + invoke("pipWindowIsNotPinned") { it.isNotPinned(pipApp.component) } + .then() + .invoke("pipWindowIsPinned") { it.isPinned(pipApp.component) } + } + } + + /** + * Checks [LAUNCHER_COMPONENT] layer remains visible throughout the animation + */ + @Presubmit + @Test + fun launcherLayerBecomesVisible() { + testSpec.assertLayers { + isInvisible(LAUNCHER_COMPONENT) + .then() + .isVisible(LAUNCHER_COMPONENT) + } + } + + /** + * Checks the focus doesn't change during the animation + */ + @FlakyTest + @Test + fun focusDoesNotChange() { + testSpec.assertEventLog { + this.focusDoesNotChange() + } + } + companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ @Parameterized.Parameters(name = "{0}") @JvmStatic fun getParams(): List<FlickerTestParameter> { diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientationTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientationTest.kt index 67ad322f19f6..097ccb8cd734 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientationTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipToOtherOrientationTest.kt @@ -25,7 +25,11 @@ import com.android.server.wm.flicker.FlickerTestParameter import com.android.server.wm.flicker.FlickerTestParameterFactory import com.android.server.wm.flicker.annotation.Group3 import com.android.server.wm.flicker.dsl.FlickerBuilder +import com.android.server.wm.flicker.entireScreenCovered import com.android.server.wm.flicker.helpers.WindowUtils +import com.android.server.wm.flicker.navBarLayerRotatesAndScales +import com.android.server.wm.flicker.statusBarLayerRotatesScales +import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper import com.android.wm.shell.flicker.helpers.FixedAppHelper import com.android.wm.shell.flicker.pip.PipTransition.BroadcastActionTrigger.Companion.ORIENTATION_LANDSCAPE import com.android.wm.shell.flicker.pip.PipTransition.BroadcastActionTrigger.Companion.ORIENTATION_PORTRAIT @@ -38,8 +42,22 @@ import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** - * Test Pip with orientation changes. - * To run this test: `atest WMShellFlickerTests:PipOrientationTest` + * Test entering pip while changing orientation (from app in landscape to pip window in portrait) + * + * To run this test: `atest EnterPipToOtherOrientationTest:EnterPipToOtherOrientationTest` + * + * Actions: + * Launch [testApp] on a fixed portrait orientation + * Launch [pipApp] on a fixed landscape orientation + * Broadcast action [ACTION_ENTER_PIP] to enter pip mode + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited [PipTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup */ @RequiresDevice @RunWith(Parameterized::class) @@ -53,6 +71,9 @@ class EnterPipToOtherOrientationTest( private val startingBounds = WindowUtils.getDisplayBounds(Surface.ROTATION_90) private val endingBounds = WindowUtils.getDisplayBounds(Surface.ROTATION_0) + /** + * Defines the transition used to run the test + */ override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit get() = { configuration -> setupAndTeardown(this, configuration) @@ -79,21 +100,41 @@ class EnterPipToOtherOrientationTest( broadcastActionTrigger.doAction(ACTION_ENTER_PIP) wmHelper.waitFor { it.wmState.hasPipWindow() } wmHelper.waitForAppTransitionIdle() + // during rotation the status bar becomes invisible and reappears at the end + wmHelper.waitForNavBarStatusBarVisible() } } + /** + * Checks that the [WindowManagerStateHelper.NAV_BAR_COMPONENT] has the correct position at + * the start and end of the transition + */ @FlakyTest @Test - override fun navBarLayerRotatesAndScales() = super.navBarLayerRotatesAndScales() + override fun navBarLayerRotatesAndScales() = + testSpec.navBarLayerRotatesAndScales(Surface.ROTATION_90, Surface.ROTATION_0) - @FlakyTest + /** + * Checks that the [WindowManagerStateHelper.STATUS_BAR_COMPONENT] has the correct position at + * the start and end of the transition + */ + @Presubmit @Test - override fun statusBarLayerRotatesScales() = super.statusBarLayerRotatesScales() + override fun statusBarLayerRotatesScales() = + testSpec.statusBarLayerRotatesScales(Surface.ROTATION_90, Surface.ROTATION_0) - @FlakyTest + /** + * Checks that all parts of the screen are covered at the start and end of the transition + * + * TODO b/197726599 Prevents all states from being checked + */ + @Presubmit @Test - override fun entireScreenCovered() = super.entireScreenCovered() + override fun entireScreenCovered() = testSpec.entireScreenCovered(allStates = false) + /** + * Checks [pipApp] window remains visible and on top throughout the transition + */ @Presubmit @Test fun pipAppWindowIsAlwaysOnTop() { @@ -102,40 +143,84 @@ class EnterPipToOtherOrientationTest( } } + /** + * Checks that [testApp] window is not visible at the start + */ @Presubmit @Test - fun pipAppHidesTestApp() { + fun testAppWindowInvisibleOnStart() { testSpec.assertWmStart { isInvisible(testApp.component) } } + /** + * Checks that [testApp] window is visible at the end + */ @Presubmit @Test - fun testAppWindowIsVisible() { + fun testAppWindowVisibleOnEnd() { testSpec.assertWmEnd { isVisible(testApp.component) } } + /** + * Checks that [testApp] layer is not visible at the start + */ @Presubmit @Test - fun pipAppLayerHidesTestApp() { + fun testAppLayerInvisibleOnStart() { testSpec.assertLayersStart { - visibleRegion(pipApp.component).coversExactly(startingBounds) isInvisible(testApp.component) } } + /** + * Checks that [testApp] layer is visible at the end + */ + @Presubmit + @Test + fun testAppLayerVisibleOnEnd() { + testSpec.assertLayersEnd { + isVisible(testApp.component) + } + } + + /** + * Checks that the visible region of [pipApp] covers the full display area at the start of + * the transition + */ + @Presubmit + @Test + fun pipAppLayerCoversFullScreenOnStart() { + testSpec.assertLayersStart { + visibleRegion(pipApp.component).coversExactly(startingBounds) + } + } + + /** + * Checks that the visible region of [testApp] plus the visible region of [pipApp] + * cover the full display area at the end of the transition + */ @Presubmit @Test - fun testAppLayerCoversFullScreen() { + fun testAppPlusPipLayerCoversFullScreenOnEnd() { testSpec.assertLayersEnd { - visibleRegion(testApp.component).coversExactly(endingBounds) + val pipRegion = visibleRegion(pipApp.component).region + visibleRegion(testApp.component) + .plus(pipRegion) + .coversExactly(endingBounds) } } companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ @Parameterized.Parameters(name = "{0}") @JvmStatic fun getParams(): Collection<FlickerTestParameter> { diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipToAppTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipToAppTransition.kt new file mode 100644 index 000000000000..faaaecb8da46 --- /dev/null +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipToAppTransition.kt @@ -0,0 +1,131 @@ +/* + * 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. + */ + +package com.android.wm.shell.flicker.pip + +import android.platform.test.annotations.Presubmit +import com.android.server.wm.flicker.FlickerTestParameter +import com.android.server.wm.traces.parser.toLayerName +import com.android.wm.shell.flicker.helpers.FixedAppHelper +import org.junit.Test + +/** + * Base class for pip expand tests + */ +abstract class ExitPipToAppTransition(testSpec: FlickerTestParameter) : PipTransition(testSpec) { + protected val testApp = FixedAppHelper(instrumentation) + + /** + * Checks that the pip app window remains inside the display bounds throughout the whole + * animation + */ + @Presubmit + @Test + open fun pipAppWindowRemainInsideVisibleBounds() { + testSpec.assertWm { + coversAtMost(displayBounds, pipApp.component) + } + } + + /** + * Checks that the pip app layer remains inside the display bounds throughout the whole + * animation + */ + @Presubmit + @Test + open fun pipAppLayerRemainInsideVisibleBounds() { + testSpec.assertLayers { + coversAtMost(displayBounds, pipApp.component) + } + } + + /** + * Checks both app windows are visible at the start of the transition (with [pipApp] on top). + * Then, during the transition, [testApp] becomes invisible and [pipApp] remains visible + */ + @Presubmit + @Test + open fun showBothAppWindowsThenHidePip() { + testSpec.assertWm { + // when the activity is STOPPING, sometimes it becomes invisible in an entry before + // the window, sometimes in the same entry. This occurs because we log 1x per frame + // thus we ignore activity here + isAppWindowVisible(testApp.component, ignoreActivity = true) + .isAppWindowOnTop(pipApp.component) + .then() + .isAppWindowInvisible(testApp.component) + .isAppWindowVisible(pipApp.component) + } + } + + /** + * Checks both app layers are visible at the start of the transition. Then, during the + * transition, [testApp] becomes invisible and [pipApp] remains visible + */ + @Presubmit + @Test + open fun showBothAppLayersThenHidePip() { + testSpec.assertLayers { + isVisible(testApp.component) + .isVisible(pipApp.component) + .then() + .isInvisible(testApp.component) + .isVisible(pipApp.component) + } + } + + /** + * Checks that the visible region of [testApp] plus the visible region of [pipApp] + * cover the full display area at the start of the transition + */ + @Presubmit + @Test + open fun testPlusPipAppsCoverFullScreenAtStart() { + testSpec.assertLayersStart { + val pipRegion = visibleRegion(pipApp.component).region + visibleRegion(testApp.component) + .plus(pipRegion) + .coversExactly(displayBounds) + } + } + + /** + * Checks that the visible region of [pipApp] covers the full display area at the end of + * the transition + */ + @Presubmit + @Test + open fun pipAppCoversFullScreenAtEnd() { + testSpec.assertLayersEnd { + visibleRegion(pipApp.component).coversExactly(displayBounds) + } + } + + /** + * Checks that the visible region of [pipApp] always expands during the animation + */ + @Presubmit + @Test + open fun pipLayerExpands() { + val layerName = pipApp.component.toLayerName() + testSpec.assertLayers { + val pipLayerList = this.layers { it.name.contains(layerName) && it.isVisible } + pipLayerList.zipWithNext { previous, current -> + current.visibleRegion.coversAtLeast(previous.visibleRegion.region) + } + } + } +} diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipCloseTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt index 28b1028d41ca..3414031d3532 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipCloseTransition.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt @@ -20,15 +20,16 @@ import android.platform.test.annotations.Presubmit import android.view.Surface import androidx.test.filters.FlakyTest import com.android.server.wm.flicker.FlickerTestParameter -import com.android.server.wm.flicker.FlickerTestParameterFactory import com.android.server.wm.flicker.LAUNCHER_COMPONENT import com.android.server.wm.flicker.dsl.FlickerBuilder import com.android.server.wm.flicker.helpers.setRotation import com.android.server.wm.flicker.startRotation import org.junit.Test -import org.junit.runners.Parameterized -abstract class PipCloseTransition(testSpec: FlickerTestParameter) : PipTransition(testSpec) { +/** + * Base class for exiting pip (closing pip window) without returning to the app + */ +abstract class ExitPipTransition(testSpec: FlickerTestParameter) : PipTransition(testSpec) { override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit get() = buildTransition(eachRun = true) { configuration -> setup { @@ -43,16 +44,28 @@ abstract class PipCloseTransition(testSpec: FlickerTestParameter) : PipTransitio } } + /** + * Checks that [pipApp] window is pinned and visible at the start and then becomes + * unpinned and invisible at the same moment, and remains unpinned and invisible + * until the end of the transition + */ @Presubmit @Test open fun pipWindowBecomesInvisible() { testSpec.assertWm { - this.invoke("hasPipWindow") { it.isPinned(pipApp.component) } - .then() - .isAppWindowInvisible(pipApp.component) + this.invoke("hasPipWindow") { + it.isPinned(pipApp.component).isVisible(pipApp.component) + }.then().invoke("!hasPipWindow") { + it.isNotPinned(pipApp.component).isInvisible(pipApp.component) + } } } + /** + * Checks that [pipApp] and [LAUNCHER_COMPONENT] layers are visible at the start + * of the transition. Then [pipApp] layer becomes invisible, and remains invisible + * until the end of the transition + */ @Presubmit @Test open fun pipLayerBecomesInvisible() { @@ -65,6 +78,10 @@ abstract class PipCloseTransition(testSpec: FlickerTestParameter) : PipTransitio } } + /** + * Checks that the focus changes between the [pipApp] window and the launcher when + * closing the pip window + */ @FlakyTest(bugId = 151179149) @Test open fun focusChanges() { @@ -72,14 +89,4 @@ abstract class PipCloseTransition(testSpec: FlickerTestParameter) : PipTransitio this.focusChanges(pipApp.launcherName, "NexusLauncherActivity") } } - - companion object { - @Parameterized.Parameters(name = "{0}") - @JvmStatic - fun getParams(): List<FlickerTestParameter> { - return FlickerTestParameterFactory.getInstance() - .getConfigNonRotationTests(supportedRotations = listOf(Surface.ROTATION_0), - repetitions = 5) - } - } }
\ No newline at end of file diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt new file mode 100644 index 000000000000..fa100b5b25ab --- /dev/null +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt @@ -0,0 +1,93 @@ +/* + * 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.wm.shell.flicker.pip + +import android.view.Surface +import androidx.test.filters.RequiresDevice +import com.android.server.wm.flicker.FlickerParametersRunnerFactory +import com.android.server.wm.flicker.FlickerTestParameter +import com.android.server.wm.flicker.FlickerTestParameterFactory +import com.android.server.wm.flicker.annotation.Group3 +import com.android.server.wm.flicker.dsl.FlickerBuilder +import com.android.server.wm.traces.parser.toWindowName +import org.junit.FixMethodOrder +import org.junit.runner.RunWith +import org.junit.runners.MethodSorters +import org.junit.runners.Parameterized + +/** + * Test expanding a pip window back to full screen via the expand button + * + * To run this test: `atest WMShellFlickerTests:ExitPipViaExpandButtonClickTest` + * + * Actions: + * Launch an app in pip mode [pipApp], + * Launch another full screen mode [testApp] + * Expand [pipApp] app to full screen by clicking on the pip window and + * then on the expand button + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited [PipTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup + */ +@RequiresDevice +@RunWith(Parameterized::class) +@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@Group3 +class ExitPipViaExpandButtonClickTest( + testSpec: FlickerTestParameter +) : ExitPipToAppTransition(testSpec) { + + /** + * Defines the transition used to run the test + */ + override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit + get() = buildTransition(eachRun = true) { + setup { + eachRun { + // launch an app behind the pip one + testApp.launchViaIntent(wmHelper) + } + } + transitions { + // This will bring PipApp to fullscreen + pipApp.expandPipWindowToApp(wmHelper) + // Wait until the other app is no longer visible + wmHelper.waitForSurfaceAppeared(testApp.component.toWindowName()) + } + } + + companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ + @Parameterized.Parameters(name = "{0}") + @JvmStatic + fun getParams(): List<FlickerTestParameter> { + return FlickerTestParameterFactory.getInstance().getConfigNonRotationTests( + supportedRotations = listOf(Surface.ROTATION_0), repetitions = 5) + } + } +}
\ No newline at end of file diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterExitPipTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaIntentTest.kt index 39e89fbd9b71..617ef221ee9a 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterExitPipTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaIntentTest.kt @@ -16,8 +16,6 @@ package com.android.wm.shell.flicker.pip -import android.platform.test.annotations.Postsubmit -import android.platform.test.annotations.Presubmit import android.view.Surface import androidx.test.filters.RequiresDevice import com.android.server.wm.flicker.FlickerParametersRunnerFactory @@ -25,91 +23,63 @@ import com.android.server.wm.flicker.FlickerTestParameter import com.android.server.wm.flicker.FlickerTestParameterFactory import com.android.server.wm.flicker.annotation.Group3 import com.android.server.wm.flicker.dsl.FlickerBuilder -import com.android.wm.shell.flicker.helpers.FixedAppHelper +import com.android.server.wm.traces.parser.toWindowName import org.junit.FixMethodOrder -import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** - * Test Pip launch and exit. - * To run this test: `atest WMShellFlickerTests:EnterExitPipTest` + * Test expanding a pip window back to full screen via an intent + * + * To run this test: `atest WMShellFlickerTests:ExitPipViaIntentTest` + * + * Actions: + * Launch an app in pip mode [pipApp], + * Launch another full screen mode [testApp] + * Expand [pipApp] app to full screen via an intent + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited from [PipTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup */ @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) @Group3 -class EnterExitPipTest( - testSpec: FlickerTestParameter -) : PipTransition(testSpec) { - private val testApp = FixedAppHelper(instrumentation) +class ExitPipViaIntentTest(testSpec: FlickerTestParameter) : ExitPipToAppTransition(testSpec) { + /** + * Defines the transition used to run the test + */ override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit get() = buildTransition(eachRun = true) { setup { eachRun { + // launch an app behind the pip one testApp.launchViaIntent(wmHelper) } } transitions { // This will bring PipApp to fullscreen pipApp.launchViaIntent(wmHelper) + // Wait until the other app is no longer visible + wmHelper.waitForSurfaceAppeared(testApp.component.toWindowName()) } } - @Presubmit - @Test - fun pipAppRemainInsideVisibleBounds() { - testSpec.assertWm { - coversAtMost(displayBounds, pipApp.component) - } - } - - @Postsubmit - @Test - fun showBothAppWindowsThenHidePip() { - testSpec.assertWm { - // when the activity is STOPPING, sometimes it becomes invisible in an entry before - // the window, sometimes in the same entry. This occurs because we log 1x per frame - // thus we ignore activity here - isAppWindowVisible(testApp.component, ignoreActivity = true) - .isAppWindowOnTop(pipApp.component) - .then() - .isAppWindowInvisible(testApp.component) - } - } - - @Presubmit - @Test - fun showBothAppLayersThenHidePip() { - testSpec.assertLayers { - isVisible(testApp.component) - .isVisible(pipApp.component) - .then() - .isInvisible(testApp.component) - } - } - - @Presubmit - @Test - fun testAppCoversFullScreenWithPipOnDisplay() { - testSpec.assertLayersStart { - visibleRegion(testApp.component).coversExactly(displayBounds) - visibleRegion(pipApp.component).coversAtMost(displayBounds) - } - } - - @Presubmit - @Test - fun pipAppCoversFullScreen() { - testSpec.assertLayersEnd { - visibleRegion(pipApp.component).coversExactly(displayBounds) - } - } - companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ @Parameterized.Parameters(name = "{0}") @JvmStatic fun getParams(): List<FlickerTestParameter> { diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipCloseWithDismissButtonTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt index 1c5d77f68f43..e3d099f6fdb5 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipCloseWithDismissButtonTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt @@ -16,10 +16,12 @@ package com.android.wm.shell.flicker.pip -import androidx.test.filters.FlakyTest +import android.platform.test.annotations.Postsubmit +import android.view.Surface import androidx.test.filters.RequiresDevice import com.android.server.wm.flicker.FlickerParametersRunnerFactory import com.android.server.wm.flicker.FlickerTestParameter +import com.android.server.wm.flicker.FlickerTestParameterFactory import com.android.server.wm.flicker.annotation.Group3 import com.android.server.wm.flicker.dsl.FlickerBuilder import org.junit.FixMethodOrder @@ -29,15 +31,29 @@ import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** - * Test Pip launch. - * To run this test: `atest WMShellFlickerTests:PipCloseWithDismissButton` + * Test closing a pip window via the dismiss button + * + * To run this test: `atest WMShellFlickerTests:ExitPipWithDismissButtonTest` + * + * Actions: + * Launch an app in pip mode [pipApp], + * Click on the pip window + * Click on dismiss button and wait window disappear + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited [PipTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup */ @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) @Group3 -class PipCloseWithDismissButtonTest(testSpec: FlickerTestParameter) : PipCloseTransition(testSpec) { +class ExitPipWithDismissButtonTest(testSpec: FlickerTestParameter) : ExitPipTransition(testSpec) { override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit get() = { super.transition(this, it) @@ -46,11 +62,27 @@ class PipCloseWithDismissButtonTest(testSpec: FlickerTestParameter) : PipCloseTr } } - @FlakyTest + @Postsubmit @Test override fun pipLayerBecomesInvisible() = super.pipLayerBecomesInvisible() - @FlakyTest + @Postsubmit @Test override fun pipWindowBecomesInvisible() = super.pipWindowBecomesInvisible() + + companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ + @Parameterized.Parameters(name = "{0}") + @JvmStatic + fun getParams(): List<FlickerTestParameter> { + return FlickerTestParameterFactory.getInstance() + .getConfigNonRotationTests(supportedRotations = listOf(Surface.ROTATION_0), + repetitions = 5) + } + } }
\ No newline at end of file diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipCloseWithSwipeTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithSwipeDownTest.kt index 356ec94b97e3..2cdfc2bf0654 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipCloseWithSwipeTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithSwipeDownTest.kt @@ -22,6 +22,7 @@ import androidx.test.filters.FlakyTest import androidx.test.filters.RequiresDevice import com.android.server.wm.flicker.FlickerParametersRunnerFactory import com.android.server.wm.flicker.FlickerTestParameter +import com.android.server.wm.flicker.FlickerTestParameterFactory import com.android.server.wm.flicker.annotation.Group3 import com.android.server.wm.flicker.dsl.FlickerBuilder import com.android.server.wm.flicker.startRotation @@ -33,24 +34,40 @@ import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** - * Test Pip launch. - * To run this test: `atest WMShellFlickerTests:PipCloseWithSwipe` + * Test closing a pip window by swiping it to the bottom-center of the screen + * + * To run this test: `atest WMShellFlickerTests:ExitPipWithSwipeDownTest` + * + * Actions: + * Launch an app in pip mode [pipApp], + * Swipe the pip window to the bottom-center of the screen and wait it disappear + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited [PipTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup */ @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) @Group3 -class PipCloseWithSwipeTest(testSpec: FlickerTestParameter) : PipCloseTransition(testSpec) { +class ExitPipWithSwipeDownTest(testSpec: FlickerTestParameter) : ExitPipTransition(testSpec) { override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit - get() = { - super.transition(this, it) + get() = { args -> + super.transition(this, args) transitions { val pipRegion = wmHelper.getWindowRegion(pipApp.component).bounds val pipCenterX = pipRegion.centerX() val pipCenterY = pipRegion.centerY() val displayCenterX = device.displayWidth / 2 - device.swipe(pipCenterX, pipCenterY, displayCenterX, device.displayHeight, 5) + device.swipe(pipCenterX, pipCenterY, displayCenterX, device.displayHeight, 10) + wmHelper.waitFor("!hasPipWindow") { !it.wmState.hasPipWindow() } + wmHelper.waitForWindowSurfaceDisappeared(pipApp.component) + wmHelper.waitForAppTransitionIdle() } } @@ -90,4 +107,20 @@ class PipCloseWithSwipeTest(testSpec: FlickerTestParameter) : PipCloseTransition @Presubmit @Test override fun navBarLayerRotatesAndScales() = super.navBarLayerRotatesAndScales() + + companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ + @Parameterized.Parameters(name = "{0}") + @JvmStatic + fun getParams(): List<FlickerTestParameter> { + return FlickerTestParameterFactory.getInstance() + .getConfigNonRotationTests(supportedRotations = listOf(Surface.ROTATION_0), + repetitions = 20) + } + } }
\ No newline at end of file diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt new file mode 100644 index 000000000000..89b2c400e80a --- /dev/null +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt @@ -0,0 +1,176 @@ +/* + * 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. + */ + +package com.android.wm.shell.flicker.pip + +import android.platform.test.annotations.Postsubmit +import android.platform.test.annotations.Presubmit +import android.view.Surface +import androidx.test.filters.FlakyTest +import androidx.test.filters.RequiresDevice +import com.android.server.wm.flicker.FlickerParametersRunnerFactory +import com.android.server.wm.flicker.FlickerTestParameter +import com.android.server.wm.flicker.FlickerTestParameterFactory +import com.android.server.wm.flicker.LAUNCHER_COMPONENT +import com.android.server.wm.flicker.annotation.Group3 +import com.android.server.wm.flicker.dsl.FlickerBuilder +import com.android.server.wm.traces.parser.toLayerName +import org.junit.FixMethodOrder +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.MethodSorters +import org.junit.runners.Parameterized + +/** + * Test expanding a pip window by double clicking it + * + * To run this test: `atest WMShellFlickerTests:ExpandPipOnDoubleClickTest` + * + * Actions: + * Launch an app in pip mode [pipApp], + * Expand [pipApp] app to its maximum pip size by double clicking on it + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited [PipTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup + */ +@RequiresDevice +@RunWith(Parameterized::class) +@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@Group3 +class ExpandPipOnDoubleClickTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) { + override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit + get() = buildTransition(eachRun = true) { + transitions { + pipApp.doubleClickPipWindow(wmHelper) + } + } + + /** + * Checks that the pip app window remains inside the display bounds throughout the whole + * animation + */ + @Presubmit + @Test + fun pipWindowRemainInsideVisibleBounds() { + testSpec.assertWm { + coversAtMost(displayBounds, pipApp.component) + } + } + + /** + * Checks that the pip app layer remains inside the display bounds throughout the whole + * animation + */ + @Presubmit + @Test + fun pipLayerRemainInsideVisibleBounds() { + testSpec.assertLayers { + coversAtMost(displayBounds, pipApp.component) + } + } + + /** + * Checks [pipApp] window remains visible throughout the animation + */ + @Postsubmit + @Test + fun pipWindowIsAlwaysVisible() { + testSpec.assertWm { + isAppWindowVisible(pipApp.component) + } + } + + /** + * Checks [pipApp] layer remains visible throughout the animation + */ + @Presubmit + @Test + fun pipLayerIsAlwaysVisible() { + testSpec.assertLayers { + isVisible(pipApp.component) + } + } + + /** + * Checks that the visible region of [pipApp] always expands during the animation + */ + @Presubmit + @Test + fun pipLayerExpands() { + val layerName = pipApp.component.toLayerName() + testSpec.assertLayers { + val pipLayerList = this.layers { it.name.contains(layerName) && it.isVisible } + pipLayerList.zipWithNext { previous, current -> + current.visibleRegion.coversAtLeast(previous.visibleRegion.region) + } + } + } + + /** + * Checks [pipApp] window remains pinned throughout the animation + */ + @Presubmit + @Test + fun windowIsAlwaysPinned() { + testSpec.assertWm { + this.invoke("hasPipWindow") { it.isPinned(pipApp.component) } + } + } + + /** + * Checks [pipApp] layer remains visible throughout the animation + */ + @Presubmit + @Test + fun launcherIsAlwaysVisible() { + testSpec.assertLayers { + isVisible(LAUNCHER_COMPONENT) + } + } + + /** + * Checks that the focus doesn't change between windows during the transition + */ + @FlakyTest + @Test + fun focusDoesNotChange() { + testSpec.assertEventLog { + this.focusDoesNotChange() + } + } + + companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ + @Parameterized.Parameters(name = "{0}") + @JvmStatic + fun getParams(): List<FlickerTestParameter> { + return FlickerTestParameterFactory.getInstance() + .getConfigNonRotationTests(supportedRotations = listOf(Surface.ROTATION_0), + repetitions = 5) + } + } +} diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest.kt new file mode 100644 index 000000000000..0ab857d755ee --- /dev/null +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipDownShelfHeightChangeTest.kt @@ -0,0 +1,95 @@ +/* + * 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.wm.shell.flicker.pip + +import android.view.Surface +import androidx.test.filters.RequiresDevice +import com.android.server.wm.flicker.FlickerParametersRunnerFactory +import com.android.server.wm.flicker.FlickerTestParameter +import com.android.server.wm.flicker.FlickerTestParameterFactory +import com.android.server.wm.flicker.annotation.Group3 +import com.android.server.wm.flicker.dsl.FlickerBuilder +import com.android.server.wm.flicker.traces.RegionSubject +import org.junit.FixMethodOrder +import org.junit.runner.RunWith +import org.junit.runners.MethodSorters +import org.junit.runners.Parameterized + +/** + * Test Pip movement with Launcher shelf height change (decrease). + * + * To run this test: `atest WMShellFlickerTests:MovePipDownShelfHeightChangeTest` + * + * Actions: + * Launch [pipApp] in pip mode + * Launch [testApp] + * Press home + * Check if pip window moves down (visually) + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited [PipTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup + */ +@RequiresDevice +@RunWith(Parameterized::class) +@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@Group3 +class MovePipDownShelfHeightChangeTest( + testSpec: FlickerTestParameter +) : MovePipShelfHeightTransition(testSpec) { + /** + * Defines the transition used to run the test + */ + override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit + get() = buildTransition(eachRun = false) { + teardown { + eachRun { + testApp.launchViaIntent(wmHelper) + } + test { + testApp.exit(wmHelper) + } + } + transitions { + taplInstrumentation.pressHome() + } + } + + override fun assertRegionMovement(previous: RegionSubject, current: RegionSubject) { + current.isHigherOrEqual(previous.region) + } + + companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ + @Parameterized.Parameters(name = "{0}") + @JvmStatic + fun getParams(): List<FlickerTestParameter> { + return FlickerTestParameterFactory.getInstance().getConfigNonRotationTests( + supportedRotations = listOf(Surface.ROTATION_0), repetitions = 5) + } + } +} diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipShelfHeightTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipShelfHeightTransition.kt new file mode 100644 index 000000000000..ed04fc947435 --- /dev/null +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipShelfHeightTransition.kt @@ -0,0 +1,118 @@ +/* + * 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.wm.shell.flicker.pip + +import android.platform.test.annotations.Presubmit +import com.android.launcher3.tapl.LauncherInstrumentation +import com.android.server.wm.flicker.FlickerTestParameter +import com.android.server.wm.flicker.traces.RegionSubject +import com.android.server.wm.traces.parser.toLayerName +import com.android.server.wm.traces.parser.toWindowName +import com.android.wm.shell.flicker.helpers.FixedAppHelper +import org.junit.Test + +/** + * Base class for pip tests with Launcher shelf height change + */ +abstract class MovePipShelfHeightTransition( + testSpec: FlickerTestParameter +) : PipTransition(testSpec) { + protected val taplInstrumentation = LauncherInstrumentation() + protected val testApp = FixedAppHelper(instrumentation) + + /** + * Checks if the window movement direction is valid + */ + protected abstract fun assertRegionMovement(previous: RegionSubject, current: RegionSubject) + + /** + * Checks [pipApp] window remains visible throughout the animation + */ + @Presubmit + @Test + open fun pipWindowIsAlwaysVisible() { + testSpec.assertWm { + isAppWindowVisible(pipApp.component) + } + } + + /** + * Checks [pipApp] layer remains visible throughout the animation + */ + @Presubmit + @Test + open fun pipLayerIsAlwaysVisible() { + testSpec.assertLayers { + isVisible(pipApp.component) + } + } + + /** + * Checks that the pip app window remains inside the display bounds throughout the whole + * animation + */ + @Presubmit + @Test + open fun pipWindowRemainInsideVisibleBounds() { + testSpec.assertWm { + coversAtMost(displayBounds, pipApp.component) + } + } + + /** + * Checks that the pip app layer remains inside the display bounds throughout the whole + * animation + */ + @Presubmit + @Test + open fun pipLayerRemainInsideVisibleBounds() { + testSpec.assertLayers { + coversAtMost(displayBounds, pipApp.component) + } + } + + /** + * Checks that the visible region of [pipApp] always moves in the correct direction + * during the animation. + */ + @Presubmit + @Test + open fun pipWindowMoves() { + val windowName = pipApp.component.toWindowName() + testSpec.assertWm { + val pipWindowList = this.windowStates { it.name.contains(windowName) && it.isVisible } + pipWindowList.zipWithNext { previous, current -> + assertRegionMovement(previous.frame, current.frame) + } + } + } + + /** + * Checks that the visible region of [pipApp] always moves up during the animation + */ + @Presubmit + @Test + open fun pipLayerMoves() { + val layerName = pipApp.component.toLayerName() + testSpec.assertLayers { + val pipLayerList = this.layers { it.name.contains(layerName) && it.isVisible } + pipLayerList.zipWithNext { previous, current -> + assertRegionMovement(previous.visibleRegion, current.visibleRegion) + } + } + } +}
\ No newline at end of file diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipShelfHeightTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpShelfHeightChangeTest.kt index 914bc8b4d1c9..e507edfda48c 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipShelfHeightTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/MovePipUpShelfHeightChangeTest.kt @@ -16,36 +16,49 @@ package com.android.wm.shell.flicker.pip -import android.platform.test.annotations.Presubmit import android.view.Surface import androidx.test.filters.RequiresDevice -import com.android.launcher3.tapl.LauncherInstrumentation import com.android.server.wm.flicker.FlickerParametersRunnerFactory import com.android.server.wm.flicker.FlickerTestParameter import com.android.server.wm.flicker.FlickerTestParameterFactory import com.android.server.wm.flicker.annotation.Group3 import com.android.server.wm.flicker.dsl.FlickerBuilder -import com.android.wm.shell.flicker.helpers.FixedAppHelper -import com.google.common.truth.Truth +import com.android.server.wm.flicker.traces.RegionSubject import org.junit.FixMethodOrder -import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** - * Test Pip movement with Launcher shelf height change. - * To run this test: `atest WMShellFlickerTests:PipShelfHeightTest` + * Test Pip movement with Launcher shelf height change (increase). + * + * To run this test: `atest WMShellFlickerTests:MovePipUpShelfHeightChangeTest` + * + * Actions: + * Launch [pipApp] in pip mode + * Press home + * Launch [testApp] + * Check if pip window moves up (visually) + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited [PipTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup */ @RequiresDevice @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) @Group3 -class PipShelfHeightTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) { - private val taplInstrumentation = LauncherInstrumentation() - private val testApp = FixedAppHelper(instrumentation) - +class MovePipUpShelfHeightChangeTest( + testSpec: FlickerTestParameter +) : MovePipShelfHeightTransition(testSpec) { + /** + * Defines the transition used to run the test + */ override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit get() = buildTransition(eachRun = false) { teardown { @@ -61,33 +74,17 @@ class PipShelfHeightTest(testSpec: FlickerTestParameter) : PipTransition(testSpe } } - @Presubmit - @Test - fun pipAlwaysVisible() = testSpec.assertWm { this.isAppWindowVisible(pipApp.component) } - - @Presubmit - @Test - fun pipLayerInsideDisplay() { - testSpec.assertLayersStart { - visibleRegion(pipApp.component).coversAtMost(displayBounds) - } - } - - @Presubmit - @Test - fun pipWindowMovesUp() = testSpec.assertWmEnd { - val initialState = this.trace?.first()?.wmState - ?: error("Trace should not be empty") - val startPos = initialState.pinnedWindows.first().frame - val currPos = this.wmState.pinnedWindows.first().frame - val subject = Truth.assertWithMessage("Pip should have moved up") - subject.that(currPos.top).isGreaterThan(startPos.top) - subject.that(currPos.bottom).isGreaterThan(startPos.bottom) - subject.that(currPos.left).isEqualTo(startPos.left) - subject.that(currPos.right).isEqualTo(startPos.right) + override fun assertRegionMovement(previous: RegionSubject, current: RegionSubject) { + current.isLowerOrEqual(previous.region) } companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ @Parameterized.Parameters(name = "{0}") @JvmStatic fun getParams(): List<FlickerTestParameter> { diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt index 45cb152e5b0d..b1054600d702 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipRotationTest.kt @@ -32,8 +32,6 @@ import com.android.server.wm.flicker.helpers.setRotation import com.android.server.wm.flicker.navBarLayerRotatesAndScales import com.android.server.wm.flicker.startRotation import com.android.server.wm.flicker.statusBarLayerRotatesScales -import com.android.server.wm.traces.common.Region -import com.android.server.wm.traces.parser.minus import com.android.wm.shell.flicker.helpers.FixedAppHelper import org.junit.FixMethodOrder import org.junit.Test @@ -43,7 +41,22 @@ import org.junit.runners.Parameterized /** * Test Pip Stack in bounds after rotations. + * * To run this test: `atest WMShellFlickerTests:PipRotationTest` + * + * Actions: + * Launch a [pipApp] in pip mode + * Launch another app [fixedApp] (appears below pip) + * Rotate the screen from [testSpec.config.startRotation] to [testSpec.config.endRotation] + * (usually, 0->90 and 90->0) + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited from [PipTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup */ @RequiresDevice @RunWith(Parameterized::class) @@ -52,8 +65,8 @@ import org.junit.runners.Parameterized @Group3 class PipRotationTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) { private val fixedApp = FixedAppHelper(instrumentation) - private val startingBounds = WindowUtils.getDisplayBounds(testSpec.config.startRotation) - private val endingBounds = WindowUtils.getDisplayBounds(testSpec.config.endRotation) + private val screenBoundsStart = WindowUtils.getDisplayBounds(testSpec.config.startRotation) + private val screenBoundsEnd = WindowUtils.getDisplayBounds(testSpec.config.endRotation) override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit get() = buildTransition(eachRun = false) { configuration -> @@ -68,55 +81,108 @@ class PipRotationTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) transitions { setRotation(configuration.endRotation) } - teardown { - eachRun { - setRotation(Surface.ROTATION_0) - } - } } + /** + * Checks that all parts of the screen are covered at the start and end of the transition + */ @Presubmit @Test - override fun entireScreenCovered() = testSpec.entireScreenCovered(testSpec.config.startRotation, - testSpec.config.endRotation, allStates = false) + override fun entireScreenCovered() = testSpec.entireScreenCovered() + /** + * Checks the position of the navigation bar at the start and end of the transition + */ @FlakyTest @Test override fun navBarLayerRotatesAndScales() = testSpec.navBarLayerRotatesAndScales(testSpec.config.startRotation, testSpec.config.endRotation) + /** + * Checks the position of the status bar at the start and end of the transition + */ @Presubmit @Test override fun statusBarLayerRotatesScales() = testSpec.statusBarLayerRotatesScales(testSpec.config.startRotation, testSpec.config.endRotation) + /** + * Checks that [fixedApp] layer is within [screenBoundsStart] at the start of the transition + */ @Presubmit @Test fun appLayerRotates_StartingBounds() { testSpec.assertLayersStart { - val pipRegion = visibleRegion(pipApp.component).region - val expectedWithoutPip = Region(startingBounds.bounds.left, startingBounds.bounds.top, - startingBounds.bounds.right, startingBounds.bounds.bottom).minus(pipRegion) - visibleRegion(fixedApp.component).coversExactly(expectedWithoutPip) - visibleRegion(pipApp.component).coversAtMost(startingBounds) + visibleRegion(fixedApp.component).coversExactly(screenBoundsStart) } } + /** + * Checks that [fixedApp] layer is within [screenBoundsEnd] at the end of the transition + */ @Presubmit @Test fun appLayerRotates_EndingBounds() { testSpec.assertLayersEnd { - val pipRegion = visibleRegion(pipApp.component).region - val expectedWithoutPip = Region(endingBounds.bounds.left, endingBounds.bounds.top, - endingBounds.bounds.right, endingBounds.bounds.bottom).minus(pipRegion) - visibleRegion(fixedApp.component).coversExactly(expectedWithoutPip) - visibleRegion(pipApp.component).coversAtMost(endingBounds) + visibleRegion(fixedApp.component).coversExactly(screenBoundsEnd) + } + } + + /** + * Checks that [pipApp] layer is within [screenBoundsStart] at the start of the transition + */ + @Presubmit + @Test + fun pipLayerRotates_StartingBounds() { + testSpec.assertLayersStart { + visibleRegion(pipApp.component).coversAtMost(screenBoundsStart) + } + } + + /** + * Checks that [pipApp] layer is within [screenBoundsEnd] at the end of the transition + */ + @Presubmit + @Test + fun pipLayerRotates_EndingBounds() { + testSpec.assertLayersEnd { + visibleRegion(pipApp.component).coversAtMost(screenBoundsEnd) + } + } + + /** + * Ensure that the [pipApp] window does not obscure the [fixedApp] at the start of the + * transition + */ + @Presubmit + @Test + fun pipIsAboveFixedAppWindow_Start() { + testSpec.assertWmStart { + isAboveWindow(pipApp.component, fixedApp.component) + } + } + + /** + * Ensure that the [pipApp] window does not obscure the [fixedApp] at the end of the + * transition + */ + @Presubmit + @Test + fun pipIsAboveFixedAppWindow_End() { + testSpec.assertWmEnd { + isAboveWindow(pipApp.component, fixedApp.component) } } companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ @Parameterized.Parameters(name = "{0}") @JvmStatic fun getParams(): Collection<FlickerTestParameter> { diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipToAppTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipToAppTest.kt deleted file mode 100644 index 5abcf39f3fbd..000000000000 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipToAppTest.kt +++ /dev/null @@ -1,113 +0,0 @@ -/* - * 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. - */ - -package com.android.wm.shell.flicker.pip - -import android.view.Surface -import androidx.test.filters.FlakyTest -import androidx.test.filters.RequiresDevice -import com.android.server.wm.flicker.FlickerParametersRunnerFactory -import com.android.server.wm.flicker.FlickerTestParameter -import com.android.server.wm.flicker.FlickerTestParameterFactory -import com.android.server.wm.flicker.LAUNCHER_COMPONENT -import com.android.server.wm.flicker.annotation.Group3 -import com.android.server.wm.flicker.dsl.FlickerBuilder -import com.android.server.wm.flicker.helpers.setRotation -import com.android.server.wm.flicker.startRotation -import org.junit.FixMethodOrder -import org.junit.Test -import org.junit.runner.RunWith -import org.junit.runners.MethodSorters -import org.junit.runners.Parameterized - -/** - * Test Pip launch. - * To run this test: `atest WMShellFlickerTests:PipToAppTest` - */ -@RequiresDevice -@RunWith(Parameterized::class) -@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -@Group3 -class PipToAppTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) { - override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit - get() = buildTransition(eachRun = true) { configuration -> - setup { - eachRun { - this.setRotation(configuration.startRotation) - } - } - teardown { - eachRun { - this.setRotation(Surface.ROTATION_0) - } - } - transitions { - pipApp.expandPipWindowToApp(wmHelper) - } - } - - @FlakyTest - @Test - fun appReplacesPipWindow() { - testSpec.assertWm { - this.invoke("hasPipWindow") { it.isPinned(pipApp.component) } - .isAppWindowOnTop(pipApp.component) - .then() - .invoke("hasNotPipWindow") { it.isNotPinned(pipApp.component) } - .isAppWindowOnTop(pipApp.component) - } - } - - @FlakyTest - @Test - fun appReplacesPipLayer() { - testSpec.assertLayers { - this.isVisible(pipApp.component) - .isVisible(LAUNCHER_COMPONENT) - .then() - .isVisible(pipApp.component) - .isInvisible(LAUNCHER_COMPONENT) - } - } - - @FlakyTest - @Test - fun testAppCoversFullScreen() { - testSpec.assertLayersStart { - visibleRegion(pipApp.component).coversExactly(displayBounds) - } - } - - @FlakyTest(bugId = 151179149) - @Test - fun focusChanges() { - testSpec.assertEventLog { - this.focusChanges("NexusLauncherActivity", - pipApp.launcherName, "NexusLauncherActivity") - } - } - - companion object { - @Parameterized.Parameters(name = "{0}") - @JvmStatic - fun getParams(): List<FlickerTestParameter> { - return FlickerTestParameterFactory.getInstance() - .getConfigNonRotationTests(supportedRotations = listOf(Surface.ROTATION_0), - repetitions = 5) - } - } -} diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipTransition.kt index ca80d1837ea8..ce89fb6af67d 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipTransition.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipTransition.kt @@ -187,6 +187,5 @@ abstract class PipTransition(protected val testSpec: FlickerTestParameter) { @Presubmit @Test - open fun entireScreenCovered() = - testSpec.entireScreenCovered(testSpec.config.startRotation, Surface.ROTATION_0) + open fun entireScreenCovered() = testSpec.entireScreenCovered() }
\ No newline at end of file diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTest.kt index e7b61970cbeb..02a3eb1e070a 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/SetRequestedOrientationWhilePinnedTest.kt @@ -144,9 +144,7 @@ class SetRequestedOrientationWhilePinnedTest( @FlakyTest @Test - override fun entireScreenCovered() { - super.entireScreenCovered() - } + override fun entireScreenCovered() = super.entireScreenCovered() companion object { @Parameterized.Parameters(name = "{0}") diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java index a53d2e8b1268..d357e778fe35 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java @@ -46,6 +46,7 @@ import android.view.SurfaceControl; import android.view.SurfaceSession; import android.window.IRemoteTransition; import android.window.IRemoteTransitionFinishedCallback; +import android.window.RemoteTransition; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerTransaction; @@ -130,8 +131,8 @@ public class SplitTransitionTests extends ShellTestCase { TestRemoteTransition testRemote = new TestRemoteTransition(); IBinder transition = mSplitScreenTransitions.startEnterTransition( - TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), testRemote, - mStageCoordinator); + TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), + new RemoteTransition(testRemote), mStageCoordinator); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); boolean accepted = mStageCoordinator.startAnimation(transition, info, @@ -304,7 +305,7 @@ public class SplitTransitionTests extends ShellTestCase { TransitionInfo enterInfo = createEnterPairInfo(); IBinder enterTransit = mSplitScreenTransitions.startEnterTransition( TRANSIT_SPLIT_SCREEN_PAIR_OPEN, new WindowContainerTransaction(), - new TestRemoteTransition(), mStageCoordinator); + new RemoteTransition(new TestRemoteTransition()), mStageCoordinator); mMainStage.onTaskAppeared(mMainChild, createMockSurface()); mSideStage.onTaskAppeared(mSideChild, createMockSurface()); mStageCoordinator.startAnimation(enterTransit, enterInfo, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java index 54eacee8a9c3..b0f0d71c2638 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/ShellTransitionTests.java @@ -63,6 +63,7 @@ import android.view.SurfaceControl; import android.view.WindowManager; import android.window.IRemoteTransition; import android.window.IRemoteTransitionFinishedCallback; +import android.window.RemoteTransition; import android.window.TransitionFilter; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; @@ -238,7 +239,8 @@ public class ShellTransitionTests { }; IBinder transitToken = new Binder(); transitions.requestStartTransition(transitToken, - new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, testRemote)); + new TransitionRequestInfo(TRANSIT_OPEN, null /* trigger */, + new RemoteTransition(testRemote))); verify(mOrganizer, times(1)).startTransition(eq(TRANSIT_OPEN), eq(transitToken), any()); TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN) .addChange(TRANSIT_OPEN).addChange(TRANSIT_CLOSE).build(); @@ -383,7 +385,7 @@ public class ShellTransitionTests { new TransitionFilter.Requirement[]{new TransitionFilter.Requirement()}; filter.mRequirements[0].mModes = new int[]{TRANSIT_OPEN, TRANSIT_TO_FRONT}; - transitions.registerRemote(filter, testRemote); + transitions.registerRemote(filter, new RemoteTransition(testRemote)); mMainExecutor.flushAll(); IBinder transitToken = new Binder(); @@ -426,11 +428,12 @@ public class ShellTransitionTests { final int transitType = TRANSIT_FIRST_CUSTOM + 1; - OneShotRemoteHandler oneShot = new OneShotRemoteHandler(mMainExecutor, testRemote); + OneShotRemoteHandler oneShot = new OneShotRemoteHandler(mMainExecutor, + new RemoteTransition(testRemote)); // Verify that it responds to the remote but not other things. IBinder transitToken = new Binder(); assertNotNull(oneShot.handleRequest(transitToken, - new TransitionRequestInfo(transitType, null, testRemote))); + new TransitionRequestInfo(transitType, null, new RemoteTransition(testRemote)))); assertNull(oneShot.handleRequest(transitToken, new TransitionRequestInfo(transitType, null, null))); @@ -731,24 +734,12 @@ public class ShellTransitionTests { IWindowManager mockWM = mock(IWindowManager.class); final IDisplayWindowListener[] displayListener = new IDisplayWindowListener[1]; try { - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) { - displayListener[0] = invocation.getArgument(0); - return null; - } - }).when(mockWM).registerDisplayWindowListener(any()); + doReturn(new int[] {DEFAULT_DISPLAY}).when(mockWM).registerDisplayWindowListener(any()); } catch (RemoteException e) { // No remote stuff happening, so this can't be hit } DisplayController out = new DisplayController(mContext, mockWM, mMainExecutor); out.initialize(); - try { - displayListener[0].onDisplayAdded(DEFAULT_DISPLAY); - mMainExecutor.flushAll(); - } catch (RemoteException e) { - // Again, no remote stuff - } return out; } diff --git a/media/java/android/media/projection/MediaProjection.java b/media/java/android/media/projection/MediaProjection.java index 72cddc91f436..5259c4f07639 100644 --- a/media/java/android/media/projection/MediaProjection.java +++ b/media/java/android/media/projection/MediaProjection.java @@ -25,6 +25,7 @@ import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; import android.hardware.display.VirtualDisplayConfig; import android.os.Handler; +import android.os.IBinder; import android.os.RemoteException; import android.util.ArrayMap; import android.util.Log; @@ -100,19 +101,22 @@ public final class MediaProjection { public VirtualDisplay createVirtualDisplay(@NonNull String name, int width, int height, int dpi, boolean isSecure, @Nullable Surface surface, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) { - DisplayManager dm = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE); int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR | DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION; if (isSecure) { flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_SECURE; } + Context windowContext = mContext.createWindowContext(mContext.getDisplayNoVerify(), + TYPE_APPLICATION, null /* options */); final VirtualDisplayConfig.Builder builder = buildMirroredVirtualDisplay(name, width, - height, dpi); + height, dpi, windowContext.getWindowContextToken()); builder.setFlags(flags); if (surface != null) { builder.setSurface(surface); } - return dm.createVirtualDisplay(this, builder.build(), callback, handler); + VirtualDisplay virtualDisplay = createVirtualDisplay(builder.build(), callback, handler, + windowContext); + return virtualDisplay; } /** @@ -141,13 +145,17 @@ public final class MediaProjection { public VirtualDisplay createVirtualDisplay(@NonNull String name, int width, int height, int dpi, int flags, @Nullable Surface surface, @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) { + Context windowContext = mContext.createWindowContext(mContext.getDisplayNoVerify(), + TYPE_APPLICATION, null /* options */); final VirtualDisplayConfig.Builder builder = buildMirroredVirtualDisplay(name, width, - height, dpi); + height, dpi, windowContext.getWindowContextToken()); builder.setFlags(flags); if (surface != null) { builder.setSurface(surface); } - return createVirtualDisplay(builder.build(), callback, handler); + VirtualDisplay virtualDisplay = createVirtualDisplay(builder.build(), callback, handler, + windowContext); + return virtualDisplay; } /** @@ -161,12 +169,10 @@ public final class MediaProjection { * @return a config representing a VirtualDisplay */ private VirtualDisplayConfig.Builder buildMirroredVirtualDisplay(@NonNull String name, - int width, int height, int dpi) { - Context windowContext = mContext.createWindowContext(mContext.getDisplayNoVerify(), - TYPE_APPLICATION, null /* options */); + int width, int height, int dpi, IBinder windowContextToken) { final VirtualDisplayConfig.Builder builder = new VirtualDisplayConfig.Builder(name, width, height, dpi); - builder.setWindowTokenClientToMirror(windowContext.getWindowContextToken()); + builder.setWindowTokenClientToMirror(windowContextToken); return builder; } @@ -176,20 +182,22 @@ public final class MediaProjection { * * @param virtualDisplayConfig The arguments for the virtual display configuration. See * {@link VirtualDisplayConfig} for using it. - * @param callback Callback to call when the virtual display's state - * changes, or null if none. - * @param handler The {@link android.os.Handler} on which the callback should be - * invoked, or null if the callback should be invoked on the calling - * thread's main {@link android.os.Looper}. + * @param callback Callback to call when the virtual display's state changes, or null if none. + * @param handler The {@link android.os.Handler} on which the callback should be invoked, or + * null if the callback should be invoked on the calling thread's main + * {@link android.os.Looper}. + * @param windowContext the WindowContext associated with the caller. * * @see android.hardware.display.VirtualDisplay * @hide */ @Nullable public VirtualDisplay createVirtualDisplay(@NonNull VirtualDisplayConfig virtualDisplayConfig, - @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler) { + @Nullable VirtualDisplay.Callback callback, @Nullable Handler handler, + Context windowContext) { DisplayManager dm = mContext.getSystemService(DisplayManager.class); - return dm.createVirtualDisplay(this, virtualDisplayConfig, callback, handler); + return dm.createVirtualDisplay(this, virtualDisplayConfig, callback, handler, + windowContext); } /** diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/mdnsFilter/MDNSFilterPlugin.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/mdnsFilter/MDNSFilterPlugin.java index 5f107d662b75..34e7e3d1cd6b 100644 --- a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/mdnsFilter/MDNSFilterPlugin.java +++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/mdnsFilter/MDNSFilterPlugin.java @@ -84,8 +84,7 @@ public class MDNSFilterPlugin implements PrintServicePlugin { */ public MDNSFilterPlugin(@NonNull Context context, @NonNull String name, @NonNull CharSequence packageName, @NonNull List<String> mDNSNames) { - mName = context.getResources().getIdentifier(name, null, - "com.android.printservice.recommendation"); + mName = context.getResources().getIdentifier(name, null, context.getPackageName()); mPackageName = packageName; mMDNSFilteredDiscovery = new MDNSFilteredDiscovery(context, PRINTER_SERVICE_TYPES, new VendorNameFilter(new HashSet<>(mDNSNames))); diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml index 2dba96a981f7..7b4c9b6790ef 100644 --- a/packages/SettingsLib/res/values-in/arrays.xml +++ b/packages/SettingsLib/res/values-in/arrays.xml @@ -23,7 +23,7 @@ <string-array name="wifi_status"> <item msgid="1596683495752107015"></item> <item msgid="3288373008277313483">"Memindai..."</item> - <item msgid="6050951078202663628">"Menyambung…"</item> + <item msgid="6050951078202663628">"Menghubungkan…"</item> <item msgid="8356618438494652335">"Mengautentikasi…"</item> <item msgid="2837871868181677206">"Mendapatkan alamat IP…"</item> <item msgid="4613015005934755724">"Terhubung"</item> @@ -37,7 +37,7 @@ <string-array name="wifi_status_with_ssid"> <item msgid="5969842512724979061"></item> <item msgid="1818677602615822316">"Memindai..."</item> - <item msgid="8339720953594087771">"Menyambung ke <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> + <item msgid="8339720953594087771">"Menghubungkan ke <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> <item msgid="3028983857109369308">"Mengautentikasi dengan <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> <item msgid="4287401332778341890">"Mendapatkan alamat IP dari <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> <item msgid="1043944043827424501">"Terhubung ke <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</item> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index c1403082e37b..8b20b87be5bd 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -26,21 +26,21 @@ <string name="wifi_disconnected" msgid="7054450256284661757">"Terputus"</string> <string name="wifi_disabled_generic" msgid="2651916945380294607">"Nonaktif"</string> <string name="wifi_disabled_network_failure" msgid="2660396183242399585">"Kegagalan Konfigurasi IP"</string> - <string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Tidak tersambung karena jaringan berkualitas rendah"</string> + <string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Tidak terhubung karena jaringan berkualitas rendah"</string> <string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"Kegagalan Sambungan Wi-Fi"</string> <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Masalah autentikasi"</string> - <string name="wifi_cant_connect" msgid="5718417542623056783">"Tidak dapat tersambung"</string> - <string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"Tidak dapat tersambung ke \'<xliff:g id="AP_NAME">%1$s</xliff:g>\'"</string> + <string name="wifi_cant_connect" msgid="5718417542623056783">"Tidak dapat terhubung"</string> + <string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"Tidak dapat terhubung ke \'<xliff:g id="AP_NAME">%1$s</xliff:g>\'"</string> <string name="wifi_check_password_try_again" msgid="8817789642851605628">"Periksa sandi dan coba lagi"</string> <string name="wifi_not_in_range" msgid="1541760821805777772">"Tidak dalam jangkauan"</string> - <string name="wifi_no_internet_no_reconnect" msgid="821591791066497347">"Tidak akan tersambung otomatis"</string> + <string name="wifi_no_internet_no_reconnect" msgid="821591791066497347">"Tidak akan terhubung otomatis"</string> <string name="wifi_no_internet" msgid="1774198889176926299">"Tidak ada akses internet"</string> <string name="saved_network" msgid="7143698034077223645">"Disimpan oleh <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="connected_to_metered_access_point" msgid="9179693207918156341">"Terhubung ke jaringan berbayar"</string> - <string name="connected_via_network_scorer" msgid="7665725527352893558">"Tersambung otomatis melalui %1$s"</string> - <string name="connected_via_network_scorer_default" msgid="7973529709744526285">"Otomatis tersambung melalui penyedia rating jaringan"</string> + <string name="connected_via_network_scorer" msgid="7665725527352893558">"Terhubung otomatis melalui %1$s"</string> + <string name="connected_via_network_scorer_default" msgid="7973529709744526285">"Otomatis terhubung melalui penyedia rating jaringan"</string> <string name="connected_via_passpoint" msgid="7735442932429075684">"Terhubung melalui %1$s"</string> - <string name="connected_via_app" msgid="3532267661404276584">"Tersambung melalui <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="connected_via_app" msgid="3532267661404276584">"Terhubung melalui <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="available_via_passpoint" msgid="1716000261192603682">"Tersedia melalui %1$s"</string> <string name="tap_to_sign_up" msgid="5356397741063740395">"Ketuk untuk mendaftar"</string> <string name="wifi_connected_no_internet" msgid="5087420713443350646">"Tidak ada internet"</string> @@ -49,10 +49,10 @@ <string name="wifi_status_no_internet" msgid="3799933875988829048">"Tidak ada internet"</string> <string name="wifi_status_sign_in_required" msgid="2236267500459526855">"Perlu login"</string> <string name="wifi_ap_unable_to_handle_new_sta" msgid="5885145407184194503">"Titik akses penuh untuk sementara"</string> - <string name="connected_via_carrier" msgid="1968057009076191514">"Tersambung melalui %1$s"</string> + <string name="connected_via_carrier" msgid="1968057009076191514">"Terhubung melalui %1$s"</string> <string name="available_via_carrier" msgid="465598683092718294">"Tersedia melalui %1$s"</string> <string name="osu_opening_provider" msgid="4318105381295178285">"Membuka <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string> - <string name="osu_connect_failed" msgid="9107873364807159193">"Tidak dapat tersambung"</string> + <string name="osu_connect_failed" msgid="9107873364807159193">"Tidak dapat terhubung"</string> <string name="osu_completing_sign_up" msgid="8412636665040390901">"Menyelesaikan pendaftaran…"</string> <string name="osu_sign_up_failed" msgid="5605453599586001793">"Tidak dapat menyelesaikan pendaftaran. Ketuk untuk mencoba lagi."</string> <string name="osu_sign_up_complete" msgid="7640183358878916847">"Pendaftaran selesai. Menyambungkan…"</string> @@ -66,7 +66,7 @@ <string name="preference_summary_default_combination" msgid="2644094566845577901">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string> <string name="bluetooth_disconnected" msgid="7739366554710388701">"Sambungan terputus"</string> <string name="bluetooth_disconnecting" msgid="7638892134401574338">"Memutus sambungan..."</string> - <string name="bluetooth_connecting" msgid="5871702668260192755">"Menyambung…"</string> + <string name="bluetooth_connecting" msgid="5871702668260192755">"Menghubungkan…"</string> <string name="bluetooth_connected" msgid="8065345572198502293">"Terhubung<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> <string name="bluetooth_pairing" msgid="4269046942588193600">"Menyandingkan..."</string> <string name="bluetooth_connected_no_headset" msgid="2224101138659967604">"Terhubung (tanpa ponsel)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> @@ -96,12 +96,12 @@ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"Audio HD"</string> <string name="bluetooth_profile_hearing_aid" msgid="58154575573984914">"Alat Bantu Dengar"</string> <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="8191273236809964030">"Terhubung ke Alat Bantu Dengar"</string> - <string name="bluetooth_a2dp_profile_summary_connected" msgid="7422607970115444153">"Tersambung ke media audio"</string> - <string name="bluetooth_headset_profile_summary_connected" msgid="2420981566026949688">"Tersambung ke audio ponsel"</string> + <string name="bluetooth_a2dp_profile_summary_connected" msgid="7422607970115444153">"Terhubung ke media audio"</string> + <string name="bluetooth_headset_profile_summary_connected" msgid="2420981566026949688">"Terhubung ke audio ponsel"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2393521801478157362">"Sambungkan ke server transfer file"</string> - <string name="bluetooth_map_profile_summary_connected" msgid="4141725591784669181">"Tersambung ke peta"</string> + <string name="bluetooth_map_profile_summary_connected" msgid="4141725591784669181">"Terhubung ke peta"</string> <string name="bluetooth_sap_profile_summary_connected" msgid="1280297388033001037">"Terhubung ke SAP"</string> - <string name="bluetooth_opp_profile_summary_not_connected" msgid="3959741824627764954">"Tidak tersambung kepada server transfer file"</string> + <string name="bluetooth_opp_profile_summary_not_connected" msgid="3959741824627764954">"Tidak terhubung kepada server transfer file"</string> <string name="bluetooth_hid_profile_summary_connected" msgid="3923653977051684833">"Terhubung ke perangkat masukan"</string> <string name="bluetooth_pan_user_profile_summary_connected" msgid="380469653827505727">"Terhubung ke perangkat untuk akses internet"</string> <string name="bluetooth_pan_nap_profile_summary_connected" msgid="3744773111299503493">"Berbagi koneksi internet lokal dengan perangkat"</string> @@ -116,7 +116,7 @@ <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Sambungkan"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"SAMBUNGKAN"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Batal"</string> - <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Penyandingan memberi akses ke kontak dan histori panggilan saat tersambung"</string> + <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Penyandingan memberi akses ke kontak dan histori panggilan saat terhubung"</string> <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"Tidak dapat menyambungkan ke <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"Tidak dapat menyambungkan ke <xliff:g id="DEVICE_NAME">%1$s</xliff:g> karena PIN atau kode sandi salah."</string> <string name="bluetooth_pairing_device_down_error_message" msgid="2554424863101358857">"Tidak dapat berkomunikasi dengan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> @@ -133,7 +133,7 @@ <string name="bluetooth_hearingaid_left_battery_level" msgid="7375621694748104876">"Kiri - baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_hearingaid_right_battery_level" msgid="1850094448499089312">"Kanan - baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="accessibility_wifi_off" msgid="1195445715254137155">"Wi-Fi tidak aktif."</string> - <string name="accessibility_no_wifi" msgid="5297119459491085771">"Wi-Fi tidak tersambung."</string> + <string name="accessibility_no_wifi" msgid="5297119459491085771">"Wi-Fi tidak terhubung."</string> <string name="accessibility_wifi_one_bar" msgid="6025652717281815212">"Wi-Fi satu baris."</string> <string name="accessibility_wifi_two_bars" msgid="687800024970972270">"Wi-Fi dua baris"</string> <string name="accessibility_wifi_three_bars" msgid="779895671061950234">"Wi-Fi tiga baris."</string> @@ -205,7 +205,7 @@ <string name="tethering_settings_not_available" msgid="266821736434699780">"Setelan Penambatan tidak tersedia untuk pengguna ini"</string> <string name="apn_settings_not_available" msgid="1147111671403342300">"Setelan Nama Titik Akses tidak tersedia untuk pengguna ini"</string> <string name="enable_adb" msgid="8072776357237289039">"Debugging USB"</string> - <string name="enable_adb_summary" msgid="3711526030096574316">"Mode debug ketika USB tersambung"</string> + <string name="enable_adb_summary" msgid="3711526030096574316">"Mode debug ketika USB terhubung"</string> <string name="clear_adb_keys" msgid="3010148733140369917">"Cabut otorisasi debug USB"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"Proses debug nirkabel"</string> <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Mode debug saat Wi-Fi terhubung"</string> @@ -217,19 +217,19 @@ <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Sambungkan perangkat dengan kode penyambungan"</string> <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Sambungkan perangkat baru menggunakan kode enam digit"</string> <string name="adb_paired_devices_title" msgid="5268997341526217362">"Perangkat disambungkan"</string> - <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"Saat ini tersambung"</string> + <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"Saat ini terhubung"</string> <string name="adb_wireless_device_details_title" msgid="7129369670526565786">"Detail perangkat"</string> <string name="adb_device_forget" msgid="193072400783068417">"Lupakan"</string> <string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"Sidik jari perangkat: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string> <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"Sambungan gagal"</string> - <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"Pastikan <xliff:g id="DEVICE_NAME">%1$s</xliff:g> tersambung ke jaringan yang tepat"</string> + <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"Pastikan <xliff:g id="DEVICE_NAME">%1$s</xliff:g> terhubung ke jaringan yang tepat"</string> <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Sambungkan dengan perangkat"</string> <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Kode penyambungan Wi-Fi"</string> <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Penyambungan perangkat gagal"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Pastikan perangkat terhubung ke jaringan yang sama."</string> <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Sambungkan perangkat melalui Wi‑Fi dengan memindai Kode QR"</string> <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Menyambungkan perangkat…"</string> - <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Gagal menyambungkan perangkat. Kode QR salah, atau perangkat tidak tersambung ke jaringan yang sama."</string> + <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Gagal menyambungkan perangkat. Kode QR salah, atau perangkat tidak terhubung ke jaringan yang sama."</string> <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Alamat IP & Port"</string> <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Memindai kode QR"</string> <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Sambungkan perangkat melalui Wi‑Fi dengan memindai Kode QR"</string> @@ -335,7 +335,7 @@ <string name="pointer_location" msgid="7516929526199520173">"Lokasi penunjuk"</string> <string name="pointer_location_summary" msgid="957120116989798464">"Hamparan layar menampilkan data sentuhan saat ini"</string> <string name="show_touches" msgid="8437666942161289025">"Tampilkan ketukan"</string> - <string name="show_touches_summary" msgid="3692861665994502193">"Tampilkan masukan untuk ketukan"</string> + <string name="show_touches_summary" msgid="3692861665994502193">"Tampilkan efek visual untuk ketukan"</string> <string name="show_screen_updates" msgid="2078782895825535494">"Lihat pembaruan permukaan"</string> <string name="show_screen_updates_summary" msgid="2126932969682087406">"Sorot seluruh permukaan jendela saat diperbarui"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"Tampilkan update tampilan"</string> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 8d6c64284a74..44f067c3ccd6 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -89,7 +89,7 @@ <string name="bluetooth_profile_pan" msgid="1006235139308318188">"ఇంటర్నెట్ యాక్సెస్"</string> <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"కాంటాక్ట్ షేరింగ్"</string> <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"కాంటాక్ట్ షేరింగ్ కోసం ఉపయోగించండి"</string> - <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"ఇంటర్నెట్ కనెక్షన్ భాగస్వామ్యం"</string> + <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"ఇంటర్నెట్ కనెక్షన్ షేరింగ్"</string> <string name="bluetooth_profile_map" msgid="8907204701162107271">"వచన మెసేజ్లు"</string> <string name="bluetooth_profile_sap" msgid="8304170950447934386">"SIM యాక్సెస్"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="4739440941324792775">"HD ఆడియో: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 20735cba44a3..4ac19386db0a 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -1476,6 +1476,9 @@ class SettingsProtoDumpUtil { Settings.Global.USE_OPEN_WIFI_PACKAGE, GlobalSettingsProto.USE_OPEN_WIFI_PACKAGE); dumpSetting(s, p, + Settings.Global.UWB_ENABLED, + GlobalSettingsProto.UWB_ENABLED); + dumpSetting(s, p, Settings.Global.VT_IMS_ENABLED, GlobalSettingsProto.VT_IMS_ENABLED); dumpSetting(s, p, diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java index 06cadaf3bdb5..4a896e7f7042 100644 --- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java @@ -517,6 +517,7 @@ public class SettingsBackupTest { Settings.Global.UPDATABLE_DRIVER_PRODUCTION_DENYLIST, Settings.Global.UPDATABLE_DRIVER_PRODUCTION_ALLOWLIST, Settings.Global.UPDATABLE_DRIVER_SPHAL_LIBRARIES, + Settings.Global.UWB_ENABLED, Settings.Global.SHOW_ANGLE_IN_USE_DIALOG_BOX, Settings.Global.GPU_DEBUG_LAYER_APP, Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, 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 3cbe435026b5..9c1e12923b43 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt @@ -482,7 +482,7 @@ class ActivityLaunchAnimator( val endRadius = if (isExpandingFullyAbove) { // Most of the time, expanding fully above the root view means expanding in full // screen. - ScreenDecorationsUtils.getWindowCornerRadius(context.resources) + ScreenDecorationsUtils.getWindowCornerRadius(context) } else { // This usually means we are in split screen mode, so 2 out of 4 corners will have // a radius of 0. diff --git a/packages/SystemUI/res/drawable/ic_media_home_devices.xml b/packages/SystemUI/res/drawable/ic_media_home_devices.xml new file mode 100644 index 000000000000..886c64d9bf02 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_media_home_devices.xml @@ -0,0 +1,16 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="?attr/colorControlNormal"> + <path + android:fillColor="@android:color/white" + android:pathData="M20,4H4c-1.1,0 -2,0.9 -2,2v11c0,1.1 0.9,2 2,2h4v2h3v-4H4V6h16v1h2V6c0,-1.1 -0.9,-2 -2,-2z"/> + <path + android:fillColor="@android:color/white" + android:pathData="M17.5,16.5m-2.33,0a2.33,2.33 0,1 1,4.66 0a2.33,2.33 0,1 1,-4.66 0"/> + <path + android:fillColor="@android:color/white" + android:pathData="M21,8h-7c-0.55,0 -1,0.45 -1,1v11c0,0.55 0.45,1 1,1h7c0.55,0 1,-0.45 1,-1L22,9c0,-0.55 -0.45,-1 -1,-1zM17.5,9c0.83,0 1.5,0.67 1.5,1.5s-0.67,1.5 -1.5,1.5 -1.5,-0.67 -1.5,-1.5 0.67,-1.5 1.5,-1.5zM17.5,20c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/rounded_corner_bottom_secondary.xml b/packages/SystemUI/res/drawable/rounded_corner_bottom_secondary.xml new file mode 100644 index 000000000000..5cc8d6ae470e --- /dev/null +++ b/packages/SystemUI/res/drawable/rounded_corner_bottom_secondary.xml @@ -0,0 +1,16 @@ +<!-- + Copyright (C) 2021 The Android Open Source Project + + 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. +--> +<!-- Overlay this resource to change rounded_corners_bottom --> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/rounded_secondary"/> diff --git a/packages/SystemUI/res/drawable/rounded_corner_top_secondary.xml b/packages/SystemUI/res/drawable/rounded_corner_top_secondary.xml new file mode 100644 index 000000000000..724e3ef40d43 --- /dev/null +++ b/packages/SystemUI/res/drawable/rounded_corner_top_secondary.xml @@ -0,0 +1,16 @@ +<!-- + Copyright (C) 2021 The Android Open Source Project + + 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. +--> +<!-- Overlay this resource to change rounded_corners_top --> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/rounded_secondary"/> diff --git a/packages/SystemUI/res/drawable/rounded_secondary.xml b/packages/SystemUI/res/drawable/rounded_secondary.xml new file mode 100644 index 000000000000..eb72fa16cb6d --- /dev/null +++ b/packages/SystemUI/res/drawable/rounded_secondary.xml @@ -0,0 +1,24 @@ +<!-- + Copyright (C) 2021 The Android Open Source Project + + 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="8dp" + android:height="8dp" + android:viewportWidth="8" + android:viewportHeight="8"> + + <path + android:fillColor="#000000" + android:pathData="M8,0H0v8C0,3.6,3.6,0,8,0z" /> + +</vector> diff --git a/packages/SystemUI/res/layout/media_view.xml b/packages/SystemUI/res/layout/media_view.xml index 075473aef9ac..566cd25e86a5 100644 --- a/packages/SystemUI/res/layout/media_view.xml +++ b/packages/SystemUI/res/layout/media_view.xml @@ -163,18 +163,6 @@ </LinearLayout> </LinearLayout> - <ImageView - android:id="@+id/media_seamless_fallback" - android:layout_width="@dimen/qs_seamless_fallback_icon_size" - android:layout_height="@dimen/qs_seamless_fallback_icon_size" - android:layout_marginTop="@dimen/qs_media_padding" - android:layout_marginBottom="@dimen/qs_media_padding" - android:layout_marginStart="@dimen/qs_center_guideline_padding" - android:layout_marginEnd="@dimen/qs_seamless_fallback_margin" - android:tint="?android:attr/textColor" - android:src="@drawable/ic_cast_connected" - android:forceHasOverlappingRendering="false" /> - <!-- Seek Bar --> <!-- As per Material Design on Biderectionality, this is forced to LTR in code --> <SeekBar diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml b/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml index cc44b5e5df38..b1e8c386fe21 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_header_date_privacy.xml @@ -49,6 +49,11 @@ /> </FrameLayout> + <!-- We want this to be centered (to align with notches). In order to do that, the following + has to hold (in portrait): + * date_container and privacy_container must have the same width and weight + * header_text_container must be gone + --> <android.widget.Space android:id="@+id/space" android:layout_width="0dp" @@ -75,7 +80,7 @@ android:layout_weight="1" android:gravity="center_vertical|end" > - <include layout="@layout/ongoing_privacy_chip" /> + <include layout="@layout/ongoing_privacy_chip" /> </FrameLayout> </LinearLayout> diff --git a/packages/SystemUI/res/layout/screen_record_dialog.xml b/packages/SystemUI/res/layout/screen_record_dialog.xml index d1cc01f0694e..c122829c01b6 100644 --- a/packages/SystemUI/res/layout/screen_record_dialog.xml +++ b/packages/SystemUI/res/layout/screen_record_dialog.xml @@ -113,6 +113,8 @@ android:layout_height="wrap_content" android:minHeight="48dp" android:layout_weight="1" + android:layout_gravity="fill_vertical" + android:gravity="center_vertical" android:text="@string/screenrecord_taps_label" android:textAppearance="?android:attr/textAppearanceMedium" android:fontFamily="@*android:string/config_headlineFontFamily" diff --git a/packages/SystemUI/res/layout/udfps_enroll_view.xml b/packages/SystemUI/res/layout/udfps_enroll_view.xml index f1ff6d669256..e41a632fa70a 100644 --- a/packages/SystemUI/res/layout/udfps_enroll_view.xml +++ b/packages/SystemUI/res/layout/udfps_enroll_view.xml @@ -20,10 +20,23 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + <!-- The layout height/width are placeholders, which will be overwritten by + FingerprintSensorPropertiesInternal. --> + <View + android:id="@+id/udfps_enroll_accessibility_view" + android:layout_gravity="center" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:contentDescription="@string/accessibility_fingerprint_label"/> + + <ImageView + android:id="@+id/udfps_enroll_animation_fp_progress_view" + android:layout_width="match_parent" + android:layout_height="match_parent"/> + <!-- Fingerprint --> <ImageView android:id="@+id/udfps_enroll_animation_fp_view" android:layout_width="match_parent" - android:layout_height="match_parent" - android:contentDescription="@string/accessibility_fingerprint_label"/> + android:layout_height="match_parent"/> </com.android.systemui.biometrics.UdfpsEnrollView> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index f1c94d5bae9b..6d2bc31d335f 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Gebruik vingerafdruk om oop te maak"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Stawing word vereis. Raak die vingerafdruksensor om te staaf."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Oproep aan die gang"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Vliegtuigmodus"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobiele data"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Gekoppel"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet sal nie outomaties koppel nie"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobiele data sal nie outomaties koppel nie"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Geen verbinding nie"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Geen ander netwerke beskikbaar nie"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Geen netwerke beskikbaar nie"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 17aa7db7132c..e9a971e57c32 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ለመክፈት የጣት አሻራ ይጠቀሙ"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ማረጋገጥ ያስፈልጋል። ለማረጋገጥ የጣት አሻራ ዳሳሹን ይንኩ።"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"በመካሄድ ላይ የስልክ ጥሪ"</string> - <string name="airplane_mode" msgid="2536350001462130668">"የአውሮፕላን ሁነታ"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"የተንቀሳቃሽ ስልክ ውሂብ"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"ተገናኝቷል"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"በይነመረብ በራስ-ሰር አይገናኝም"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"ግንኙነት የለም"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"ሌላ አውታረ መረብ የሉም"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"ምንም አውታረ መረቦች የሉም"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 1e2ba9100419..3f8b8956f761 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -1186,11 +1186,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"يمكنك استخدام بصمة الإصبع للفتح"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"المصادقة مطلوبة. المس مستشعر بصمات الإصبع للمصادقة."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"مكالمة هاتفية جارية"</string> - <string name="airplane_mode" msgid="2536350001462130668">"وضع الطيران"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"بيانات الجوّال"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"متصلة بالإنترنت"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"لن يتم الاتصال بالإنترنت تلقائيًا."</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"لن يتم تلقائيًا الاتصال ببيانات الجوّال."</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"لا يتوفّر اتصال بالإنترنت"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"لا تتوفّر شبكات أخرى."</string> <string name="all_network_unavailable" msgid="4112774339909373349">"لا تتوفّر أي شبكات."</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 39618813f9f8..d274dbe3c3a6 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"খুলিবলৈ ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ আৱশ্যক। বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰিবলৈ ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক।"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"চলি থকা ফ’ন কল"</string> - <string name="airplane_mode" msgid="2536350001462130668">"এয়াৰপ্লেন ম\'ড"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"ম’বাইল ডেটা"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"সংযোজিত হৈ আছে"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"ইণ্টাৰনেট স্বয়ংক্ৰিয়ভাৱে সংযুক্ত নহ’ব"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"সংযোগ নাই"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"অন্য কোনো নেটৱৰ্ক উপলব্ধ নহয়"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"কোনো নেটৱৰ্ক উপলব্ধ নহয়"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 930c90ca81cd..1d33d1e3eec2 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Açmaq üçün barmaq izindən istifadə edin"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Doğrulanma tələb olunur. Doğrulamaq üçün barmaq izi sensoruna toxunun."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Davam edən zəng"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Uçuş rejimi"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobil data"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Qoşulub"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"İnternet avtomatik qoşulmayacaq"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobil data avtomatik qoşulmayacaq"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Bağlantı yoxdur"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Heç bir başqa şəbəkə əlçatan deyil"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Əlçatan şəbəkə yoxdur"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 6956da74e961..50fc2afcb672 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -1014,7 +1014,7 @@ <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8341216022442383954">"Aplikacije koriste <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> <string name="ongoing_privacy_dialog_separator" msgid="1866222499727706187">", "</string> <string name="ongoing_privacy_dialog_last_separator" msgid="5615876114268009767">" i "</string> - <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"Koristi <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> + <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"Koristi: <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"Nedavno koristio/la <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> <string name="ongoing_privacy_dialog_enterprise" msgid="3003314125311966061">"(posao)"</string> <string name="ongoing_privacy_dialog_phonecall" msgid="4487370562589839298">"Telefonski poziv"</string> @@ -1168,11 +1168,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Otvorite pomoću otiska prsta"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Potrebna je potvrda identiteta. Dodirnite senzor za otisak prsta da biste potvrdili identitet."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Aktuelni telefonski poziv"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Režim rada u avionu"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobilni podaci"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Povezano"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Automatsko povezivanje na internet nije moguće"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Nije uspelo autom. povezivanje preko mob. podataka"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Veza nije uspostavljena"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nije dostupna nijedna druga mreža"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nema dostupnih mreža"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index b8027b09ab54..a7be3052a3e8 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -1174,11 +1174,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Каб адкрыць, скарыстайце адбітак пальца"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Патрабуецца аўтэнтыфікацыя. Дакраніцеся да сканера адбіткаў пальцаў."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Бягучы тэлефонны выклік"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Рэжым палёту"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мабільная перадача даных"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Падключана"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Аўтаматычнае падключэнне да інтэрнэту адсутнічае"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Мабільная перадача даных не ўключаецца аўтаматычна"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Няма падключэння"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Больш няма даступных сетак"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Няма даступных сетак"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index dd269f565892..34a8b92bcdb6 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Използвайте отпечатък за отваряне"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Изисква се удостоверяване на самоличността. За целта докоснете сензора за отпечатъци."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Текущо телефонно обаждане"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Самолетен режим"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобилни данни"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Свързано"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Няма автоматично да се установи връзка с интернет"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Връзката за мобилни данни няма да е автоматична"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Няма връзка"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Няма други налични мрежи"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Няма налични мрежи"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 9d1865065951..42136650316e 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"খুলতে ফিঙ্গারপ্রিন্ট ব্যবহার করুন"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"যাচাইকরণ করতে হবে। যাচাইকরণ করতে আঙুলের ছাপের সেন্সরে টাচ করুন।"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"ব্যবহারকারী এখন ফোনে কথা বলছেন"</string> - <string name="airplane_mode" msgid="2536350001462130668">"বিমান মোড"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"মোবাইল ডেটা"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"কানেক্ট করা আছে"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"ইন্টারনেট অটোমেটিক কানেক্ট হবে না"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"কানেকশন নেই"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"অন্য কোনও নেটওয়ার্ক উপলভ্য নেই"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"কোনও নেটওয়ার্ক উপলভ্য নেই"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 9be319bfd890..990295fa17a6 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -1168,11 +1168,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Otvorite pomoću otiska prsta"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Potrebna je autentifikacija. Dodirnite senzor za otisak prsta da autentificirate."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Telefonski poziv u toku"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Način rada u avionu"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Prijenos podataka na mobilnoj mreži"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Povezano"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Nije se moguće automatski povezati s internetom"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Prijenos podataka se neće automatski povezati"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Niste povezani s mrežom"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Druge mreže nisu dostupne"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nema dostupnih mreža"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index b5b5cd9ed9ee..9be892a0be01 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -1009,7 +1009,7 @@ <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8341216022442383954">"Algunes aplicacions estan fent servir el següent: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> <string name="ongoing_privacy_dialog_separator" msgid="1866222499727706187">", "</string> <string name="ongoing_privacy_dialog_last_separator" msgid="5615876114268009767">" i "</string> - <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"En ús per <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> + <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"<xliff:g id="APPLICATION_NAME">%1$s</xliff:g> ho està utilitzant"</string> <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"Utilitzat recentment per <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> <string name="ongoing_privacy_dialog_enterprise" msgid="3003314125311966061">"(feina)"</string> <string name="ongoing_privacy_dialog_phonecall" msgid="4487370562589839298">"Trucada"</string> @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Utilitza l\'empremta digital per obrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autenticació necessària. Toca el sensor d\'empremtes digitals per autenticar-te."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Trucada en curs"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Mode d\'avió"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Dades mòbils"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Connectat"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet no es connectarà automàticament"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Les dades mòbils no es connectaran automàticament"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Sense connexió"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"No hi ha cap altra xarxa disponible"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"No hi ha cap xarxa disponible"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 30927d388d04..4b0220161de2 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -1174,11 +1174,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"K otevření použijte otisk prstu"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Je vyžadováno ověření. Dotkněte se snímače otisků prstů."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Probíhající hovor"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Režim Letadlo"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobilní data"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Připojeno"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet se nebude automaticky připojovat"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobilní data se nebudou připojovat automaticky"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Žádné připojení"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Žádné další sítě nejsou k dispozici"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nejsou k dispozici žádné sítě"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index dc6b6d998aeb..298438d3ffdc 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -384,7 +384,7 @@ <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Manglende Wi-Fi-forbindelse"</string> <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Lysstyrke"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"AUTO"</string> - <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Byt om på farver"</string> + <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Ombyt farver"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Farvekorrigeringstilstand"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Flere indstillinger"</string> <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Brugerindstillinger"</string> @@ -678,8 +678,8 @@ <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Lås skærmindstillinger"</string> <string name="status_bar_work" msgid="5238641949837091056">"Arbejdsprofil"</string> <string name="status_bar_airplane" msgid="4848702508684541009">"Flytilstand"</string> - <string name="add_tile" msgid="6239678623873086686">"Tilføj et felt"</string> - <string name="broadcast_tile" msgid="5224010633596487481">"Broadcast-ikon"</string> + <string name="add_tile" msgid="6239678623873086686">"Tilføj felt"</string> + <string name="broadcast_tile" msgid="5224010633596487481">"Broadcast-felt"</string> <string name="zen_alarm_warning_indef" msgid="5252866591716504287">"Du vil ikke kunne høre din næste alarm <xliff:g id="WHEN">%1$s</xliff:g>, medmindre du slår funktionen fra inden da"</string> <string name="zen_alarm_warning" msgid="7844303238486849503">"Du vil ikke kunne høre din næste alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="alarm_template" msgid="2234991538018805736">"kl. <xliff:g id="WHEN">%1$s</xliff:g>"</string> @@ -911,15 +911,15 @@ </string-array> <string name="tuner_low_priority" msgid="8412666814123009820">"Vis ikoner for notifikationer med lav prioritet"</string> <string name="other" msgid="429768510980739978">"Andet"</string> - <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"fjern kortet"</string> - <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"føj kortet til slutningen"</string> - <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Flyt kortet"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Tilføj et kort"</string> + <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"fjern felt"</string> + <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"føj feltet til slutningen"</string> + <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Flyt felt"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Tilføj felt"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Flyt til <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Føj til placering <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_position" msgid="4509277359815711830">"Placering <xliff:g id="POSITION">%1$d</xliff:g>"</string> - <string name="accessibility_qs_edit_tile_added" msgid="9067146040380836334">"Kortet blev tilføjet"</string> - <string name="accessibility_qs_edit_tile_removed" msgid="1175925632436612036">"Kortet blev fjernet"</string> + <string name="accessibility_qs_edit_tile_added" msgid="9067146040380836334">"Feltet blev tilføjet"</string> + <string name="accessibility_qs_edit_tile_removed" msgid="1175925632436612036">"Feltet blev fjernet"</string> <string name="accessibility_desc_quick_settings_edit" msgid="741658939453595297">"Redigeringsværktøj til Kvikmenu."</string> <string name="accessibility_desc_notification_icon" msgid="7331265967584178674">"<xliff:g id="ID_1">%1$s</xliff:g>-notifikation: <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_settings" msgid="7098489591715844713">"Åbn Indstillinger."</string> @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Brug fingeraftryk for at åbne"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Godkendelse er påkrævet. Sæt fingeren på fingeraftrykslæseren for at godkende."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Igangværende telefonopkald"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Flytilstand"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobildata"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Forbundet"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Der oprettes ikke automatisk internetforbindelse"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Der oprettes ikke automatisk mobildataforbindelse"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Der er ingen forbindelse"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Der er ingen andre tilgængelige netværk"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Der er ingen tilgængelige netværk"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index e3be7821d7be..834936803315 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Mit Fingerabdruck öffnen"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentifizierung erforderlich. Tippe dazu einfach auf den Fingerabdrucksensor."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Aktiver Anruf"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Flugmodus"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobile Daten"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Verbunden"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Keine automatische Verbindung mit dem Internet"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Keine Verbindung"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Keine anderen Netzwerke verfügbar"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Keine Netzwerke verfügbar"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index a406d286cfe0..7226a8500bc7 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Χρήση δακτυλικού αποτυπώματος για άνοιγμα"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Απαιτείται έλεγχος ταυτότητας. Αγγίξτε τον αισθητήρα δακτυλικών αποτυπωμάτων για έλεγχο ταυτότητας."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Τηλεφωνική κλήση σε εξέλιξη"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Λειτουργία πτήσης"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Δεδομένα κινητής τηλεφωνίας"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Συνδέθηκε"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Χωρίς αυτόματη σύνδεση στο διαδίκτυο"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Χωρίς αυτόματη σύνδεση δεδομένων κινητ. τηλεφωνίας"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Χωρίς σύνδεση"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Δεν υπάρχουν άλλα διαθέσιμα δίκτυα"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Δεν υπάρχουν διαθέσιμα δίκτυα"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index a0d9accb43b7..427a7a98e6a0 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Use fingerprint to open"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentication required. Touch the fingerprint sensor to authenticate."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Ongoing phone call"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Aeroplane mode"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobile data"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Connected"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet won\'t auto‑connect"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobile data won\'t auto‑connect"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"No connection"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"No other networks available"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"No networks available"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index d6519cb9562f..c684fa407e71 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Use fingerprint to open"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentication required. Touch the fingerprint sensor to authenticate."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Ongoing phone call"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Aeroplane mode"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobile data"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Connected"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet won\'t auto‑connect"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobile data won\'t auto‑connect"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"No connection"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"No other networks available"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"No networks available"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index a0d9accb43b7..427a7a98e6a0 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Use fingerprint to open"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentication required. Touch the fingerprint sensor to authenticate."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Ongoing phone call"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Aeroplane mode"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobile data"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Connected"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet won\'t auto‑connect"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobile data won\'t auto‑connect"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"No connection"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"No other networks available"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"No networks available"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index a0d9accb43b7..427a7a98e6a0 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Use fingerprint to open"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentication required. Touch the fingerprint sensor to authenticate."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Ongoing phone call"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Aeroplane mode"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobile data"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Connected"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet won\'t auto‑connect"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobile data won\'t auto‑connect"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"No connection"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"No other networks available"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"No networks available"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 6d0d0eb01d0a..b6c78ec78fed 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Use fingerprint to open"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentication required. Touch the fingerprint sensor to authenticate."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Ongoing phone call"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Airplane mode"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobile data"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Connected"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet won\'t auto‑connect"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobile data won\'t auto‑connect"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"No connection"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"No other networks available"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"No networks available"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index ccda660ba131..0a39ddbc1f17 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Usa la huella dactilar para abrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Se requiere de una autenticación. Toca el sensor de huellas dactilares para autenticarte."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Llamada en curso"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Modo de avión"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Datos móviles"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Conexión establecida"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"No se conectará automáticamente a Internet"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"No se conectarán automáticamente los datos móviles"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Sin conexión"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"No hay otras redes disponibles"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"No hay redes disponibles"</string> diff --git a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml index 5634f790f234..4f738c50c8a3 100644 --- a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml @@ -58,8 +58,8 @@ </string-array> <string-array name="tile_states_flashlight"> <item msgid="3465257127433353857">"No disponible"</item> - <item msgid="5044688398303285224">"Desactivado"</item> - <item msgid="8527389108867454098">"Activado"</item> + <item msgid="5044688398303285224">"Desactivada"</item> + <item msgid="8527389108867454098">"Activada"</item> </string-array> <string-array name="tile_states_rotation"> <item msgid="4578491772376121579">"No disponible"</item> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 2d117017f47a..74ad8ed22f8e 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Usa la huella digital para abrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autenticación obligatoria. Toca el sensor de huellas digitales para autenticarte."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Llamada en curso"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Modo avión"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Datos móviles"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Conectado"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet no se conecta automáticamente"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Los datos móviles no se conectarán automáticamente"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Sin conexión"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"No hay otras redes disponibles"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"No hay redes disponibles"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 64922594a524..203211878802 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Kasutage avamiseks sõrmejälge"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Vajalik on autentimine. Puudutage autentimiseks sõrmejäljeandurit."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Käimasolev telefonikõne"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Lennukirežiim"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobiilne andmeside"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Ühendatud"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internetiühendust ei looda automaatselt"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobiilset andmesideühendust ei looda automaatselt"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Ühendus puudub"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Ühtegi muud võrku pole saadaval"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Ühtegi võrku pole saadaval"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 304fc2ad5812..d3b65fb9d5a3 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Erabili hatz-marka irekitzeko"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autentifikazioa behar da. Autentifikatzeko, ukitu hatz-marken sentsorea."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Telefono-dei bat abian da"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Hegaldi modua"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Datu-konexioa"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> (<xliff:g id="NETWORKMODE">%2$s</xliff:g>)"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Konektatuta"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Ez da automatikoki konektatuko Internetera"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Ez da automatikoki aktibatuko datu-konexioa"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Konexiorik gabe"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Ez dago beste sare erabilgarririk"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Ez dago sare erabilgarririk"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 231a20525102..5561491b87a9 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"از اثر انگشت برای باز کردن قفل استفاده کنید"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"اصالتسنجی لازم است. برای اصالتسنجی، حسگر اثر انگشت را لمس کنید."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"تماس تلفنی درحال انجام"</string> - <string name="airplane_mode" msgid="2536350001462130668">"حالت هواپیما"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"داده تلفن همراه"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"متصل است"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"اینترنت بهطور خودکار متصل نخواهد شد"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"داده تلفن همراه بهطور خودکار متصل نخواهد شد"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"اتصال برقرار نیست"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"شبکه دیگری وجود ندارد"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"شبکهای در دسترس نیست"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 554d2061b0b1..1bed14b90b20 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -861,7 +861,7 @@ <string name="accessibility_status_bar_headset" msgid="2699275863720926104">"Kuulokemikrofoni liitetty"</string> <string name="data_saver" msgid="3484013368530820763">"Data Saver"</string> <string name="accessibility_data_saver_on" msgid="5394743820189757731">"Data Saver on käytössä."</string> - <string name="accessibility_data_saver_off" msgid="58339669022107171">"Data Saver on pois käytöstä."</string> + <string name="accessibility_data_saver_off" msgid="58339669022107171">"Data Saver on pois päältä."</string> <string name="switch_bar_on" msgid="1770868129120096114">"Päällä"</string> <string name="switch_bar_off" msgid="5669805115416379556">"Pois päältä"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Ei käytettävissä"</string> @@ -976,9 +976,9 @@ <string name="mobile_data" msgid="4564407557775397216">"Mobiilitiedonsiirto"</string> <string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string> - <string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi on pois käytöstä"</string> + <string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi on pois päältä"</string> <string name="bt_is_off" msgid="7436344904889461591">"Bluetooth ei ole käytössä"</string> - <string name="dnd_is_off" msgid="3185706903793094463">"Älä häiritse ‑tila on pois käytöstä"</string> + <string name="dnd_is_off" msgid="3185706903793094463">"Älä häiritse ‑tila on pois päältä"</string> <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Automaattinen sääntö otti käyttöön Älä häiritse ‑tilan (<xliff:g id="ID_1">%s</xliff:g>)."</string> <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"Sovellus otti käyttöön Älä häiritse ‑tilan (<xliff:g id="ID_1">%s</xliff:g>)."</string> <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"Automaattinen sääntö tai sovellus otti käyttöön Älä häiritse ‑tilan."</string> @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Avaa sormenjäljellä"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Todennus vaaditaan. Todenna koskettamalla sormenjälkitunnistinta."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Puhelu käynnissä"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Lentokonetila"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobiilidata"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Yhdistetty"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internetyhteyttä ei muodosteta automaattisesti"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobiilidata ei yhdisty automaattisesti"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Ei yhteyttä"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Ei muita verkkoja käytettävissä"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Ei verkkoja käytettävissä"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 90fc0f77c76e..c612917f53c9 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -1009,7 +1009,7 @@ <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8341216022442383954">"Des applications utilisent votre <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> <string name="ongoing_privacy_dialog_separator" msgid="1866222499727706187">", "</string> <string name="ongoing_privacy_dialog_last_separator" msgid="5615876114268009767">" et "</string> - <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"En cours d\'utilisation par <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> + <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"En cours d\'utilisation par : <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"Récemment utilisé par <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> <string name="ongoing_privacy_dialog_enterprise" msgid="3003314125311966061">"(travail)"</string> <string name="ongoing_privacy_dialog_phonecall" msgid="4487370562589839298">"Appel téléphonique"</string> @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Servez-vous de votre empreinte digitale pour ouvrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentification requise. Touchez le capteur d\'empreintes digitales pour vous authentifier."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Appel téléphonique en cours…"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Mode Avion"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Données cellulaires"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Connexion active"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Connexion automatique à Internet impossible"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Aucune connexion"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Aucun autre réseau n\'est accessible"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Aucun réseau n\'est accessible"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 9930fde15885..e7d0beb513ba 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Utilisez votre empreinte pour ouvrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Authentification requise. Appuyez sur le lecteur d\'empreintes digitales pour vous authentifier."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Appel téléphonique en cours"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Mode Avion"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Données mobiles"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Connecté"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Pas de connexion automatique à Internet"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Pas de connexion automatique des données mobiles"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Aucune connexion"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Aucun autre réseau disponible"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Aucun réseau disponible"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 766281a1c4f8..ec3e5e043f5a 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -1009,7 +1009,7 @@ <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8341216022442383954">"Hai aplicacións que están utilizando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> <string name="ongoing_privacy_dialog_separator" msgid="1866222499727706187">", "</string> <string name="ongoing_privacy_dialog_last_separator" msgid="5615876114268009767">" e "</string> - <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"Opción en uso por <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> + <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"En uso por: <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"Opción usada recentemente por <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> <string name="ongoing_privacy_dialog_enterprise" msgid="3003314125311966061">"(traballo)"</string> <string name="ongoing_privacy_dialog_phonecall" msgid="4487370562589839298">"Chamada de teléfono"</string> @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Usa a impresión dixital para abrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Requírese autenticación. Para autenticarte, toca o sensor de impresión dixital."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Chamada telefónica en curso"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Modo avión"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Datos móbiles"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Conectada"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet non se conectará automaticamente"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Sen conexión"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Non hai outras redes dispoñibles"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Non hai redes dispoñibles"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index cb140821ff0f..a6545e46d63d 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ખોલવા માટે ફિંગરપ્રિન્ટનો ઉપયોગ કરો"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"પ્રમાણીકરણ આવશ્યક છે. પ્રમાણિત કરવા માટે ફિંગરપ્રિન્ટ સેન્સરને ટચ કરો."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"ફોન કૉલ ચાલુ છે"</string> - <string name="airplane_mode" msgid="2536350001462130668">"એરપ્લેન મોડ"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"મોબાઇલ ડેટા"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"કનેક્ટ કરેલું"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"ઇન્ટરનેટ ઑટોમૅટિક રીતે કનેક્ટ થશે નહીં"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"કોઈ કનેક્શન નથી"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"બીજાં કોઈ નેટવર્ક ઉપલબ્ધ નથી"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"કોઈ નેટવર્ક ઉપલબ્ધ નથી"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index d5283b3bcdec..525482fbbc57 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"खोलने के लिए, फ़िंगरप्रिंट का इस्तेमाल करें"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"पुष्टि करना ज़रूरी है. पुष्टि करने के लिए, फ़िंगरप्रिंट सेंसर को छुएं."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"फ़ोन कॉल चल रहा है"</string> - <string name="airplane_mode" msgid="2536350001462130668">"हवाई जहाज़ मोड"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"मोबाइल डेटा"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"कनेक्ट हो गया"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"इंटरनेट अपने-आप कनेक्ट नहीं होगा"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"मोबाइल डेटा अपने-आप कनेक्ट नहीं होगा"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"इंटरनेट कनेक्शन नहीं है"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"कोई दूसरा नेटवर्क उपलब्ध नहीं है"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"कोई नेटवर्क उपलब्ध नहीं है"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 28a528fa15e3..9d7ac2f8b2b6 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -1168,11 +1168,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Otvorite pomoću otiska prsta"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Potrebna je autentifikacija. Dodirnite senzor otiska prsta da biste se autentificirali."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Telefonski poziv u tijeku"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Način rada u zrakoplovu"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobilni podaci"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Povezano"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Neće biti automatskog povezivanja s internetom"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobilni podaci neće se automatski povezati"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Niste povezani"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nije dostupna nijedna druga mreža"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nema dostupnih mreža"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index ee536664ecef..145298811f5c 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -354,7 +354,7 @@ <string name="quick_settings_ime_label" msgid="3351174938144332051">"Beviteli módszer"</string> <string name="quick_settings_location_label" msgid="2621868789013389163">"Tartózkodási hely"</string> <string name="quick_settings_location_off_label" msgid="7923929131443915919">"Hely kikapcsolva"</string> - <string name="quick_settings_camera_label" msgid="5612076679385269339">"Kameraelérés"</string> + <string name="quick_settings_camera_label" msgid="5612076679385269339">"Hozzáférés a kamerához"</string> <string name="quick_settings_mic_label" msgid="8392773746295266375">"Mikrofonelérés"</string> <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Rendelkezésre áll"</string> <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Letiltva"</string> @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Ujjlenyomat használata a megnyitáshoz"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Hitelesítés szükséges. Érintse meg az ujjlenyomat-érzékelőt a hitelesítéshez."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Folyamatban lévő telefonhívás"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Repülős üzemmód"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobiladat"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="NETWORKMODE">%2$s</xliff:g>/<xliff:g id="STATE">%1$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Csatlakozva"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Az internetre történő csatlakozás nem automatikus"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Nincs automatikus mobiladat-kapcsolat"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Nincs kapcsolat"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nincs több rendelkezésre álló hálózat"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nincs rendelkezésre álló hálózat"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 57781f918ead..5a9d00b83fa6 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Բացելու համար օգտագործեք մատնահետքը"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Պահանջվում է նույնականացում։ Դրա համար մատը հպեք մատնահետքի սկաներին։"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Ընթացիկ հեռախոսազանգ"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Ավիառեժիմ"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Բջջային ինտերնետ"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Միացած է"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Չհաջողվեց ավտոմատ միանալ համացանցին"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Բջջային ինտերնետն ավտոմատ չի միանա"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Կապ չկա"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Այլ հասանելի ցանցեր չկան"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Հասանելի ցանցեր չկան"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index b4155db737b5..7e2bad0d44aa 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -191,7 +191,7 @@ <string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ikon wajah"</string> <string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Tombol perbesar/perkecil kompatibilitas."</string> <string name="accessibility_compatibility_zoom_example" msgid="2617218726091234073">"Perbesar dari layar kecil ke besar."</string> - <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth tersambung."</string> + <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth terhubung."</string> <string name="accessibility_bluetooth_disconnected" msgid="7195823280221275929">"Bluetooth terputus."</string> <string name="accessibility_no_battery" msgid="3789287732041910804">"Tidak ada baterai."</string> <string name="accessibility_battery_one_bar" msgid="8868347318237585329">"Baterai satu batang."</string> @@ -216,8 +216,8 @@ <string name="accessibility_signal_full" msgid="5920148525598637311">"Sinyal penuh."</string> <string name="accessibility_desc_on" msgid="2899626845061427845">"Aktif."</string> <string name="accessibility_desc_off" msgid="8055389500285421408">"Nonaktif."</string> - <string name="accessibility_desc_connected" msgid="3082590384032624233">"Tersambung."</string> - <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Menyambung."</string> + <string name="accessibility_desc_connected" msgid="3082590384032624233">"Terhubung."</string> + <string name="accessibility_desc_connecting" msgid="8011433412112903614">"Menghubungkan."</string> <string name="data_connection_hspa" msgid="6096234094857660873">"HSPA"</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string> <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string> @@ -272,7 +272,7 @@ <string name="accessibility_quick_settings_bluetooth_off" msgid="3795983516942423240">"Bluetooth nonaktif."</string> <string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth aktif."</string> <string name="accessibility_quick_settings_bluetooth_connecting" msgid="7362294657419149294">"Bluetooth menyambung."</string> - <string name="accessibility_quick_settings_bluetooth_connected" msgid="5237625393869747261">"Bluetooth tersambung."</string> + <string name="accessibility_quick_settings_bluetooth_connected" msgid="5237625393869747261">"Bluetooth terhubung."</string> <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth dinonaktifkan."</string> <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth diaktifkan."</string> <string name="accessibility_quick_settings_location_off" msgid="6122523378294740598">"Pelaporan lokasi nonaktif."</string> @@ -390,9 +390,9 @@ <string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Setelan pengguna"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Selesai"</string> <string name="quick_settings_close_user_panel" msgid="5599724542275896849">"Tutup"</string> - <string name="quick_settings_connected" msgid="3873605509184830379">"Tersambung"</string> + <string name="quick_settings_connected" msgid="3873605509184830379">"Terhubung"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Terhubung, baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> - <string name="quick_settings_connecting" msgid="2381969772953268809">"Menyambung..."</string> + <string name="quick_settings_connecting" msgid="2381969772953268809">"Menghubungkan..."</string> <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Menambatkan"</string> <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Hotspot"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Mengaktifkan…"</string> @@ -563,30 +563,30 @@ <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Otoritas sertifikat diinstal di perangkat. Traffic jaringan aman Anda mungkin dipantau atau diubah."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Admin telah mengaktifkan pencatatan log jaringan, yang memantau traffic di perangkat."</string> <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Admin telah mengaktifkan pencatatan log jaringan, yang memantau traffic di profil kerja, tetapi tidak di profil pribadi."</string> - <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Anda tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string> - <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Anda tersambung ke <xliff:g id="VPN_APP_0">%1$s</xliff:g> dan <xliff:g id="VPN_APP_1">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string> - <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Profil kerja Anda tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs."</string> - <string name="monitoring_description_personal_profile_named_vpn" msgid="8179722332380953673">"Profil pribadi Anda tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs."</string> + <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Anda terhubung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string> + <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Anda terhubung ke <xliff:g id="VPN_APP_0">%1$s</xliff:g> dan <xliff:g id="VPN_APP_1">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string> + <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Profil kerja Anda terhubung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs."</string> + <string name="monitoring_description_personal_profile_named_vpn" msgid="8179722332380953673">"Profil pribadi Anda terhubung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs."</string> <string name="monitoring_description_do_header_generic" msgid="6130190408164834986">"Perangkat dikelola oleh <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string> <string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> menggunakan <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> untuk mengelola perangkat Anda."</string> <string name="monitoring_description_do_body" msgid="7700878065625769970">"Admin dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data terkait perangkat, dan informasi lokasi perangkat."</string> <string name="monitoring_description_do_learn_more_separator" msgid="1467280496376492558">" "</string> <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"Pelajari lebih lanjut"</string> - <string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"Anda tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string> + <string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"Anda terhubung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string> <string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string> <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Buka setelan VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="7107390013344435439">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="8329781950135541003">"Buka kredensial terpercaya"</string> <string name="monitoring_description_network_logging" msgid="577305979174002252">"Admin telah mengaktifkan pencatatan log jaringan, yang memantau traffic di perangkat.\n\nUntuk informasi selengkapnya, hubungi admin."</string> <string name="monitoring_description_vpn" msgid="1685428000684586870">"Anda memberikan izin kepada aplikasi untuk menyiapkan sambungan VPN.\n\nAplikasi ini ini dapat memantau aktivitas perangkat dan jaringan, termasuk email, aplikasi, dan situs web."</string> - <string name="monitoring_description_vpn_profile_owned" msgid="4964237035412372751">"Profil kerja dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdmin dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi admin.\n\nAnda juga tersambung ke VPN, yang dapat memantau aktivitas jaringan."</string> + <string name="monitoring_description_vpn_profile_owned" msgid="4964237035412372751">"Profil kerja dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdmin dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi admin.\n\nAnda juga terhubung ke VPN, yang dapat memantau aktivitas jaringan."</string> <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Perangkat ini dikelola oleh orang tuamu. Orang tuamu bisa melihat dan mengelola berbagai informasi, seperti aplikasi yang kamu gunakan, lokasimu, dan lama pemakaian perangkat."</string> <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string> - <string name="monitoring_description_app" msgid="376868879287922929">"Anda tersambung ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs."</string> - <string name="monitoring_description_app_personal" msgid="1970094872688265987">"Anda tersambung ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan pribadi, termasuk email, aplikasi, dan situs web."</string> - <string name="branded_monitoring_description_app_personal" msgid="1703511985892688885">"Anda tersambung ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan pribadi, termasuk email, aplikasi, dan situs web.."</string> - <string name="monitoring_description_app_work" msgid="3713084153786663662">"Profil kerja Anda dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Profil tersambung ke <xliff:g id="APPLICATION">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs.\n\nHubungi admin untuk mendapatkan informasi lebih lanjut."</string> - <string name="monitoring_description_app_personal_work" msgid="6175816356939166101">"Profil kerja Anda dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Profil tersambung ke <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs.\n\nAnda juga tersambung ke <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, yang dapat memantau aktivitas jaringan pribadi."</string> + <string name="monitoring_description_app" msgid="376868879287922929">"Anda terhubung ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs."</string> + <string name="monitoring_description_app_personal" msgid="1970094872688265987">"Anda terhubung ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan pribadi, termasuk email, aplikasi, dan situs web."</string> + <string name="branded_monitoring_description_app_personal" msgid="1703511985892688885">"Anda terhubung ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan pribadi, termasuk email, aplikasi, dan situs web.."</string> + <string name="monitoring_description_app_work" msgid="3713084153786663662">"Profil kerja Anda dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Profil terhubung ke <xliff:g id="APPLICATION">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs.\n\nHubungi admin untuk mendapatkan informasi lebih lanjut."</string> + <string name="monitoring_description_app_personal_work" msgid="6175816356939166101">"Profil kerja Anda dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Profil terhubung ke <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs.\n\nAnda juga terhubung ke <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, yang dapat memantau aktivitas jaringan pribadi."</string> <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Tetap terbuka kuncinya oleh TrustAgent"</string> <string name="keyguard_indication_trust_disabled" msgid="6820793704816727918">"Perangkat akan tetap terkunci hingga Anda membukanya secara manual"</string> <string name="keyguard_indication_trust_unlocked_plugged_in" msgid="2323452175329362855">"<xliff:g id="KEYGUARD_INDICATION">%1$s</xliff:g>\n<xliff:g id="POWER_INDICATION">%2$s</xliff:g>"</string> @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Gunakan sidik jari untuk membuka"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Perlu autentikasi. Sentuh sensor sidik jari untuk melakukan autentikasi."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Panggilan telepon sedang berlangsung"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Mode pesawat"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Data seluler"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Terhubung"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet tidak akan terhubung otomatis"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Data seluler tidak akan terhubung otomatis"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Tidak ada koneksi"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Jaringan lain tidak tersedia"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Jaringan tidak tersedia"</string> diff --git a/packages/SystemUI/res/values-in/strings_tv.xml b/packages/SystemUI/res/values-in/strings_tv.xml index d58cdc89832e..110eb0945975 100644 --- a/packages/SystemUI/res/values-in/strings_tv.xml +++ b/packages/SystemUI/res/values-in/strings_tv.xml @@ -21,7 +21,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="mic_active" msgid="5766614241012047024">"Mikrofon Aktif"</string> <string name="app_accessed_mic" msgid="2754428675130470196">"%1$s mengakses mikrofon"</string> - <string name="notification_vpn_connected" msgid="3891023882833274730">"VPN tersambung"</string> + <string name="notification_vpn_connected" msgid="3891023882833274730">"VPN terhubung"</string> <string name="notification_vpn_disconnected" msgid="7150747626448044843">"VPN terputus"</string> <string name="notification_disclosure_vpn_text" msgid="3873532735584866236">"Melalui <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> <string name="tv_notification_panel_title" msgid="5311050946506276154">"Notifikasi"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index a9199da2c000..b55e10e296b0 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Opna með fingrafari"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Auðkenningar krafist. Auðkenndu með því að snerta fingrafaralesarann."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Símtal í gangi"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Flugstilling"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Farsímagögn"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Tengt"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internetið tengist ekki sjálfkrafa"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Farsímagögn tengjast ekki sjálfkrafa"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Engin tenging"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Engin önnur net í boði"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Ekkert net í boði"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 9e66f823f7bd..f16a117c6a4f 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Usa l\'impronta per aprire"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autenticazione obbligatoria. Eseguila toccando il sensore di impronte digitali."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Telefonata in corso"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Modalità aereo"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Dati mobili"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Connessione attiva"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet non si connetterà automaticamente"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Nessuna connessione dati mobili automatica"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Nessuna connessione"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nessun\'altra rete disponibile"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nessuna rete disponibile"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 1212b1a6d286..ea19de7ebe47 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -1174,11 +1174,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"שימוש בטביעת אצבע כדי לפתוח"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"נדרש אימות. יש לגעת בחיישן טביעות האצבע כדי לבצע אימות."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"מתקיימת שיחה"</string> - <string name="airplane_mode" msgid="2536350001462130668">"מצב טיסה"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"חבילת גלישה"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"מחובר"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"לא ניתן להתחבר לאינטרנט באופן אוטומטי"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"החיבור לנתונים סלולריים לא מתבצע באופן אוטומטי"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"אין חיבור"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"אין רשתות זמינות אחרות"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"אין רשתות זמינות"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 4cf379724653..bef2330a49f0 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"指紋を使って開いてください"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"認証が必要です。指紋認証センサーをタッチして認証してください。"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"通話中"</string> - <string name="airplane_mode" msgid="2536350001462130668">"機内モード"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"モバイルデータ"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"接続済み"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"インターネットに自動的に接続されません"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"モバイルデータには自動接続しません"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"接続なし"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"利用できるネットワークはありません"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"ネットワークを利用できません"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 4e950201495b..c2507d488ad5 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"გასახსნელად გამოიყენეთ თითის ანაბეჭდი"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"საჭიროა ავტორიზაცია. ავტორიზაციისთვის შეეხეთ თითის ანაბეჭდის სენსორს."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"მიმდინარე სატელეფონო ზარი"</string> - <string name="airplane_mode" msgid="2536350001462130668">"თვითმფრინავის რეჟიმი"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"მობილური ინტერნეტი"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"დაკავშირებული"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"ინტერნეტს ავტომატურად არ დაუკავშირდება"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"მობილურ ინტერნეტს ავტომატურად არ დაუკავშირდება"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"კავშირი არ არის"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"სხვა ქსელები მიუწვდომელია"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"ქსელები მიუწვდომელია"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 48760c587c15..6879d3288b2c 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Ашу үшін саусақ ізін пайдаланыңыз."</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Аутентификациядан өту қажет. Ол үшін саусақ ізін оқу сканерін түртіңіз."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Телефон қоңырауы бар"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Ұшақ режимі"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобильдік интернет"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Жалғанды"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Интернет автоматты түрде қосылмайды."</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Мобильдік интернет автоматты түрде қосылмайды."</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Байланыс жоқ"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Басқа қолжетімді желі жоқ"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Қолжетімді желілер жоқ"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 6bed3d73e4a0..676150a8093f 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ប្រើស្នាមម្រាមដៃ ដើម្បីបើក"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"តម្រូវឱ្យមានការផ្ទៀងផ្ទាត់។ សូមចុចឧបករណ៍ចាប់ស្នាមម្រាមដៃ ដើម្បីផ្ទៀងផ្ទាត់។"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"ការហៅទូរសព្ទដែលកំពុងដំណើរការ"</string> - <string name="airplane_mode" msgid="2536350001462130668">"ពេលជិះយន្តហោះ"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"ទិន្នន័យទូរសព្ទចល័ត"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"បានភ្ជាប់"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"អ៊ីនធឺណិតនឹងមិនភ្ជាប់ដោយស្វ័យប្រវត្តិទេ"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"ទិន្នន័យទូរសព្ទចល័តនឹងមិនភ្ជាប់ដោយស្វ័យប្រវត្តិទេ"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"មិនមានការតភ្ជាប់ទេ"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"មិនមានបណ្ដាញផ្សេងទៀតដែលអាចប្រើបានទេ"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"មិនមានបណ្ដាញដែលអាចប្រើបានទេ"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index c0f74d5d92ef..385eee252047 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ತೆರೆಯುವುದಕ್ಕಾಗಿ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಬಳಸಿ"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ದೃಢೀಕರಣದ ಅವಶ್ಯಕತೆಯಿದೆ. ದೃಢೀಕರಿಸಲು ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಫೋನ್ ಕರೆ"</string> - <string name="airplane_mode" msgid="2536350001462130668">"ಏರ್ಪ್ಲೇನ್ ಮೋಡ್"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"ಮೊಬೈಲ್ ಡೇಟಾ"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"ಕನೆಕ್ಟ್ ಆಗಿದೆ"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"ಇಂಟರ್ನೆಟ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕನೆಕ್ಟ್ ಆಗುವುದಿಲ್ಲ"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"ಯಾವುದೇ ಕನೆಕ್ಷನ್ ಇಲ್ಲ"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"ಇತರ ಯಾವುದೇ ನೆಟ್ವರ್ಕ್ಗಳು ಲಭ್ಯವಿಲ್ಲ"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"ಯಾವುದೇ ನೆಟ್ವರ್ಕ್ಗಳು ಲಭ್ಯವಿಲ್ಲ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index d23d2a942173..3292cbbd88de 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"지문으로 열기"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"인증이 필요합니다. 지문 센서를 터치하여 인증하세요."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"진행 중인 전화 통화"</string> - <string name="airplane_mode" msgid="2536350001462130668">"비행기 모드"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"모바일 데이터"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"연결됨"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"인터넷에 자동으로 연결되지 않음"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"모바일 데이터가 자동으로 연결되지 않음"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"연결되지 않음"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"사용 가능한 다른 네트워크가 없음"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"사용 가능한 네트워크가 없음"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 46e9499a0f1f..3aca45a3c14f 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Манжаңыздын изи менен ачыңыз"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Аныктыкты текшерүү талап кылынат. Аныктыгын текшерүү үчүн манжа изинин сенсоруна тийип коюңуз."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Учурдагы телефон чалуу"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Учак режими"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобилдик трафик"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Туташты"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Интернет автоматтык түрдө туташпайт"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Мобилдик трафик автоматтык түрдө туташтырылбайт"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Байланыш жок"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Башка тармактар жеткиликсиз"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Тармактар жеткиликтүү эмес"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 7833ccaf7466..c80c00bf1e8f 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ໃຊ້ລາຍນິ້ວມືເພື່ອເປີດ"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ຕ້ອງພິສູດຢືນຢັນ. ແຕະໃສ່ເຊັນເຊີລາຍນິ້ວມືເພື່ອພິສູດຢືນຢັນ."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"ສາຍໂທອອກ"</string> - <string name="airplane_mode" msgid="2536350001462130668">"ໂໝດຢູ່ໃນຍົນ"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"ອິນເຕີເນັດມືຖື"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"ເຊື່ອມຕໍ່ແລ້ວ"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"ຈະບໍ່ເຊື່ອມຕໍ່ອິນເຕີເນັດອັດຕະໂນມັດ"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"ຈະບໍ່ເຊື່ອມຕໍ່ອິນເຕີເນັດມືຖືອັດຕະໂນມັດ"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"ບໍ່ມີການເຊື່ອມຕໍ່"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"ບໍ່ມີເຄືອຂ່າຍອື່ນທີ່ສາມາດໃຊ້ໄດ້"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"ບໍ່ມີເຄືອຂ່າຍທີ່ສາມາດໃຊ້ໄດ້"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 347e3e8040e3..3cfa0ca0fff3 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -1174,11 +1174,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Naudokite kontrolinį kodą, kad atidarytumėte"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Reikia nustatyti tapatybę. Nustatykite tapatybę palietę kontrolinio kodo jutiklį."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Vykstantis telefono skambutis"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Lėktuvo režimas"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobiliojo ryšio duomenys"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Prisijungta"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Prie interneto nebus jungiamasi automatiškai"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Naud. mob. r. duomenis nebus autom. prisijungiama"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Nėra ryšio"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nėra kitų pasiekiamų tinklų"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nėra pasiekiamų tinklų"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 8b31382b2e0c..a444a5ad0447 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -1168,11 +1168,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Atvēršanai izmantojiet pirksta nospiedumu"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Nepieciešama autentifikācija. Pieskarieties pirksta nospieduma sensoram, lai veiktu autentificēšanu."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Notiekošs tālruņa zvans"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Lidojuma režīms"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobilie dati"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Ir izveidots savienojums"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Interneta savienojums netiks izveidots automātiski"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobilo datu savienojums netiks veidots automātiski"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Nav savienojuma"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nav pieejams neviens cits tīkls"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nav pieejams neviens tīkls"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 9315aee102e8..341fca8096a9 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Користете отпечаток за да се отвори"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Потребна е проверка. Допрете го сензорот за отпечаток за да автентицирате."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Тековен телефонски повик"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Авионски режим"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобилен интернет"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Поврзано"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Не може автоматски да се поврзе на интернет"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Мобилниот интернет не може автоматски да се поврзе"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Нема интернет-врска"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Нема други достапни мрежи"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Нема достапни мрежи"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 173a6ee0b041..f308c97aa6b4 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"തുറക്കുന്നതിന് നിങ്ങളുടെ ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കുക"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"പരിശോധിച്ചുറപ്പിക്കേണ്ടതുണ്ട്. പരിശോധിച്ചുറപ്പിക്കാൻ, വിരലടയാള സെൻസറിൽ സ്പർശിക്കുക."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"സജീവമായ ഫോൺ കോൾ"</string> - <string name="airplane_mode" msgid="2536350001462130668">"ഫ്ലൈറ്റ് മോഡ്"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"മൊബൈൽ ഡാറ്റ"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"കണക്റ്റ് ചെയ്തു"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"ഇന്റർനെറ്റ് സ്വയമേവ കണക്റ്റ് ചെയ്യില്ല"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"മൊബൈൽ ഡാറ്റ സ്വയമേവ കണക്റ്റ് ചെയ്യില്ല"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"കണക്ഷനില്ല"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"മറ്റ് നെറ്റ്വർക്കുകളൊന്നും ലഭ്യമല്ല"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"നെറ്റ്വർക്കുകളൊന്നും ലഭ്യമല്ല"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 3e2b36e894a7..dd2533478ef6 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -659,7 +659,7 @@ <string name="system_ui_tuner" msgid="1471348823289954729">"Системийн UI Тохируулагч"</string> <string name="show_battery_percentage" msgid="6235377891802910455">"Залгаатай тэжээлийн хувийг харуулах"</string> <string name="show_battery_percentage_summary" msgid="9053024758304102915">"Тэжээлийн хувийг цэнэглээгүй байх үед статусын хэсэгт харуулна уу"</string> - <string name="quick_settings" msgid="6211774484997470203">"Түргэвчилсэн Tохиргоо"</string> + <string name="quick_settings" msgid="6211774484997470203">"Шуурхай тохиргоо"</string> <string name="status_bar" msgid="4357390266055077437">"Статус самбар"</string> <string name="overview" msgid="3522318590458536816">"Тойм"</string> <string name="demo_mode" msgid="263484519766901593">"Системийн UI демо горим"</string> @@ -684,7 +684,7 @@ <string name="zen_alarm_warning" msgid="7844303238486849503">"<xliff:g id="WHEN">%1$s</xliff:g>-т та дараагийн сэрүүлгээ сонсохгүй"</string> <string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> цагт"</string> <string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>-т"</string> - <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Түргэн Тохиргоо, <xliff:g id="TITLE">%s</xliff:g>."</string> + <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Шуурхай тохиргоо, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Сүлжээний цэг"</string> <string name="accessibility_managed_profile" msgid="4703836746209377356">"Ажлын профайл"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"Зарим хүнд хөгжилтэй байж болох ч бүх хүнд тийм биш"</string> @@ -697,8 +697,8 @@ <string name="activity_not_found" msgid="8711661533828200293">"Аппыг таны төхөөрөмжид суулгаагүй байна"</string> <string name="clock_seconds" msgid="8709189470828542071">"Цагийн секундыг харуулах"</string> <string name="clock_seconds_desc" msgid="2415312788902144817">"Статус талбарт цагийн секундыг харуулах. Энэ нь тэжээлийн цэнэгт нөлөөлж болно."</string> - <string name="qs_rearrange" msgid="484816665478662911">"Түргэн тохиргоог дахин засварлах"</string> - <string name="show_brightness" msgid="6700267491672470007">"Түргэн тохиргоонд гэрэлтүүлэг харах"</string> + <string name="qs_rearrange" msgid="484816665478662911">"Шуурхай тохиргоог дахин засварлах"</string> + <string name="show_brightness" msgid="6700267491672470007">"Шуурхай тохиргоонд гэрэлтүүлэг харах"</string> <string name="experimental" msgid="3549865454812314826">"Туршилтын"</string> <string name="enable_bluetooth_title" msgid="866883307336662596">"Bluetooth-г асаах уу?"</string> <string name="enable_bluetooth_message" msgid="6740938333772779717">"Компьютерийн гараа таблетад холбохын тулд эхлээд Bluetooth-г асаана уу."</string> @@ -920,11 +920,11 @@ <string name="accessibility_qs_edit_position" msgid="4509277359815711830">"<xliff:g id="POSITION">%1$d</xliff:g> байрлал"</string> <string name="accessibility_qs_edit_tile_added" msgid="9067146040380836334">"Хавтан нэмсэн"</string> <string name="accessibility_qs_edit_tile_removed" msgid="1175925632436612036">"Хавтанг хассан"</string> - <string name="accessibility_desc_quick_settings_edit" msgid="741658939453595297">"Түргэн тохиргоо засварлагч."</string> + <string name="accessibility_desc_quick_settings_edit" msgid="741658939453595297">"Шуурхай тохиргоо засварлагч."</string> <string name="accessibility_desc_notification_icon" msgid="7331265967584178674">"<xliff:g id="ID_1">%1$s</xliff:g> мэдэгдэл: <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="accessibility_quick_settings_settings" msgid="7098489591715844713">"Тохиргоог нээнэ үү."</string> <string name="accessibility_quick_settings_expand" msgid="2609275052412521467">"Шуурхай тохиргоог нээнэ үү."</string> - <string name="accessibility_quick_settings_collapse" msgid="4674876336725041982">"Хурдан тохиргоог хаана уу."</string> + <string name="accessibility_quick_settings_collapse" msgid="4674876336725041982">"Шуурхай тохиргоог хаана уу."</string> <string name="accessibility_quick_settings_alarm_set" msgid="7237918261045099853">"Сэрүүлэг тавьсан."</string> <string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g>-р нэвтэрсэн"</string> <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"хэрэглэгчийг сонгох"</string> @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Нээхийн тулд хурууны хээг ашиглана уу"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Баталгаажуулалт шаардлагатай. Баталгаажуулахын тулд хурууны хээ мэдрэгчид хүрнэ үү."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Үргэлжилж буй утасны дуудлага"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Нислэгийн горим"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобайл дата"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Холбогдсон"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Интернэт автоматаар холбогдохгүй"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Мобайл дата автоматаар холбогдохгүй"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Холболт алга"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Өөр боломжтой сүлжээ байхгүй байна"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Боломжтой сүлжээ байхгүй байна"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index f00125357a3d..a8798fd3890c 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"उघडण्यासाठी फिंगरप्रिंट वापरा"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ऑथेंटिकेशन आवश्यक आहे. ऑथेंटिकेट करण्यासाठी फिंगरप्रिंट सेन्सरला स्पर्श करा."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"फोन कॉल सुरू आहे"</string> - <string name="airplane_mode" msgid="2536350001462130668">"विमान मोड"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"मोबाइल डेटा"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"कनेक्ट केले आहे"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"इंटरनेट ऑटो-कनेक्ट होणार नाही"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"कोणतेही कनेक्शन नाही"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"इतर कोणतेही नेटवर्क उपलब्ध नाहीत"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"कोणतेही नेटवर्क उपलब्ध नाही"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index a59b3ff6a987..1c7302816f59 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Gunakan cap jari untuk membuka"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Pengesahan diperlukan. Sentuh penderia cap jari untuk pengesahan."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Panggilan telefon yang sedang berjalan"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Mod pesawat"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Data mudah alih"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Disambungkan"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet tidak akan bersambung secara automatik"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Data mudah alih tidak akan autosambung"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Tiada sambungan"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Tiada rangkaian lain yang tersedia"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Tiada rangkaian tersedia"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index ec37d60cde84..206ccadffddd 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ဖွင့်ရန် လက်ဗွေကို သုံးပါ"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"အထောက်အထားစိစစ်ခြင်း လိုအပ်သည်။ အထောက်အထားစိစစ်ရန် လက်ဗွေ အာရုံခံကိရိယာကို ထိပါ။"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"လက်ရှိ ဖုန်းခေါ်ဆိုမှု"</string> - <string name="airplane_mode" msgid="2536350001462130668">"လေယာဉ်ပျံမုဒ်"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"မိုဘိုင်းဒေတာ"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"ချိတ်ဆက်ထားသည်"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"အင်တာနက်က အလိုအလျောက် ချိတ်ဆက်မည်မဟုတ်ပါ"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"မိုဘိုင်းဒေတာက အလိုအလျောက် ချိတ်ဆက်မည်မဟုတ်ပါ"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"ချိတ်ဆက်မှုမရှိပါ"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"အခြားကွန်ရက်များ မရှိပါ"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"ကွန်ရက်များ မရှိပါ"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 499154fdbb53..cdad0e801266 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Bruk fingeravtrykk for å åpne"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autentisering kreves. Trykk på fingeravtrykkssensoren for å autentisere."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Pågående telefonsamtale"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Flymodus"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobildata"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Tilkoblet"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internett kobles ikke til automatisk"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobildata kobler ikke til automatisk"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Ingen tilkobling"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Ingen andre nettverk er tilgjengelige"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Ingen nettverk er tilgjengelige"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 33e0e173bb3f..3ead44f00ccf 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"फिंगरप्रिन्ट प्रयोग गरी खोल्नुहोस्"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"पुष्टि गर्नु पर्ने हुन्छ। पुष्टि गर्न फिंगरप्रिन्ट सेन्सर छुनुहोस्।"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"जारी फोन कल"</string> - <string name="airplane_mode" msgid="2536350001462130668">"हवाइजहाज मोड"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"मोबाइल डेटा"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"इन्टरनेटमा कनेक्ट गरिएको छ"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"इन्टरनेट स्वतः कनेक्ट हुँदैन"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"मोबाइल डेटा स्वतः कनेक्ट हुँदैन"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"इन्टरनेट छैन"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"अन्य नेटवर्क उपलब्ध छैनन्"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"कुनै पनि नेटवर्क उपलब्ध छैन"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 8d04acad41ce..331fb6489cde 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Gebruik vingerafdruk om te openen"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Verificatie vereist. Raak de vingerafdruksensor aan om de verificatie uit te voeren."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Actief telefoongesprek"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Vliegtuigmodus"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobiele data"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Verbonden"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet maakt niet automatisch verbinding"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobiele data maakt niet automatisch verbinding"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Geen verbinding"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Geen andere netwerken beschikbaar"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Geen netwerken beschikbaar"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 3ceb13a53b09..ea08032d3613 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -248,7 +248,7 @@ <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା।"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ବିଜ୍ଞପ୍ତି ଶେଡ୍।"</string> - <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ଦ୍ରୁତ ସେଟିଂସ୍।"</string> + <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"କ୍ୱିକ୍ ସେଟିଂସ୍।"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ଲକ୍ ସ୍କ୍ରୀନ୍।"</string> <string name="accessibility_desc_settings" msgid="6728577365389151969">"ସେଟିଂସ୍"</string> <string name="accessibility_desc_recent_apps" msgid="1748675199348914194">"ସଂକ୍ଷିପ୍ତ ବିବରଣୀ"</string> @@ -659,7 +659,7 @@ <string name="system_ui_tuner" msgid="1471348823289954729">"ସିଷ୍ଟମ୍ UI ଟ୍ୟୁନର୍"</string> <string name="show_battery_percentage" msgid="6235377891802910455">"ଏମ୍ବେଡ୍ ହୋଇଥିବା ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଦେଖାନ୍ତୁ"</string> <string name="show_battery_percentage_summary" msgid="9053024758304102915">"ଚାର୍ଜ ହେଉନଥିବାବେଳେ ଷ୍ଟାଟସ୍ ବାର୍ ଆଇକନ୍ ଭିତରେ ବ୍ୟାଟେରୀ ସ୍ତର ଶତକଡ଼ା ଦେଖାନ୍ତୁ"</string> - <string name="quick_settings" msgid="6211774484997470203">"ଦ୍ରୁତ ସେଟିଂସ୍"</string> + <string name="quick_settings" msgid="6211774484997470203">"କ୍ୱିକ୍ ସେଟିଂସ୍"</string> <string name="status_bar" msgid="4357390266055077437">"ଷ୍ଟାଟସ୍ ବାର୍"</string> <string name="overview" msgid="3522318590458536816">"ଅବଲୋକନ"</string> <string name="demo_mode" msgid="263484519766901593">"ସିଷ୍ଟମ୍ UI ଡେମୋ ମୋଡ୍"</string> @@ -684,7 +684,7 @@ <string name="zen_alarm_warning" msgid="7844303238486849503">"<xliff:g id="WHEN">%1$s</xliff:g>ବେଳେ ଆପଣ ନିଜର ପରବର୍ତ୍ତୀ ଆଲାର୍ମ ଶୁଣିପାରିବେ ନାହିଁ"</string> <string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> ହେଲେ"</string> <string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> ବେଳେ"</string> - <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ଦ୍ରୁତ ସେଟିଙ୍ଗ, <xliff:g id="TITLE">%s</xliff:g>।"</string> + <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"କ୍ୱିକ୍ ସେଟିଂସ୍, <xliff:g id="TITLE">%s</xliff:g>।"</string> <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"ହଟସ୍ପଟ୍"</string> <string name="accessibility_managed_profile" msgid="4703836746209377356">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"କେତେକଙ୍କ ପାଇଁ ମଜାଦାର, କିନ୍ତୁ ସମସ୍ତଙ୍କ ପାଇଁ ନୁହେଁ"</string> @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ଖୋଲିବାକୁ ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ପ୍ରମାଣୀକରଣ ଆବଶ୍ୟକ। ପ୍ରମାଣୀକରଣ କରିବାକୁ ଟିପଚିହ୍ନ ସେନ୍ସରକୁ ସ୍ପର୍ଶ କରନ୍ତୁ।"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"ଚାଲୁଥିବା ଫୋନ୍ କଲ୍"</string> - <string name="airplane_mode" msgid="2536350001462130668">"ଏୟାରପ୍ଲେନ୍ ମୋଡ୍"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"ମୋବାଇଲ ଡାଟା"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"ସଂଯୋଗ କରାଯାଇଛି"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"ଇଣ୍ଟରନେଟ୍ ସ୍ଵତଃ-ସଂଯୋଗ ହେବ ନାହିଁ"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"ସଂଯୋଗ ନାହିଁ"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"ଅନ୍ୟ କୌଣସି ନେଟୱାର୍କ ଉପଲବ୍ଧ ନାହିଁ"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"କୌଣସି ନେଟୱାର୍କ ଉପଲବ୍ଧ ନାହିଁ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index f35efcf72c94..24dae875484c 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ਖੋਲ੍ਹਣ ਲਈ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ਪ੍ਰਮਾਣੀਕਰਨ ਲੋੜੀਂਦਾ ਹੈ। ਪ੍ਰਮਾਣਿਤ ਕਰਨ ਲਈ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪਰਸ਼ ਕਰੋ।"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"ਜਾਰੀ ਫ਼ੋਨ ਕਾਲ"</string> - <string name="airplane_mode" msgid="2536350001462130668">"ਹਵਾਈ-ਜਹਾਜ਼ ਮੋਡ"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"ਮੋਬਾਈਲ ਡਾਟਾ"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"ਕਨੈਕਟ ਹੈ"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"ਇੰਟਰਨੈੱਟ ਸਵੈ-ਕਨੈਕਟ ਨਹੀਂ ਹੋਵੇਗਾ"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"ਕੋਈ ਕਨੈਕਸ਼ਨ ਨਹੀਂ"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"ਕੋਈ ਹੋਰ ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"ਕੋਈ ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index d201d5ccff08..1e4e58657c5a 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -1174,11 +1174,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"By otworzyć, użyj odcisku palca"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Wymagane uwierzytelnienie. Dotknij czytnika liniii papilarnych, by uwierzytelnić."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Aktywne połączenie"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Tryb samolotowy"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobilna transmisja danych"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Połączono"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Nie połączy się automatycznie z internetem"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobilna transmisja danych nie połączy się automatycznie"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Brak połączenia"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Brak innych dostępnych sieci"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Brak dostępnych sieci"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 0c06ada2c996..5969a0e620fc 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Use a impressão digital para abrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autenticação obrigatória. Toque no sensor de impressão digital para autenticar."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Chamada em andamento"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Modo avião"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Dados móveis"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Conectado"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"A Internet não será conectada automaticamente"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Sem conexão automática com dados móveis"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Sem conexão"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nenhuma outra rede disponível"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nenhuma rede disponível"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 87b70495adf1..408b972f1025 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Utilize a impressão digital para abrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autenticação necessária. Toque no sensor de impressões digitais para autenticar."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Chamada telefónica em curso"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Modo de avião"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Dados móveis"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Ligado"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"A Internet não estabelece ligação automaticamente"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Não é efetuada ligação de dados móveis automática"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Sem ligação"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nenhuma outra rede disponível"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Sem redes disponíveis"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 0c06ada2c996..5969a0e620fc 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Use a impressão digital para abrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autenticação obrigatória. Toque no sensor de impressão digital para autenticar."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Chamada em andamento"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Modo avião"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Dados móveis"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Conectado"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"A Internet não será conectada automaticamente"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Sem conexão automática com dados móveis"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Sem conexão"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nenhuma outra rede disponível"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nenhuma rede disponível"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 0821a83dc379..dfb6d48cbf1a 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -1168,11 +1168,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Folosiți amprenta ca să deschideți"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autentificare obligatorie. Atingeți senzorul de amprentă pentru a vă autentifica."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Apel telefonic în desfășurare"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Modul Avion"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Date mobile"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Conectat"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Nu se conectează automat la internet"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Nu se conectează automat la date mobile"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Nicio conexiune"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nu sunt disponibile alte rețele"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nicio rețea disponibilă"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index a5295ff5dd9d..72f12ffd2c2d 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -1174,11 +1174,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Используйте отпечаток пальца для входа."</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Требуется аутентификация. Приложите палец к сканеру отпечатков."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Текущий вызов"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Режим полета"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобильный интернет"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Подключено"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Без автоподключения к интернету"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Без автоподключения к мобильному интернету"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Нет подключения к интернету"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Нет других доступных сетей"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Нет доступных сетей"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 4aab3740349c..790e51454315 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"විවෘත කිරීමට ඇඟිලි සලකුණ භාවිත කරන්න"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"සත්යාපනය අවශ්යයි. සත්යාපනය කිරීමට ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරන්න."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"ක්රියාත්මක වන දුරකථන ඇමතුම"</string> - <string name="airplane_mode" msgid="2536350001462130668">"ගුවන් යානා ප්රකාරය"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"ජංගම දත්ත"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"සම්බන්ධයි"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"අන්තර්ජාලය ස්වයංක්රියව සම්බන්ධ නොවනු ඇත"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"ජංගම දත්ත ස්වංක්රියව සම්බන්ධ නොවනු ඇත"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"සම්බන්ධතාවයක් නැත"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"ලබා ගත හැකි වෙනත් ජාල නැත"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"ජාලය නොතිබේ"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 64501dfadd11..9e94ae56a84b 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -1174,11 +1174,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Otvorte odtlačkom prsta"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Vyžaduje sa overenie. Dotknite sa senzora odtlačkov prstov."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Prebiehajúci telefonický hovor"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Režim v lietadle"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobilné dáta"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Pripojené"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet sa nepripojí automaticky"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Automatické pripojenie cez mobilné dáta nefunguje"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Bez pripojenia"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nie sú k dispozícii žiadne ďalšie siete"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nie sú k dispozícii žiadne siete"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 64ccc726c1b2..27d15e7d4726 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -1174,11 +1174,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Odprite s prstnim odtisom"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Zahtevano je preverjanje pristnosti. Za preverjanje pristnosti se dotaknite tipala prstnih odtisov."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Poteka klic"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Način za letalo"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Prenos podatkov v mobilnem omrežju"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Povezano"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Samodejna povezava z internetom ni mogoča."</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobilna podatkovna povezava ne bo samodejna."</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Ni povezave"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nobeno drugo omrežje ni na voljo"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Na voljo ni nobeno omrežje"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index fc606bb3bd81..711e9f6579ec 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Përdor gjurmën e gishtit për ta hapur"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Kërkohet vërtetimi. Prek sensorin e gjurmës së gishtit për t\'u vërtetuar."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Telefonatë në vazhdim"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Modaliteti i aeroplanit"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Të dhënat celulare"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Lidhur"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Interneti nuk do të lidhet automatikisht"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Nuk ka lidhje"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Nuk ofrohet asnjë rrjet tjetër"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Nuk ofrohet asnjë rrjet"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 1c2ba5da61be..5c51ad9ed66f 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -1014,7 +1014,7 @@ <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8341216022442383954">"Апликације користе <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> <string name="ongoing_privacy_dialog_separator" msgid="1866222499727706187">", "</string> <string name="ongoing_privacy_dialog_last_separator" msgid="5615876114268009767">" и "</string> - <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"Користи <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> + <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"Користи: <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"Недавно користио/ла <xliff:g id="APPLICATION_NAME">%1$s</xliff:g>"</string> <string name="ongoing_privacy_dialog_enterprise" msgid="3003314125311966061">"(посао)"</string> <string name="ongoing_privacy_dialog_phonecall" msgid="4487370562589839298">"Телефонски позив"</string> @@ -1168,11 +1168,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Отворите помоћу отиска прста"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Потребна је потврда идентитета. Додирните сензор за отисак прста да бисте потврдили идентитет."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Актуелни телефонски позив"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Режим рада у авиону"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобилни подаци"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Повезано"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Аутоматско повезивање на интернет није могуће"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Није успело аутом. повезивање преко моб. података"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Веза није успостављена"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Није доступна ниједна друга мрежа"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Нема доступних мрежа"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 8c828a53e119..e3ef48f9dc26 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Öppna med fingeravtryck"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autentisering krävs. Identifiera dig genom att trycka på fingeravtryckssensorn."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Pågående samtal"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Flygplansläge"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobildata"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Ansluten"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Du ansluts inte automatiskt till internet"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Du ansluts inte till mobildata automatiskt"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Ingen anslutning"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Inga andra nätverk är tillgängliga"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Det finns inga tillgängliga nätverk"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index bf17d638b33c..502c05683c60 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Tumia alama ya kidole kufungua"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Uthibitishaji unahitajika. Gusa kitambua alama ya kidole ili uthibitishe."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Simu inayoendelea"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Hali ya ndegeni"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Data ya mtandao wa simu"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Imeunganishwa"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Intaneti haitaunganishwa kiotomatiki"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Data ya mtandao wa simu haitaunganishwa kiotomatiki"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Hakuna muunganisho"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Hakuna mitandao mingine inayopatikana"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Hakuna mitandao inayopatikana"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index cf1017763d60..a5f1d680ef12 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -452,7 +452,7 @@ <string name="zen_silence_introduction" msgid="6117517737057344014">"இது அலாரங்கள், இசை, வீடியோக்கள் மற்றும் கேம்ஸ் உட்பட எல்லா ஒலிகளையும் அதிர்வுகளையும் தடுக்கும்."</string> <string name="keyguard_more_overflow_text" msgid="5819512373606638727">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="7248696377626341060">"அவசர நிலைக் குறைவான அறிவிப்புகள் கீழே உள்ளன"</string> - <string name="notification_tap_again" msgid="4477318164947497249">"திறக்க, மீண்டும் தட்டவும்"</string> + <string name="notification_tap_again" msgid="4477318164947497249">"அன்லாக் செய்ய, மீண்டும் தட்டவும்"</string> <string name="tap_again" msgid="1315420114387908655">"மீண்டும் தட்டவும்"</string> <string name="keyguard_unlock" msgid="8031975796351361601">"திறப்பதற்கு மேல் நோக்கி ஸ்வைப் செய்யவும்"</string> <string name="keyguard_unlock_press" msgid="8488350566398524740">"திறப்பதற்கு அழுத்தவும்"</string> @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"கைரேகையைப் பயன்படுத்தி திறந்திடுங்கள்"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"அங்கீகாரம் தேவை. கைரேகை சென்சாரைத் தொட்டு அங்கீகரியுங்கள்."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"செயலில் உள்ள மொபைல் அழைப்பு"</string> - <string name="airplane_mode" msgid="2536350001462130668">"விமானப் பயன்முறை"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"மொபைல் டேட்டா"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"இணைக்கப்பட்டது"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"இணையத்துடன் தானாகவே இணைக்காது"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"மொபைல் டேட்டாவுடன் தானாக இணைக்காது"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"இணைப்பு இல்லை"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"வேறு நெட்வொர்க்குகள் எதுவும் கிடைக்கவில்லை"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"நெட்வொர்க்குகள் எதுவும் கிடைக்கவில்லை"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 145de48d0553..7b66c3be2110 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -277,8 +277,8 @@ <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"బ్లూటూత్ ఆన్ చేయబడింది."</string> <string name="accessibility_quick_settings_location_off" msgid="6122523378294740598">"లొకేషన్ రిపోర్టింగ్ ఆఫ్లో ఉంది."</string> <string name="accessibility_quick_settings_location_on" msgid="6869947200325467243">"లొకేషన్ రిపోర్టింగ్ ఆన్లో ఉంది."</string> - <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"స్థాన నివేదన ఆఫ్ చేయబడింది."</string> - <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"స్థాన నివేదన ఆన్ చేయబడింది."</string> + <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"లొకేషన్ రిపోర్టింగ్ ఆఫ్ చేయబడింది."</string> + <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"లొకేషన్ రిపోర్టింగ్ ఆన్ చేయబడింది."</string> <string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g>కి అలారం సెట్ చేయబడింది."</string> <string name="accessibility_quick_settings_close" msgid="2974895537860082341">"ప్యానెల్ను మూసివేయి."</string> <string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"ఎక్కువ సమయం."</string> @@ -308,7 +308,7 @@ <string name="data_usage_disabled_dialog" msgid="7933201635215099780">"మీరు సెట్ చేసిన డేటా పరిమితిని చేరుకున్నారు. మీరు ఇప్పుడు మొబైల్ డేటాను ఉపయోగించడం లేదు.\n\nమీరు పునఃప్రారంభిస్తే, డేటా వినియోగానికి ఛార్జీలు చెల్లించాల్సి రావచ్చు."</string> <string name="data_usage_disabled_dialog_enable" msgid="2796648546086408937">"పునఃప్రారంభించు"</string> <string name="gps_notification_searching_text" msgid="231304732649348313">"GPS కోసం శోధిస్తోంది"</string> - <string name="gps_notification_found_text" msgid="3145873880174658526">"స్థానం GPS ద్వారా సెట్ చేయబడింది"</string> + <string name="gps_notification_found_text" msgid="3145873880174658526">"లొకేషన్ GPS ద్వారా సెట్ చేయబడింది"</string> <string name="accessibility_location_active" msgid="2845747916764660369">"లొకేషన్ రిక్వెస్ట్లు యాక్టివ్గా ఉన్నాయి"</string> <string name="accessibility_sensors_off_active" msgid="2619725434618911551">"సెన్సార్లు ఆఫ్ యాక్టివ్లో ఉంది"</string> <string name="accessibility_clear_all" msgid="970525598287244592">"అన్ని నోటిఫికేషన్లను క్లియర్ చేయండి."</string> @@ -659,7 +659,7 @@ <string name="system_ui_tuner" msgid="1471348823289954729">"సిస్టమ్ UI ట్యూనర్"</string> <string name="show_battery_percentage" msgid="6235377891802910455">"పొందుపరిచిన బ్యాటరీ శాతం చూపు"</string> <string name="show_battery_percentage_summary" msgid="9053024758304102915">"ఛార్జింగ్లో లేనప్పుడు స్థితి పట్టీ చిహ్నం లోపల బ్యాటరీ స్థాయి శాతం చూపుతుంది"</string> - <string name="quick_settings" msgid="6211774484997470203">"శీఘ్ర సెట్టింగ్లు"</string> + <string name="quick_settings" msgid="6211774484997470203">"క్విక్ సెట్టింగ్లు"</string> <string name="status_bar" msgid="4357390266055077437">"స్థితి పట్టీ"</string> <string name="overview" msgid="3522318590458536816">"ఓవర్వ్యూ"</string> <string name="demo_mode" msgid="263484519766901593">"సిస్టమ్ UI డెమో మోడ్"</string> @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"తెరవడానికి వేలిముద్రను ఉపయోగించండి"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ప్రామాణీకరణ అవసరం. ప్రామాణీకరించడానికి వేలిముద్ర సెన్సార్ను తాకండి."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"ఫోన్ కాల్ జరుగుతోంది"</string> - <string name="airplane_mode" msgid="2536350001462130668">"విమానం మోడ్"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"మొబైల్ డేటా"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"కనెక్ట్ చేయబడింది"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"ఇంటర్నెట్ ఆటోమెటిక్గా కనెక్ట్ అవ్వదు"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"కనెక్షన్ లేదు"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"ఇతర నెట్వర్క్లేవీ అందుబాటులో లేవు"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"నెట్వర్క్లు అందుబాటులో లేవు"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index d998a0056537..232c46aa3f6c 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ใช้ลายนิ้วมือเพื่อเปิด"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ต้องมีการตรวจสอบสิทธิ์ แตะเซ็นเซอร์ลายนิ้วมือเพื่อตรวจสอบสิทธิ์"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"กำลังโทรอยู่"</string> - <string name="airplane_mode" msgid="2536350001462130668">"โหมดบนเครื่องบิน"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"อินเทอร์เน็ตมือถือ"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"เชื่อมต่อแล้ว"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"อินเทอร์เน็ตจะไม่เชื่อมต่ออัตโนมัติ"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"อินเทอร์เน็ตมือถือจะไม่เชื่อมต่ออัตโนมัติ"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"ไม่มีการเชื่อมต่อ"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"ไม่มีเครือข่ายอื่นๆ ที่พร้อมใช้งาน"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"ไม่มีเครือข่ายที่พร้อมใช้งาน"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index c5fb7feff7fc..9ed9bbc7096e 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Gamitin ang fingerprint para buksan"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Kailangan ng pag-authenticate. Pindutin ang sensor para sa fingerprint para mag-authenticate."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Kasalukuyang may tawag sa telepono"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Airplane mode"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobile data"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Nakakonekta"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Hindi awtomatikong kokonekta ang Internet"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Hindi awtomatikong kokonekta ang mobile data"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Walang koneksyon"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Walang available na iba pang network"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Walang available na network"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 39ccec1c4d63..e79daeaf0346 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Açmak için parmak izi kullanın"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Kimlik doğrulaması gerekiyor. Kimlik doğrulaması için parmak izi sensörüne dokunun."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Devam eden telefon görüşmesi"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Uçak modu"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobil veri"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Bağlı"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"İnternete otomatik olarak bağlanmaz"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Mobil veri otomatik olarak bağlanmıyor"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Bağlantı yok"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Kullanılabilir başka ağ yok"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Kullanılabilir ağ yok"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 97cdf35c3d2a..bb4ae0012c26 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -1174,11 +1174,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Щоб відкрити, використайте відбиток пальця"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Пройдіть автентифікацію. Для цього торкніться сканера відбитків пальців."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Активний телефонний виклик"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Режим польоту"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобільний трафік"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Підключено"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Автоматичне інтернет-з’єднання вимкнено"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Мобільний Інтернет не підключатиметься автоматично"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Немає з\'єднання"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Інші мережі недоступні"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Немає доступних мереж"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 558eb0f7693f..be0755214b87 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"کھولنے کے لیے فنگر پرنٹ کا استعمال کریں"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"توثیق مطلوب ہے۔ توثیق کرنے کے لیے فنگر پرنٹ سینسر کو ٹچ کریں۔"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"جاری فون کال"</string> - <string name="airplane_mode" msgid="2536350001462130668">"ہوائی جہاز وضع"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"موبائل ڈیٹا"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="NETWORKMODE">%2$s</xliff:g> / <xliff:g id="STATE">%1$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"منسلک ہے"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"انٹرنیٹ خود کار طور پر منسلک نہیں ہوگا"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"کوئی کنکشن نہیں"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"کوئی دوسرا نیٹ ورک دستیاب نہیں ہے"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"کوئی نیٹ ورکس دستیاب نہیں ہیں"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index e5b9e5ab7bdc..dc6afec61f21 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -1162,11 +1162,11 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Ochish uchun barmoq izidan foydalaning"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Haqiqiylikni tekshirish talab etiladi. Autentifikatsiya uchun barmoq izi skaneriga tegining."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Joriy telefon chaqiruvi"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Parvoz rejimi"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobil internet"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Ulandi"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Internet avtomatik ravishda ulanmaydi"</string> + <!-- no translation found for mobile_data_off_summary (3663995422004150567) --> + <skip /> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Internetga ulanmagansiz"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Boshqa tarmoqlar mavjud emas"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Hech qanday tarmoq mavjud emas"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index cdd6cfbcc648..d22b74d38bdb 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Dùng vân tay để mở"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Bạn cần phải xác thực. Hãy chạm vào cảm biến vân tay để xác thực."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Đang gọi điện thoại"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Chế độ trên máy bay"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Dữ liệu di động"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Đã kết nối"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"Sẽ không tự động kết nối Internet"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Dữ liệu di động sẽ không tự động kết nối"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Không có kết nối mạng"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Không có mạng nào khác"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Không có mạng"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 22399b2254fa..276fac891cde 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"使用指纹即可打开"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"需要进行身份验证。请轻触指纹传感器以验证身份。"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"正在进行通话"</string> - <string name="airplane_mode" msgid="2536350001462130668">"飞行模式"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"移动数据网络"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"已连接"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"不会自动连接到互联网"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"系统将不会自动连接到移动数据网络"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"无网络连接"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"没有其他可用网络"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"没有可用网络"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index cbc752baf0c4..5f519c0946e1 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"使用指紋即可開啟"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"需要驗證。掂一下指紋感應器就可以驗證。"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"通話中"</string> - <string name="airplane_mode" msgid="2536350001462130668">"飛行模式"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"流動數據"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"已連線"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"不會自動連線至互聯網"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"不會自動連線至流動數據"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"沒有連線"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"沒有可用的其他網絡"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"沒有可用的網絡"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 5900a973038a..f5f669d06fd3 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"使用指紋即可開啟"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"需要驗證。輕觸指紋感應器即可進行驗證。"</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"通話中"</string> - <string name="airplane_mode" msgid="2536350001462130668">"飛航模式"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"行動數據"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"已連線"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"不會自動連上網際網路"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"系統將不會自動使用行動數據連線"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"沒有網路連線"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"沒有可用的其他網路"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"沒有可用的網路"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 14d30a4ecfa7..560f31d54add 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -1162,11 +1162,10 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Sebenzisa izigxivizo zeminwe ukuvula"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Ukufakazela ubuqiniso budingekile. Thinta inzwa yezigxivizo zeminwe ukuze uqinisekise."</string> <string name="ongoing_phone_call_content_description" msgid="5332334388483099947">"Ikholi yefoni eqhubekayo"</string> - <string name="airplane_mode" msgid="2536350001462130668">"Imodi yendiza"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Idatha yeselula"</string> <string name="preference_summary_default_combination" msgid="8453246369903749670">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="NETWORKMODE">%2$s</xliff:g>"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Ixhunyiwe"</string> - <string name="mobile_data_off_summary" msgid="5621158216585822679">"I-inthanethi ngeke ixhumeke ngokuzenzakalelayo"</string> + <string name="mobile_data_off_summary" msgid="3663995422004150567">"Idatha yeselula ngeke ikwazi ukuxhuma ngokuzenzekelayo"</string> <string name="mobile_data_no_connection" msgid="1713872434869947377">"Alukho uxhumano"</string> <string name="non_carrier_network_unavailable" msgid="770049357024492372">"Awekho amanye amanethiwekhi atholakalayo"</string> <string name="all_network_unavailable" msgid="4112774339909373349">"Awekho amanethiwekhi atholakalayo"</string> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index d90126799d01..2c19212581b7 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -189,7 +189,8 @@ <!-- UDFPS colors --> <color name="udfps_enroll_icon">#000000</color> <!-- 100% black --> <color name="udfps_moving_target_fill">#cc4285f4</color> <!-- 80% blue --> - <color name="udfps_enroll_progress">#ff669DF6</color> <!-- 100% blue --> + <color name="udfps_enroll_progress">#ff669DF6</color> <!-- blue 400 --> + <color name="udfps_enroll_progress_help">#ffEE675C</color> <!-- red 400 --> <!-- Logout button --> <color name="logout_button_bg_color">#ccffffff</color> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 9f2938e826e5..37cc42ee4b73 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -679,4 +679,36 @@ <!-- Flag to activate notification to contents feature --> <bool name="config_notificationToContents">false</bool> + + <!-- Respect drawable/rounded_secondary.xml intrinsic size for multiple radius corner path + customization for secondary display--> + <bool name="config_roundedCornerMultipleRadiusSecondary">false</bool> + + <!-- Whether the rounded corners are multiple radius for each display in a multi-display device. + {@see com.android.internal.R.array#config_displayUniqueIdArray} --> + <array name="config_roundedCornerMultipleRadiusArray"> + <item>@bool/config_roundedCornerMultipleRadius</item> + <item>@bool/config_roundedCornerMultipleRadiusSecondary</item> + </array> + + <!-- The rounded corner drawable for each display in a multi-display device. + {@see com.android.internal.R.array#config_displayUniqueIdArray} --> + <array name="config_roundedCornerDrawableArray"> + <item>@drawable/rounded</item> + <item>@drawable/rounded_secondary</item> + </array> + + <!-- The top rounded corner drawable for each display in a multi-display device. + {@see com.android.internal.R.array#config_displayUniqueIdArray} --> + <array name="config_roundedCornerTopDrawableArray"> + <item>@drawable/rounded_corner_top</item> + <item>@drawable/rounded_corner_top_secondary</item> + </array> + + <!-- The bottom rounded corner drawable for each display in a multi-display device. + {@see com.android.internal.R.array#config_displayUniqueIdArray} --> + <array name="config_roundedCornerBottomDrawableArray"> + <item>@drawable/rounded_corner_bottom</item> + <item>@drawable/rounded_corner_bottom_secondary</item> + </array> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 9d37acceefa9..26ee5ea7f914 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1306,8 +1306,6 @@ <dimen name="qs_media_action_margin">12dp</dimen> <dimen name="qs_seamless_height">24dp</dimen> <dimen name="qs_seamless_icon_size">12dp</dimen> - <dimen name="qs_seamless_fallback_icon_size">@dimen/qs_seamless_icon_size</dimen> - <dimen name="qs_seamless_fallback_margin">20dp</dimen> <dimen name="qs_footer_horizontal_margin">22dp</dimen> <dimen name="qs_media_disabled_seekbar_height">1dp</dimen> <dimen name="qs_media_enabled_seekbar_height">2dp</dimen> @@ -1338,6 +1336,7 @@ <dimen name="magnifier_up_down_controls_height">40dp</dimen> <!-- The extra padding to show the whole outer border --> <dimen name="magnifier_drag_handle_padding">3dp</dimen> + <dimen name="magnification_max_frame_size">300dp</dimen> <!-- Home Controls --> <dimen name="controls_header_side_margin">4dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index d785a03036b9..03ba28a3c7f5 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1008,7 +1008,7 @@ <string name="sensor_privacy_start_use_mic_camera_dialog_content">This unblocks access for all apps and services allowed to use your camera or microphone.</string> <!-- Default name for the media device shown in the output switcher when the name is not available [CHAR LIMIT=30] --> - <string name="media_seamless_remote_device">Device</string> + <string name="media_seamless_other_device">Other device</string> <!-- QuickStep: Accessibility to toggle overview [CHAR LIMIT=40] --> <string name="quick_step_accessibility_toggle_overview">Toggle Overview</string> @@ -3000,7 +3000,7 @@ <string name="mobile_data_connection_active">Connected</string> <!-- Provider Model: Summary indicating that a SIM has no mobile data connection [CHAR LIMIT=50] --> - <string name="mobile_data_off_summary">Internet won\u0027t auto\u2011connect</string> + <string name="mobile_data_off_summary">Mobile data won\u0027t auto\u2011connect</string> <!-- Provider Model: Summary indicating that a active SIM and no network available [CHAR LIMIT=50] --> <string name="mobile_data_no_connection">No connection</string> diff --git a/packages/SystemUI/res/xml/media_collapsed.xml b/packages/SystemUI/res/xml/media_collapsed.xml index d6c6a60d56b8..c3510b61e68a 100644 --- a/packages/SystemUI/res/xml/media_collapsed.xml +++ b/packages/SystemUI/res/xml/media_collapsed.xml @@ -44,23 +44,6 @@ /> <Constraint - android:id="@+id/media_seamless_fallback" - android:layout_width="@dimen/qs_seamless_fallback_icon_size" - android:layout_height="@dimen/qs_seamless_fallback_icon_size" - android:layout_marginTop="@dimen/qs_media_padding" - android:layout_marginBottom="@dimen/qs_media_padding" - android:layout_marginStart="@dimen/qs_center_guideline_padding" - android:layout_marginEnd="@dimen/qs_seamless_fallback_margin" - android:alpha="0.5" - android:visibility="gone" - app:layout_constraintHorizontal_bias="1" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toTopOf="@id/center_horizontal_guideline" - app:layout_constraintStart_toEndOf="@id/center_vertical_guideline" - app:layout_constraintEnd_toEndOf="parent" - /> - - <Constraint android:id="@+id/album_art" android:layout_width="@dimen/qs_media_album_size_small" android:layout_height="@dimen/qs_media_album_size_small" diff --git a/packages/SystemUI/res/xml/media_expanded.xml b/packages/SystemUI/res/xml/media_expanded.xml index 0e284e6ad631..6b83aae38e15 100644 --- a/packages/SystemUI/res/xml/media_expanded.xml +++ b/packages/SystemUI/res/xml/media_expanded.xml @@ -45,22 +45,6 @@ android:layout_marginBottom="4dp" /> <Constraint - android:id="@+id/media_seamless_fallback" - android:layout_width="@dimen/qs_seamless_fallback_icon_size" - android:layout_height="@dimen/qs_seamless_fallback_icon_size" - android:layout_marginTop="@dimen/qs_media_padding" - android:layout_marginBottom="16dp" - android:layout_marginStart="@dimen/qs_center_guideline_padding" - android:layout_marginEnd="@dimen/qs_seamless_fallback_margin" - android:alpha="0.5" - android:visibility="gone" - app:layout_constraintHorizontal_bias="1" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toEndOf="@id/center_vertical_guideline" - app:layout_constraintEnd_toEndOf="parent" - /> - - <Constraint android:id="@+id/album_art" android:layout_width="@dimen/qs_media_album_size" android:layout_height="@dimen/qs_media_album_size" diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/navigationbar/RegionSamplingHelper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/navigationbar/RegionSamplingHelper.java index bcfb77461307..98083742d707 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/navigationbar/RegionSamplingHelper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/navigationbar/RegionSamplingHelper.java @@ -72,6 +72,8 @@ public class RegionSamplingHelper implements View.OnAttachStateChangeListener, private boolean mWindowVisible; private boolean mWindowHasBlurs; private SurfaceControl mRegisteredStopLayer = null; + // A copy of mRegisteredStopLayer where we own the life cycle and can access from a bg thread. + private SurfaceControl mWrappedStopLayer = null; private ViewTreeObserver.OnDrawListener mUpdateOnDraw = new ViewTreeObserver.OnDrawListener() { @Override public void onDraw() { @@ -184,16 +186,21 @@ public class RegionSamplingHelper implements View.OnAttachStateChangeListener, } if (!mSamplingRequestBounds.equals(mRegisteredSamplingBounds) || mRegisteredStopLayer != stopLayerControl) { - // We only want to reregister if something actually changed + // We only want to re-register if something actually changed unregisterSamplingListener(); mSamplingListenerRegistered = true; - SurfaceControl registeredStopLayer = stopLayerControl; + SurfaceControl wrappedStopLayer = stopLayerControl == null + ? null : new SurfaceControl(stopLayerControl, "regionSampling"); mBackgroundExecutor.execute(() -> { + if (wrappedStopLayer != null && !wrappedStopLayer.isValid()) { + return; + } CompositionSamplingListener.register(mSamplingListener, DEFAULT_DISPLAY, - registeredStopLayer, mSamplingRequestBounds); + wrappedStopLayer, mSamplingRequestBounds); }); mRegisteredSamplingBounds.set(mSamplingRequestBounds); - mRegisteredStopLayer = registeredStopLayer; + mRegisteredStopLayer = stopLayerControl; + mWrappedStopLayer = wrappedStopLayer; } mFirstSamplingAfterStart = false; } else { @@ -204,10 +211,14 @@ public class RegionSamplingHelper implements View.OnAttachStateChangeListener, private void unregisterSamplingListener() { if (mSamplingListenerRegistered) { mSamplingListenerRegistered = false; + SurfaceControl wrappedStopLayer = mWrappedStopLayer; mRegisteredStopLayer = null; mRegisteredSamplingBounds.setEmpty(); mBackgroundExecutor.execute(() -> { CompositionSamplingListener.unregister(mSamplingListener); + if (wrappedStopLayer != null && wrappedStopLayer.isValid()) { + wrappedStopLayer.release(); + } }); } } @@ -262,6 +273,7 @@ public class RegionSamplingHelper implements View.OnAttachStateChangeListener, pw.println(" mWindowHasBlurs: " + mWindowHasBlurs); pw.println(" mWaitingOnDraw: " + mWaitingOnDraw); pw.println(" mRegisteredStopLayer: " + mRegisteredStopLayer); + pw.println(" mWrappedStopLayer: " + mWrappedStopLayer); pw.println(" mIsDestroyed: " + mIsDestroyed); } 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 b827356e952c..196e6f335b14 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 @@ -285,8 +285,8 @@ public class QuickStepContract { * These values are expressed in pixels because they should not respect display or font * scaling, this means that we don't have to reload them on config changes. */ - public static float getWindowCornerRadius(Resources resources) { - return ScreenDecorationsUtils.getWindowCornerRadius(resources); + public static float getWindowCornerRadius(Context context) { + return ScreenDecorationsUtils.getWindowCornerRadius(context); } /** diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java index 025d7ef48096..7aee721972d4 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationAdapterCompat.java @@ -37,6 +37,7 @@ import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; import android.window.IRemoteTransition; import android.window.IRemoteTransitionFinishedCallback; +import android.window.RemoteTransition; import android.window.TransitionInfo; import java.util.ArrayList; @@ -62,7 +63,8 @@ public class RemoteAnimationAdapterCompat { /** Helper to just build a remote transition. Use this if the legacy adapter isn't needed. */ public static RemoteTransitionCompat buildRemoteTransition(RemoteAnimationRunnerCompat runner) { - return new RemoteTransitionCompat(wrapRemoteTransition(runner)); + return new RemoteTransitionCompat( + new RemoteTransition(wrapRemoteTransition(runner))); } public RemoteTransitionCompat getRemoteTransition() { diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java index 0a1465708edb..30db13611f4a 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java @@ -71,11 +71,11 @@ public class RemoteAnimationTargetCompat { public final boolean allowEnterPip; public final int rotationChange; public final int windowType; + public final WindowConfiguration windowConfiguration; private final SurfaceControl mStartLeash; // Fields used only to unrap into RemoteAnimationTarget - private final WindowConfiguration windowConfiguration; private final Rect startBounds; public RemoteAnimationTargetCompat(RemoteAnimationTarget app) { @@ -235,8 +235,9 @@ public class RemoteAnimationTargetCompat { rotationChange = change.getEndRotation() - change.getStartRotation(); windowType = INVALID_WINDOW_TYPE; - // TODO this probably isn't right but it's unused for now /shrug - windowConfiguration = new WindowConfiguration(); + windowConfiguration = change.getTaskInfo() != null + ? change.getTaskInfo().configuration.windowConfiguration + : new WindowConfiguration(); startBounds = change.getStartAbsBounds(); } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java index aac52357d008..9ec95a3c992d 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java @@ -42,6 +42,7 @@ import android.view.SurfaceControl; import android.window.IRemoteTransition; import android.window.IRemoteTransitionFinishedCallback; import android.window.PictureInPictureSurfaceTransaction; +import android.window.RemoteTransition; import android.window.TransitionFilter; import android.window.TransitionInfo; import android.window.WindowContainerToken; @@ -63,16 +64,16 @@ import java.util.concurrent.Executor; public class RemoteTransitionCompat implements Parcelable { private static final String TAG = "RemoteTransitionCompat"; - @NonNull final IRemoteTransition mTransition; + @NonNull final RemoteTransition mTransition; @Nullable TransitionFilter mFilter = null; - RemoteTransitionCompat(IRemoteTransition transition) { + RemoteTransitionCompat(RemoteTransition transition) { mTransition = transition; } public RemoteTransitionCompat(@NonNull RemoteTransitionRunner runner, @NonNull Executor executor) { - mTransition = new IRemoteTransition.Stub() { + IRemoteTransition remote = new IRemoteTransition.Stub() { @Override public void startAnimation(IBinder transition, TransitionInfo info, SurfaceControl.Transaction t, @@ -102,12 +103,13 @@ public class RemoteTransitionCompat implements Parcelable { finishAdapter)); } }; + mTransition = new RemoteTransition(remote); } /** Constructor specifically for recents animation */ public RemoteTransitionCompat(RecentsAnimationListener recents, RecentsAnimationControllerCompat controller) { - mTransition = new IRemoteTransition.Stub() { + IRemoteTransition remote = new IRemoteTransition.Stub() { final RecentsControllerWrap mRecentsSession = new RecentsControllerWrap(); IBinder mToken = null; @@ -166,6 +168,7 @@ public class RemoteTransitionCompat implements Parcelable { } } }; + mTransition = new RemoteTransition(remote); } /** Adds a filter check that restricts this remote transition to home open transitions. */ @@ -381,7 +384,7 @@ public class RemoteTransitionCompat implements Parcelable { - // Code below generated by codegen v1.0.21. + // Code below generated by codegen v1.0.23. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -393,8 +396,21 @@ public class RemoteTransitionCompat implements Parcelable { // Settings > Editor > Code Style > Formatter Control //@formatter:off + + @DataClass.Generated.Member + /* package-private */ RemoteTransitionCompat( + @NonNull RemoteTransition transition, + @Nullable TransitionFilter filter) { + this.mTransition = transition; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mTransition); + this.mFilter = filter; + + // onConstructed(); // You can define this method to get a callback + } + @DataClass.Generated.Member - public @NonNull IRemoteTransition getTransition() { + public @NonNull RemoteTransition getTransition() { return mTransition; } @@ -412,7 +428,7 @@ public class RemoteTransitionCompat implements Parcelable { byte flg = 0; if (mFilter != null) flg |= 0x2; dest.writeByte(flg); - dest.writeStrongInterface(mTransition); + dest.writeTypedObject(mTransition, flags); if (mFilter != null) dest.writeTypedObject(mFilter, flags); } @@ -428,7 +444,7 @@ public class RemoteTransitionCompat implements Parcelable { // static FieldType unparcelFieldName(Parcel in) { ... } byte flg = in.readByte(); - IRemoteTransition transition = IRemoteTransition.Stub.asInterface(in.readStrongBinder()); + RemoteTransition transition = (RemoteTransition) in.readTypedObject(RemoteTransition.CREATOR); TransitionFilter filter = (flg & 0x2) == 0 ? null : (TransitionFilter) in.readTypedObject(TransitionFilter.CREATOR); this.mTransition = transition; @@ -460,20 +476,20 @@ public class RemoteTransitionCompat implements Parcelable { @DataClass.Generated.Member public static class Builder { - private @NonNull IRemoteTransition mTransition; + private @NonNull RemoteTransition mTransition; private @Nullable TransitionFilter mFilter; private long mBuilderFieldsSet = 0L; public Builder( - @NonNull IRemoteTransition transition) { + @NonNull RemoteTransition transition) { mTransition = transition; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mTransition); } @DataClass.Generated.Member - public @NonNull Builder setTransition(@NonNull IRemoteTransition value) { + public @NonNull Builder setTransition(@NonNull RemoteTransition value) { checkNotUsed(); mBuilderFieldsSet |= 0x1; mTransition = value; @@ -496,8 +512,9 @@ public class RemoteTransitionCompat implements Parcelable { if ((mBuilderFieldsSet & 0x2) == 0) { mFilter = null; } - RemoteTransitionCompat o = new RemoteTransitionCompat(mTransition); - o.mFilter = this.mFilter; + RemoteTransitionCompat o = new RemoteTransitionCompat( + mTransition, + mFilter); return o; } @@ -510,10 +527,10 @@ public class RemoteTransitionCompat implements Parcelable { } @DataClass.Generated( - time = 1606862689344L, - codegenVersion = "1.0.21", + time = 1629321609807L, + codegenVersion = "1.0.23", sourceFile = "frameworks/base/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java", - inputSignatures = "final @android.annotation.NonNull com.android.systemui.shared.system.IRemoteTransition mTransition\n @android.annotation.Nullable android.window.TransitionFilter mFilter\npublic void addHomeOpenCheck()\nclass RemoteTransitionCompat extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass") + inputSignatures = "private static final java.lang.String TAG\nfinal @android.annotation.NonNull android.window.RemoteTransition mTransition\n @android.annotation.Nullable android.window.TransitionFilter mFilter\npublic void addHomeOpenCheck(android.content.ComponentName)\nclass RemoteTransitionCompat extends java.lang.Object implements [android.os.Parcelable]\nprivate com.android.systemui.shared.system.RecentsAnimationControllerCompat mWrapped\nprivate android.window.IRemoteTransitionFinishedCallback mFinishCB\nprivate android.window.WindowContainerToken mPausingTask\nprivate android.window.WindowContainerToken mPipTask\nprivate android.window.TransitionInfo mInfo\nprivate android.view.SurfaceControl mOpeningLeash\nprivate android.util.ArrayMap<android.view.SurfaceControl,android.view.SurfaceControl> mLeashMap\nprivate android.window.PictureInPictureSurfaceTransaction mPipTransaction\nprivate android.os.IBinder mTransition\n void setup(com.android.systemui.shared.system.RecentsAnimationControllerCompat,android.window.TransitionInfo,android.window.IRemoteTransitionFinishedCallback,android.window.WindowContainerToken,android.window.WindowContainerToken,android.util.ArrayMap<android.view.SurfaceControl,android.view.SurfaceControl>,android.os.IBinder)\n @android.annotation.SuppressLint boolean merge(android.window.TransitionInfo,android.view.SurfaceControl.Transaction,com.android.systemui.shared.system.RecentsAnimationListener)\npublic @java.lang.Override com.android.systemui.shared.recents.model.ThumbnailData screenshotTask(int)\npublic @java.lang.Override void setInputConsumerEnabled(boolean)\npublic @java.lang.Override void setAnimationTargetsBehindSystemBars(boolean)\npublic @java.lang.Override void hideCurrentInputMethod()\npublic @java.lang.Override void setFinishTaskTransaction(int,android.window.PictureInPictureSurfaceTransaction,android.view.SurfaceControl)\npublic @java.lang.Override @android.annotation.SuppressLint void finish(boolean,boolean)\npublic @java.lang.Override void setDeferCancelUntilNextTransition(boolean,boolean)\npublic @java.lang.Override void cleanupScreenshot()\npublic @java.lang.Override void setWillFinishToHome(boolean)\npublic @java.lang.Override boolean removeTask(int)\npublic @java.lang.Override void detachNavigationBarFromApp(boolean)\npublic @java.lang.Override void animateNavigationBarToApp(long)\nclass RecentsControllerWrap extends com.android.systemui.shared.system.RecentsAnimationControllerCompat implements []\n@com.android.internal.util.DataClass") @Deprecated private void __metadata() {} diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java index b38270cb8609..85d5de0ea4f6 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowManagerWrapper.java @@ -27,10 +27,12 @@ import android.graphics.Rect; import android.os.Handler; import android.os.RemoteException; import android.util.Log; +import android.view.InsetsController; import android.view.InsetsState; import android.view.SurfaceControl; import android.view.WindowManager; import android.view.WindowManagerGlobal; +import android.view.animation.Interpolator; import com.android.systemui.shared.recents.view.AppTransitionAnimationSpecsFuture; import com.android.systemui.shared.recents.view.RecentsTransition; @@ -89,6 +91,9 @@ public class WindowManagerWrapper { public static final int ITYPE_BOTTOM_TAPPABLE_ELEMENT = InsetsState.ITYPE_BOTTOM_TAPPABLE_ELEMENT; + public static final int ANIMATION_DURATION_RESIZE = InsetsController.ANIMATION_DURATION_RESIZE; + public static final Interpolator RESIZE_INTERPOLATOR = InsetsController.RESIZE_INTERPOLATOR; + private static final WindowManagerWrapper sInstance = new WindowManagerWrapper(); public static WindowManagerWrapper getInstance() { diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt index 9b5eae8f6c26..49cd279fb4be 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt @@ -29,6 +29,7 @@ import com.android.systemui.unfold.progress.FixedTimingTransitionProgressProvide import com.android.systemui.unfold.progress.PhysicsBasedUnfoldTransitionProgressProvider import com.android.systemui.unfold.updates.DeviceFoldStateProvider import com.android.systemui.unfold.updates.hinge.EmptyHingeAngleProvider +import com.android.systemui.unfold.updates.hinge.HingeSensorAngleProvider import com.android.systemui.unfold.updates.hinge.RotationSensorHingeAngleProvider import java.lang.IllegalStateException import java.util.concurrent.Executor @@ -50,7 +51,13 @@ fun createUnfoldTransitionProgressProvider( val hingeAngleProvider = if (config.mode == ANIMATION_MODE_HINGE_ANGLE) { - RotationSensorHingeAngleProvider(sensorManager) + // TODO: after removing temporary "config.mode" we should just + // switch between fixed timing and hinge sensor based on this flag + if (config.isHingeAngleEnabled) { + HingeSensorAngleProvider(sensorManager) + } else { + RotationSensorHingeAngleProvider(sensorManager) + } } else { EmptyHingeAngleProvider() } diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/config/ResourceUnfoldTransitionConfig.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/config/ResourceUnfoldTransitionConfig.kt index fa6b5de0b1ee..e7c6998a847e 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/config/ResourceUnfoldTransitionConfig.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/config/ResourceUnfoldTransitionConfig.kt @@ -25,6 +25,9 @@ internal class ResourceUnfoldTransitionConfig( override val isEnabled: Boolean get() = readIsEnabled() && mode != ANIMATION_MODE_DISABLED + override val isHingeAngleEnabled: Boolean + get() = readIsHingeAngleEnabled() + @AnimationMode override val mode: Int get() = SystemProperties.getInt(UNFOLD_TRANSITION_MODE_PROPERTY_NAME, @@ -32,6 +35,9 @@ internal class ResourceUnfoldTransitionConfig( private fun readIsEnabled(): Boolean = context.resources .getBoolean(com.android.internal.R.bool.config_unfoldTransitionEnabled) + + private fun readIsHingeAngleEnabled(): Boolean = context.resources + .getBoolean(com.android.internal.R.bool.config_unfoldTransitionHingeAngle) } /** diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/config/UnfoldTransitionConfig.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/config/UnfoldTransitionConfig.kt index 75d9dc32339f..a5697578e05a 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/config/UnfoldTransitionConfig.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/config/UnfoldTransitionConfig.kt @@ -19,6 +19,7 @@ import android.annotation.IntDef interface UnfoldTransitionConfig { val isEnabled: Boolean + val isHingeAngleEnabled: Boolean @AnimationMode val mode: Int diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt index b111892ceb6e..10e6c2bfea3a 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/progress/PhysicsBasedUnfoldTransitionProgressProvider.kt @@ -16,6 +16,7 @@ package com.android.systemui.unfold.progress import android.os.Handler +import android.util.MathUtils.saturate import androidx.dynamicanimation.animation.DynamicAnimation import androidx.dynamicanimation.animation.FloatPropertyCompat import androidx.dynamicanimation.animation.SpringAnimation @@ -24,6 +25,7 @@ import com.android.systemui.unfold.UnfoldTransitionProgressProvider import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_CLOSED import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_FULL_OPEN +import com.android.systemui.unfold.updates.FOLD_UPDATE_START_CLOSING import com.android.systemui.unfold.updates.FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE import com.android.systemui.unfold.updates.FoldStateProvider import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate @@ -33,7 +35,6 @@ import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdatesListener * Maps fold updates to unfold transition progress using DynamicAnimation. * * TODO(b/193793338) Current limitations: - * - doesn't handle folding transition * - doesn't handle postures */ internal class PhysicsBasedUnfoldTransitionProgressProvider( @@ -75,14 +76,20 @@ internal class PhysicsBasedUnfoldTransitionProgressProvider( override fun onHingeAngleUpdate(angle: Float) { if (!isTransitionRunning || isAnimatedCancelRunning) return - springAnimation.animateToFinalPosition(angle / 180f) + val progress = saturate(angle / FINAL_HINGE_ANGLE_POSITION) + springAnimation.animateToFinalPosition(progress) } override fun onFoldUpdate(@FoldUpdate update: Int) { when (update) { FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE -> { - onStartTransition() startTransition(startValue = 0f) + + // Stop the animation if the device has already opened by the time when + // the display is available as we won't receive the full open event anymore + if (foldStateProvider.isFullyOpened) { + cancelTransition(endValue = 1f, animate = true) + } } FOLD_UPDATE_FINISH_FULL_OPEN -> { cancelTransition(endValue = 1f, animate = true) @@ -90,13 +97,16 @@ internal class PhysicsBasedUnfoldTransitionProgressProvider( FOLD_UPDATE_FINISH_CLOSED -> { cancelTransition(endValue = 0f, animate = false) } + FOLD_UPDATE_START_CLOSING -> { + startTransition(startValue = 1f) + } } } private fun cancelTransition(endValue: Float, animate: Boolean) { handler.removeCallbacks(timeoutRunnable) - if (animate) { + if (isTransitionRunning && animate) { isAnimatedCancelRunning = true springAnimation.animateToFinalPosition(endValue) } else { @@ -182,3 +192,4 @@ internal class PhysicsBasedUnfoldTransitionProgressProvider( private const val TRANSITION_TIMEOUT_MILLIS = 2000L private const val SPRING_STIFFNESS = 200.0f private const val MINIMAL_VISIBLE_CHANGE = 0.001f +private const val FINAL_HINGE_ANGLE_POSITION = 165f diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt index 949652bc9137..c37ab06abb60 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt @@ -68,20 +68,29 @@ internal class DeviceFoldStateProvider( outputListeners.remove(listener) } + override val isFullyOpened: Boolean + get() = !isFolded && lastFoldUpdate == FOLD_UPDATE_FINISH_FULL_OPEN + private fun onHingeAngle(angle: Float) { when (lastFoldUpdate) { FOLD_UPDATE_FINISH_FULL_OPEN -> { - if (FULLY_OPEN_DEGREES - angle > MOVEMENT_THRESHOLD_DEGREES) { + if (FULLY_OPEN_DEGREES - angle > START_CLOSING_THRESHOLD_DEGREES) { lastFoldUpdate = FOLD_UPDATE_START_CLOSING outputListeners.forEach { it.onFoldUpdate(FOLD_UPDATE_START_CLOSING) } } } - FOLD_UPDATE_START_OPENING, FOLD_UPDATE_START_CLOSING -> { + FOLD_UPDATE_START_OPENING -> { if (FULLY_OPEN_DEGREES - angle < FULLY_OPEN_THRESHOLD_DEGREES) { lastFoldUpdate = FOLD_UPDATE_FINISH_FULL_OPEN outputListeners.forEach { it.onFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) } } } + FOLD_UPDATE_START_CLOSING -> { + if (FULLY_OPEN_DEGREES - angle < START_CLOSING_THRESHOLD_DEGREES) { + lastFoldUpdate = FOLD_UPDATE_FINISH_FULL_OPEN + outputListeners.forEach { it.onFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN) } + } + } } outputListeners.forEach { it.onHingeAngleUpdate(angle) } @@ -120,5 +129,5 @@ internal class DeviceFoldStateProvider( } } -private const val MOVEMENT_THRESHOLD_DEGREES = 10f -private const val FULLY_OPEN_THRESHOLD_DEGREES = 10f
\ No newline at end of file +private const val START_CLOSING_THRESHOLD_DEGREES = 95f +private const val FULLY_OPEN_THRESHOLD_DEGREES = 15f
\ No newline at end of file diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/FoldStateProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/FoldStateProvider.kt index 4c6d241b1456..11984b93638e 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/FoldStateProvider.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/FoldStateProvider.kt @@ -28,6 +28,8 @@ internal interface FoldStateProvider : CallbackController<FoldUpdatesListener> { fun start() fun stop() + val isFullyOpened: Boolean + interface FoldUpdatesListener { fun onHingeAngleUpdate(@FloatRange(from = 0.0, to = 180.0) angle: Float) fun onFoldUpdate(@FoldUpdate update: Int) diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeAngleProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeAngleProvider.kt index 854991383a8c..2520d356b721 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeAngleProvider.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeAngleProvider.kt @@ -3,6 +3,12 @@ package com.android.systemui.unfold.updates.hinge import androidx.core.util.Consumer import com.android.systemui.statusbar.policy.CallbackController +/** + * Emits device hinge angle values (angle between two integral parts of the device). + * The hinge angle could be from 0 to 360 degrees inclusive. + * For foldable devices usually 0 corresponds to fully closed (folded) state and + * 180 degrees corresponds to fully open (flat) state + */ internal interface HingeAngleProvider : CallbackController<Consumer<Float>> { fun start() fun stop() diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt new file mode 100644 index 000000000000..a42ebef04de1 --- /dev/null +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt @@ -0,0 +1,42 @@ +package com.android.systemui.unfold.updates.hinge + +import android.hardware.Sensor +import android.hardware.SensorEvent +import android.hardware.SensorEventListener +import android.hardware.SensorManager +import androidx.core.util.Consumer + +internal class HingeSensorAngleProvider( + private val sensorManager: SensorManager +) : HingeAngleProvider { + + private val sensorListener = HingeAngleSensorListener() + private val listeners: MutableList<Consumer<Float>> = arrayListOf() + + override fun start() { + val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE) + sensorManager.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_FASTEST) + } + + override fun stop() { + sensorManager.unregisterListener(sensorListener) + } + + override fun removeCallback(listener: Consumer<Float>) { + listeners.remove(listener) + } + + override fun addCallback(listener: Consumer<Float>) { + listeners.add(listener) + } + + private inner class HingeAngleSensorListener : SensorEventListener { + + override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { + } + + override fun onSensorChanged(event: SensorEvent) { + listeners.forEach { it.accept(event.values[0]) } + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index f653088e552a..b9ade0205154 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -42,6 +42,7 @@ import android.content.IntentFilter; import android.content.res.ColorStateList; import android.content.res.Configuration; import android.content.res.Resources; +import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; @@ -59,6 +60,7 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings.Secure; import android.util.DisplayMetrics; +import android.util.DisplayUtils; import android.util.Log; import android.view.Display; import android.view.DisplayCutout; @@ -66,6 +68,7 @@ import android.view.DisplayCutout.BoundsPosition; import android.view.DisplayInfo; import android.view.Gravity; import android.view.LayoutInflater; +import android.view.RoundedCorners; import android.view.Surface; import android.view.View; import android.view.View.OnLayoutChangeListener; @@ -159,6 +162,10 @@ public class ScreenDecorations extends SystemUI implements Tunable { private boolean mIsRoundedCornerMultipleRadius; private int mStatusBarHeightPortrait; private int mStatusBarHeightLandscape; + private Drawable mRoundedCornerDrawable; + private Drawable mRoundedCornerDrawableTop; + private Drawable mRoundedCornerDrawableBottom; + private String mDisplayUniqueId; private CameraAvailabilityListener.CameraTransitionCallback mCameraTransitionCallback = new CameraAvailabilityListener.CameraTransitionCallback() { @@ -244,10 +251,11 @@ public class ScreenDecorations extends SystemUI implements Tunable { private void startOnScreenDecorationsThread() { mRotation = mContext.getDisplay().getRotation(); + mDisplayUniqueId = mContext.getDisplay().getUniqueId(); + mIsRoundedCornerMultipleRadius = isRoundedCornerMultipleRadius(mContext, mDisplayUniqueId); mWindowManager = mContext.getSystemService(WindowManager.class); mDisplayManager = mContext.getSystemService(DisplayManager.class); - mIsRoundedCornerMultipleRadius = mContext.getResources().getBoolean( - R.bool.config_roundedCornerMultipleRadius); + updateRoundedCornerDrawable(); updateRoundedCornerRadii(); setupDecorations(); setupCameraListener(); @@ -287,6 +295,14 @@ public class ScreenDecorations extends SystemUI implements Tunable { } } } + final String newUniqueId = mContext.getDisplay().getUniqueId(); + if ((newUniqueId != null && !newUniqueId.equals(mDisplayUniqueId)) + || (mDisplayUniqueId != null && !mDisplayUniqueId.equals(newUniqueId))) { + mDisplayUniqueId = newUniqueId; + mIsRoundedCornerMultipleRadius = + isRoundedCornerMultipleRadius(mContext, mDisplayUniqueId); + updateRoundedCornerDrawable(); + } updateOrientation(); } }; @@ -474,6 +490,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { updateRoundedCornerView(pos, R.id.left); updateRoundedCornerView(pos, R.id.right); updateRoundedCornerSize(mRoundedDefault, mRoundedDefaultTop, mRoundedDefaultBottom); + updateRoundedCornerImageView(); // update cutout view rotation if (mCutoutViews != null && mCutoutViews[pos] != null) { @@ -677,27 +694,26 @@ public class ScreenDecorations extends SystemUI implements Tunable { // upgrading all of the configs to contain (width, height) pairs. Instead assume that a // device configured using the single integer config value is okay with drawing the corners // as a square - final int newRoundedDefault = mContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.rounded_corner_radius); - final int newRoundedDefaultTop = mContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.rounded_corner_radius_top); - final int newRoundedDefaultBottom = mContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.rounded_corner_radius_bottom); + final int newRoundedDefault = RoundedCorners.getRoundedCornerRadius( + mContext.getResources(), mDisplayUniqueId); + final int newRoundedDefaultTop = RoundedCorners.getRoundedCornerTopRadius( + mContext.getResources(), mDisplayUniqueId); + final int newRoundedDefaultBottom = RoundedCorners.getRoundedCornerBottomRadius( + mContext.getResources(), mDisplayUniqueId); final boolean changed = mRoundedDefault.x != newRoundedDefault || mRoundedDefaultTop.x != newRoundedDefaultTop || mRoundedDefaultBottom.x != newRoundedDefaultBottom; - if (changed) { // If config_roundedCornerMultipleRadius set as true, ScreenDecorations respect the // (width, height) size of drawable/rounded.xml instead of rounded_corner_radius if (mIsRoundedCornerMultipleRadius) { - Drawable d = mContext.getDrawable(R.drawable.rounded); - mRoundedDefault.set(d.getIntrinsicWidth(), d.getIntrinsicHeight()); - d = mContext.getDrawable(R.drawable.rounded_corner_top); - mRoundedDefaultTop.set(d.getIntrinsicWidth(), d.getIntrinsicHeight()); - d = mContext.getDrawable(R.drawable.rounded_corner_bottom); - mRoundedDefaultBottom.set(d.getIntrinsicWidth(), d.getIntrinsicHeight()); + mRoundedDefault.set(mRoundedCornerDrawable.getIntrinsicWidth(), + mRoundedCornerDrawable.getIntrinsicHeight()); + mRoundedDefaultTop.set(mRoundedCornerDrawableTop.getIntrinsicWidth(), + mRoundedCornerDrawableTop.getIntrinsicHeight()); + mRoundedDefaultBottom.set(mRoundedCornerDrawableBottom.getIntrinsicWidth(), + mRoundedCornerDrawableBottom.getIntrinsicHeight()); } else { mRoundedDefault.set(newRoundedDefault, newRoundedDefault); mRoundedDefaultTop.set(newRoundedDefaultTop, newRoundedDefaultTop); @@ -707,6 +723,89 @@ public class ScreenDecorations extends SystemUI implements Tunable { } } + /** + * Gets whether the rounded corners are multiple radii for current display. + * + * Loads the default config {@link R.bool#config_roundedCornerMultipleRadius} if + * {@link com.android.internal.R.array#config_displayUniqueIdArray} is not set. + */ + private static boolean isRoundedCornerMultipleRadius(Context context, String displayUniqueId) { + final Resources res = context.getResources(); + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); + final TypedArray array = res.obtainTypedArray( + R.array.config_roundedCornerMultipleRadiusArray); + boolean isMultipleRadius; + if (index >= 0 && index < array.length()) { + isMultipleRadius = array.getBoolean(index, false); + } else { + isMultipleRadius = res.getBoolean(R.bool.config_roundedCornerMultipleRadius); + } + array.recycle(); + return isMultipleRadius; + } + + /** + * Gets the rounded corner drawable for current display. + * + * Loads the default config {@link R.drawable#rounded} if + * {@link com.android.internal.R.array#config_displayUniqueIdArray} is not set. + */ + private static Drawable getRoundedCornerDrawable(Context context, String displayUniqueId) { + final Resources res = context.getResources(); + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); + final TypedArray array = res.obtainTypedArray(R.array.config_roundedCornerDrawableArray); + Drawable drawable; + if (index >= 0 && index < array.length()) { + drawable = array.getDrawable(index); + } else { + drawable = context.getDrawable(R.drawable.rounded); + } + array.recycle(); + return drawable; + } + + /** + * Gets the rounded corner top drawable for current display. + * + * Loads the default config {@link R.drawable#rounded_corner_top} if + * {@link com.android.internal.R.array#config_displayUniqueIdArray} is not set. + */ + private static Drawable getRoundedCornerTopDrawable(Context context, String displayUniqueId) { + final Resources res = context.getResources(); + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); + final TypedArray array = res.obtainTypedArray(R.array.config_roundedCornerTopDrawableArray); + Drawable drawable; + if (index >= 0 && index < array.length()) { + drawable = array.getDrawable(index); + } else { + drawable = context.getDrawable(R.drawable.rounded_corner_top); + } + array.recycle(); + return drawable; + } + + /** + * Gets the rounded corner bottom drawable for current display. + * + * Loads the default config {@link R.drawable#rounded_corner_bottom} if + * {@link com.android.internal.R.array#config_displayUniqueIdArray} is not set. + */ + private static Drawable getRoundedCornerBottomDrawable( + Context context, String displayUniqueId) { + final Resources res = context.getResources(); + final int index = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId); + final TypedArray array = res.obtainTypedArray( + R.array.config_roundedCornerBottomDrawableArray); + Drawable drawable; + if (index >= 0 && index < array.length()) { + drawable = array.getDrawable(index); + } else { + drawable = context.getDrawable(R.drawable.rounded_corner_bottom); + } + array.recycle(); + return drawable; + } + private void updateRoundedCornerView(@BoundsPosition int pos, int id) { final View rounded = mOverlays[pos].findViewById(id); if (rounded == null) { @@ -837,6 +936,51 @@ public class ScreenDecorations extends SystemUI implements Tunable { }); } + private void updateRoundedCornerDrawable() { + mRoundedCornerDrawable = getRoundedCornerDrawable(mContext, mDisplayUniqueId); + mRoundedCornerDrawableTop = getRoundedCornerTopDrawable(mContext, mDisplayUniqueId); + mRoundedCornerDrawableBottom = getRoundedCornerBottomDrawable(mContext, mDisplayUniqueId); + updateRoundedCornerImageView(); + } + + private void updateRoundedCornerImageView() { + final Drawable top = mRoundedCornerDrawableTop != null + ? mRoundedCornerDrawableTop : mRoundedCornerDrawable; + final Drawable bottom = mRoundedCornerDrawableBottom != null + ? mRoundedCornerDrawableBottom : mRoundedCornerDrawable; + + if (mOverlays == null) { + return; + } + for (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) { + if (mOverlays[i] == null) { + continue; + } + ((ImageView) mOverlays[i].findViewById(R.id.left)).setImageDrawable( + isTopRoundedCorner(i, R.id.left) ? top : bottom); + ((ImageView) mOverlays[i].findViewById(R.id.right)).setImageDrawable( + isTopRoundedCorner(i, R.id.right) ? top : bottom); + } + } + + private boolean isTopRoundedCorner(@BoundsPosition int pos, int id) { + switch (pos) { + case BOUNDS_POSITION_LEFT: + case BOUNDS_POSITION_RIGHT: + if (mRotation == ROTATION_270) { + return id == R.id.left ? false : true; + } else { + return id == R.id.left ? true : false; + } + case BOUNDS_POSITION_TOP: + return true; + case BOUNDS_POSITION_BOTTOM: + return false; + default: + throw new IllegalArgumentException("Unknown bounds position"); + } + } + private void updateRoundedCornerSize( Point sizeDefault, Point sizeTop, @@ -855,21 +999,10 @@ public class ScreenDecorations extends SystemUI implements Tunable { if (mOverlays[i] == null) { continue; } - if (i == BOUNDS_POSITION_LEFT || i == BOUNDS_POSITION_RIGHT) { - if (mRotation == ROTATION_270) { - setSize(mOverlays[i].findViewById(R.id.left), sizeBottom); - setSize(mOverlays[i].findViewById(R.id.right), sizeTop); - } else { - setSize(mOverlays[i].findViewById(R.id.left), sizeTop); - setSize(mOverlays[i].findViewById(R.id.right), sizeBottom); - } - } else if (i == BOUNDS_POSITION_TOP) { - setSize(mOverlays[i].findViewById(R.id.left), sizeTop); - setSize(mOverlays[i].findViewById(R.id.right), sizeTop); - } else if (i == BOUNDS_POSITION_BOTTOM) { - setSize(mOverlays[i].findViewById(R.id.left), sizeBottom); - setSize(mOverlays[i].findViewById(R.id.right), sizeBottom); - } + setSize(mOverlays[i].findViewById(R.id.left), + isTopRoundedCorner(i, R.id.left) ? sizeTop : sizeBottom); + setSize(mOverlays[i].findViewById(R.id.right), + isTopRoundedCorner(i, R.id.right) ? sizeTop : sizeBottom); } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java index a51e3fcfd50b..0893e895b102 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java @@ -499,9 +499,12 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold } private void setMagnificationFrameWith(Rect windowBounds, int centerX, int centerY) { - // Sets the initial frame area for the mirror and places it in the center of the display. - final int initSize = Math.min(windowBounds.width(), windowBounds.height()) / 2 - + 2 * mMirrorSurfaceMargin; + // Sets the initial frame area for the mirror and place it to the given center on the + // display. + int initSize = Math.min(windowBounds.width(), windowBounds.height()) / 2; + initSize = Math.min(mResources.getDimensionPixelSize(R.dimen.magnification_max_frame_size), + initSize); + initSize += 2 * mMirrorSurfaceMargin; final int initX = centerX - initSize / 2; final int initY = centerY - initSize / 2; mMagnificationFrame.set(initX, initY, initX + initSize, initY + initSize); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java index 3f61d3c6af9a..fd37b3509a4e 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java @@ -126,6 +126,7 @@ public class AuthContainerView extends LinearLayout boolean mCredentialAllowed; boolean mSkipIntro; long mOperationId; + long mRequestId; @BiometricMultiSensorMode int mMultiSensorConfig; } @@ -172,6 +173,12 @@ public class AuthContainerView extends LinearLayout return this; } + /** Unique id for this request. */ + public Builder setRequestId(long requestId) { + mConfig.mRequestId = requestId; + return this; + } + /** The multi-sensor mode. */ public Builder setMultiSensorConfig(@BiometricMultiSensorMode int multiSensorConfig) { mConfig.mMultiSensorConfig = multiSensorConfig; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index ab5f2b8289be..bcc053068712 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -501,7 +501,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, @Override public void showAuthenticationDialog(PromptInfo promptInfo, IBiometricSysuiReceiver receiver, int[] sensorIds, boolean credentialAllowed, boolean requireConfirmation, - int userId, String opPackageName, long operationId, + int userId, long operationId, String opPackageName, long requestId, @BiometricMultiSensorMode int multiSensorConfig) { @Authenticators.Types final int authenticators = promptInfo.getAuthenticators(); @@ -515,6 +515,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, + ", credentialAllowed: " + credentialAllowed + ", requireConfirmation: " + requireConfirmation + ", operationId: " + operationId + + ", requestId: " + requestId + ", multiSensorConfig: " + multiSensorConfig); } SomeArgs args = SomeArgs.obtain(); @@ -526,6 +527,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, args.argi1 = userId; args.arg6 = opPackageName; args.arg7 = operationId; + args.arg8 = requestId; args.argi2 = multiSensorConfig; boolean skipAnimation = false; @@ -629,6 +631,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, if (mCurrentDialog == null) { // Could be possible if the caller canceled authentication after credential success // but before the client was notified. + if (DEBUG) Log.d(TAG, "dialog already gone"); return; } @@ -683,6 +686,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, final int userId = args.argi1; final String opPackageName = (String) args.arg6; final long operationId = (long) args.arg7; + final long requestId = (long) args.arg8; final @BiometricMultiSensorMode int multiSensorConfig = args.argi2; // Create a new dialog but do not replace the current one yet. @@ -695,6 +699,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, opPackageName, skipAnimation, operationId, + requestId, multiSensorConfig); if (newDialog == null) { @@ -772,7 +777,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, protected AuthDialog buildDialog(PromptInfo promptInfo, boolean requireConfirmation, int userId, int[] sensorIds, boolean credentialAllowed, String opPackageName, - boolean skipIntro, long operationId, + boolean skipIntro, long operationId, long requestId, @BiometricMultiSensorMode int multiSensorConfig) { return new AuthContainerView.Builder(mContext) .setCallback(this) @@ -782,6 +787,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, .setOpPackageName(opPackageName) .setSkipIntro(skipIntro) .setOperationId(operationId) + .setRequestId(requestId) .setMultiSensorConfig(multiSensorConfig) .build(sensorIds, credentialAllowed, mFpProps, mFaceProps); } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index e13ae4ce5152..ae426b631734 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -769,6 +769,7 @@ public class UdfpsController implements DozeReceiver { UdfpsEnrollView enrollView = (UdfpsEnrollView) mInflater.inflate( R.layout.udfps_enroll_view, null); mView.addView(enrollView); + enrollView.updateSensorLocation(mSensorProps); return new UdfpsEnrollViewController( enrollView, mServerRequest.mEnrollHelper, diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java index ea69b1d626ae..d4077563cfea 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollDrawable.java @@ -43,7 +43,6 @@ public class UdfpsEnrollDrawable extends UdfpsDrawable { // 1 + SCALE_MAX is the maximum that the moving target will animate to private static final float SCALE_MAX = 0.25f; - @NonNull private final UdfpsEnrollProgressBarDrawable mProgressDrawable; @NonNull private final Drawable mMovingTargetFpIcon; @NonNull private final Paint mSensorOutlinePaint; @NonNull private final Paint mBlueFill; @@ -62,7 +61,6 @@ public class UdfpsEnrollDrawable extends UdfpsDrawable { UdfpsEnrollDrawable(@NonNull Context context) { super(context); - mProgressDrawable = new UdfpsEnrollProgressBarDrawable(context, this); mSensorOutlinePaint = new Paint(0 /* flags */); mSensorOutlinePaint.setAntiAlias(true); @@ -100,8 +98,6 @@ public class UdfpsEnrollDrawable extends UdfpsDrawable { } void onEnrollmentProgress(int remaining, int totalSteps) { - mProgressDrawable.setEnrollmentProgress(remaining, totalSteps); - if (mEnrollHelper.isCenterEnrollmentComplete()) { if (mAnimatorSet != null && mAnimatorSet.isRunning()) { mAnimatorSet.end(); @@ -139,14 +135,8 @@ public class UdfpsEnrollDrawable extends UdfpsDrawable { } } - void onLastStepAcquired() { - mProgressDrawable.onLastStepAcquired(); - } - @Override public void draw(@NonNull Canvas canvas) { - mProgressDrawable.draw(canvas); - if (isIlluminationShowing()) { return; } @@ -175,11 +165,6 @@ public class UdfpsEnrollDrawable extends UdfpsDrawable { } @Override - public void onBoundsChange(@NonNull Rect rect) { - mProgressDrawable.setBounds(rect); - } - - @Override public void setAlpha(int alpha) { super.setAlpha(alpha); mSensorOutlinePaint.setAlpha(alpha); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollHelper.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollHelper.java index 6a918a6c8d39..19148e383005 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollHelper.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollHelper.java @@ -50,6 +50,7 @@ public class UdfpsEnrollHelper { interface Listener { void onEnrollmentProgress(int remaining, int totalSteps); void onLastStepAcquired(); + void onEnrollmentHelp(); } @NonNull private final Context mContext; @@ -138,7 +139,9 @@ public class UdfpsEnrollHelper { } void onEnrollmentHelp() { - + if (mListener != null) { + mListener.onEnrollmentHelp(); + } } void setListener(Listener listener) { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollProgressBarDrawable.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollProgressBarDrawable.java index 4195009937c2..373d17c8ef66 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollProgressBarDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollProgressBarDrawable.java @@ -16,7 +16,9 @@ package com.android.systemui.biometrics; +import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; +import android.annotation.ColorInt; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; @@ -41,19 +43,26 @@ public class UdfpsEnrollProgressBarDrawable extends Drawable { private static final float PROGRESS_BAR_THICKNESS_DP = 12; @NonNull private final Context mContext; - @NonNull private final UdfpsEnrollDrawable mParent; @NonNull private final Paint mBackgroundCirclePaint; @NonNull private final Paint mProgressPaint; @Nullable private ValueAnimator mProgressAnimator; + @Nullable private ValueAnimator mProgressShowingHelpAnimator; + @Nullable private ValueAnimator mProgressHidingHelpAnimator; + @ColorInt private final int mProgressColor; + @ColorInt private final int mProgressHelpColor; + private final int mShortAnimationDuration; private float mProgress; private int mRotation; // After last step, rotate the progress bar once private boolean mLastStepAcquired; - public UdfpsEnrollProgressBarDrawable(@NonNull Context context, - @NonNull UdfpsEnrollDrawable parent) { + public UdfpsEnrollProgressBarDrawable(@NonNull Context context) { mContext = context; - mParent = parent; + + mShortAnimationDuration = context.getResources() + .getInteger(com.android.internal.R.integer.config_shortAnimTime); + mProgressColor = context.getColor(R.color.udfps_enroll_progress); + mProgressHelpColor = context.getColor(R.color.udfps_enroll_progress_help); mBackgroundCirclePaint = new Paint(); mBackgroundCirclePaint.setStrokeWidth(Utils.dpToPixels(context, PROGRESS_BAR_THICKNESS_DP)); @@ -74,7 +83,7 @@ public class UdfpsEnrollProgressBarDrawable extends Drawable { // Progress should not be color extracted mProgressPaint = new Paint(); mProgressPaint.setStrokeWidth(Utils.dpToPixels(context, PROGRESS_BAR_THICKNESS_DP)); - mProgressPaint.setColor(context.getColor(R.color.udfps_enroll_progress)); + mProgressPaint.setColor(mProgressColor); mProgressPaint.setAntiAlias(true); mProgressPaint.setStyle(Paint.Style.STROKE); mProgressPaint.setStrokeCap(Paint.Cap.ROUND); @@ -92,7 +101,9 @@ public class UdfpsEnrollProgressBarDrawable extends Drawable { return; } - long animationDuration = 150; + long animationDuration = mShortAnimationDuration; + + hideEnrollmentHelp(); if (progress == 1.f) { animationDuration = 400; @@ -101,7 +112,7 @@ public class UdfpsEnrollProgressBarDrawable extends Drawable { rotationAnimator.addUpdateListener(animation -> { Log.d(TAG, "Rotation: " + mRotation); mRotation = (int) animation.getAnimatedValue(); - mParent.invalidateSelf(); + invalidateSelf(); }); rotationAnimator.start(); } @@ -114,11 +125,7 @@ public class UdfpsEnrollProgressBarDrawable extends Drawable { mProgressAnimator.setDuration(animationDuration); mProgressAnimator.addUpdateListener(animation -> { mProgress = (float) animation.getAnimatedValue(); - // Use the parent to invalidate, since it's the one that's attached as the view's - // drawable and has its callback set automatically. Invalidating via - // `this.invalidateSelf` actually does not invoke draw(), since this drawable's callback - // is not really set. - mParent.invalidateSelf(); + invalidateSelf(); }); mProgressAnimator.start(); } @@ -128,6 +135,46 @@ public class UdfpsEnrollProgressBarDrawable extends Drawable { mLastStepAcquired = true; } + void onEnrollmentHelp() { + if (mProgressShowingHelpAnimator != null || mProgressAnimator == null) { + return; // already showing or at 0% (no progress bar visible) + } + + if (mProgressHidingHelpAnimator != null && mProgressHidingHelpAnimator.isRunning()) { + mProgressHidingHelpAnimator.cancel(); + } + mProgressHidingHelpAnimator = null; + + mProgressShowingHelpAnimator = getProgressColorAnimator( + mProgressPaint.getColor(), mProgressHelpColor); + mProgressShowingHelpAnimator.start(); + } + + private void hideEnrollmentHelp() { + if (mProgressHidingHelpAnimator != null || mProgressShowingHelpAnimator == null) { + return; // already hidden or help never shown + } + + if (mProgressShowingHelpAnimator != null && mProgressShowingHelpAnimator.isRunning()) { + mProgressShowingHelpAnimator.cancel(); + } + mProgressShowingHelpAnimator = null; + + mProgressHidingHelpAnimator = getProgressColorAnimator( + mProgressPaint.getColor(), mProgressColor); + mProgressHidingHelpAnimator.start(); + } + + private ValueAnimator getProgressColorAnimator(@ColorInt int from, @ColorInt int to) { + final ValueAnimator animator = ValueAnimator.ofObject( + ArgbEvaluator.getInstance(), from, to); + animator.setDuration(mShortAnimationDuration); + animator.addUpdateListener(animation -> { + mProgressPaint.setColor((int) animation.getAnimatedValue()); + }); + return animator; + } + @Override public void draw(@NonNull Canvas canvas) { canvas.save(); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java index 2cdf49d6fc3c..d9edef48b3d4 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollView.java @@ -17,9 +17,12 @@ package com.android.systemui.biometrics; import android.content.Context; +import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.Handler; import android.os.Looper; import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; import android.widget.ImageView; import androidx.annotation.NonNull; @@ -32,20 +35,25 @@ import com.android.systemui.R; */ public class UdfpsEnrollView extends UdfpsAnimationView { @NonNull private final UdfpsEnrollDrawable mFingerprintDrawable; + @NonNull private final UdfpsEnrollProgressBarDrawable mFingerprintProgressDrawable; @NonNull private final Handler mHandler; @NonNull private ImageView mFingerprintView; + @NonNull private ImageView mFingerprintProgressView; public UdfpsEnrollView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mFingerprintDrawable = new UdfpsEnrollDrawable(mContext); + mFingerprintProgressDrawable = new UdfpsEnrollProgressBarDrawable(context); mHandler = new Handler(Looper.getMainLooper()); } @Override protected void onFinishInflate() { mFingerprintView = findViewById(R.id.udfps_enroll_animation_fp_view); + mFingerprintProgressView = findViewById(R.id.udfps_enroll_animation_fp_progress_view); mFingerprintView.setImageDrawable(mFingerprintDrawable); + mFingerprintProgressView.setImageDrawable(mFingerprintProgressDrawable); } @Override @@ -53,15 +61,35 @@ public class UdfpsEnrollView extends UdfpsAnimationView { return mFingerprintDrawable; } + void updateSensorLocation(@NonNull FingerprintSensorPropertiesInternal sensorProps) { + View fingerprintAccessibilityView = findViewById(R.id.udfps_enroll_accessibility_view); + final int sensorHeight = sensorProps.sensorRadius * 2; + final int sensorWidth = sensorHeight; + ViewGroup.LayoutParams params = fingerprintAccessibilityView.getLayoutParams(); + params.width = sensorWidth; + params.height = sensorHeight; + fingerprintAccessibilityView.setLayoutParams(params); + fingerprintAccessibilityView.requestLayout(); + } + void setEnrollHelper(UdfpsEnrollHelper enrollHelper) { mFingerprintDrawable.setEnrollHelper(enrollHelper); } void onEnrollmentProgress(int remaining, int totalSteps) { - mHandler.post(() -> mFingerprintDrawable.onEnrollmentProgress(remaining, totalSteps)); + mHandler.post(() -> { + mFingerprintProgressDrawable.setEnrollmentProgress(remaining, totalSteps); + mFingerprintDrawable.onEnrollmentProgress(remaining, totalSteps); + }); } void onLastStepAcquired() { - mHandler.post(mFingerprintDrawable::onLastStepAcquired); + mHandler.post(() -> { + mFingerprintProgressDrawable.onLastStepAcquired(); + }); + } + + void onEnrollmentHelp() { + mHandler.post(mFingerprintProgressDrawable::onEnrollmentHelp); } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java index 54244a16ed78..33fbe7b6ebec 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsEnrollViewController.java @@ -44,6 +44,11 @@ public class UdfpsEnrollViewController extends UdfpsAnimationViewController<Udfp public void onLastStepAcquired() { mView.onLastStepAcquired(); } + + @Override + public void onEnrollmentHelp() { + mView.onEnrollmentHelp(); + } }; protected UdfpsEnrollViewController( diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java index c093219de59b..e7974bc3e6c9 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java @@ -196,9 +196,11 @@ public class DependencyProvider { @SysUISingleton @Provides static ThemeOverlayApplier provideThemeOverlayManager(Context context, - @Background Executor bgExecutor, OverlayManager overlayManager, + @Background Executor bgExecutor, + @Main Executor mainExecutor, + OverlayManager overlayManager, DumpManager dumpManager) { - return new ThemeOverlayApplier(overlayManager, bgExecutor, + return new ThemeOverlayApplier(overlayManager, bgExecutor, mainExecutor, context.getString(R.string.launcher_overlayable_package), context.getString(R.string.themepicker_overlayable_package), dumpManager); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 35773955529f..a5dd6a11c388 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -67,6 +67,7 @@ import android.view.WindowManager; import android.view.WindowManagerPolicyConstants; import android.window.IRemoteTransition; import android.window.IRemoteTransitionFinishedCallback; +import android.window.RemoteTransition; import android.window.TransitionFilter; import android.window.TransitionInfo; @@ -236,7 +237,8 @@ public class KeyguardService extends Service { Slog.d(TAG, "KeyguardService registerRemote: TRANSIT_KEYGUARD_GOING_AWAY"); TransitionFilter f = new TransitionFilter(); f.mFlags = TRANSIT_FLAG_KEYGUARD_GOING_AWAY; - shellTransitions.registerRemote(f, wrap(mExitAnimationRunner)); + shellTransitions.registerRemote(f, + new RemoteTransition(wrap(mExitAnimationRunner))); } if (sEnableRemoteKeyguardOccludeAnimation) { Slog.d(TAG, "KeyguardService registerRemote: TRANSIT_KEYGUARD_(UN)OCCLUDE"); @@ -255,7 +257,7 @@ public class KeyguardService extends Service { f.mRequirements[1].mMustBeIndependent = false; f.mRequirements[1].mFlags = FLAG_OCCLUDES_KEYGUARD; f.mRequirements[1].mModes = new int[]{TRANSIT_CLOSE, TRANSIT_TO_BACK}; - shellTransitions.registerRemote(f, mOccludeAnimation); + shellTransitions.registerRemote(f, new RemoteTransition(mOccludeAnimation)); // Now register for un-occlude. f = new TransitionFilter(); @@ -275,7 +277,7 @@ public class KeyguardService extends Service { f.mRequirements[0].mMustBeIndependent = false; f.mRequirements[0].mFlags = FLAG_OCCLUDES_KEYGUARD; f.mRequirements[0].mModes = new int[]{TRANSIT_OPEN, TRANSIT_TO_FRONT}; - shellTransitions.registerRemote(f, mUnoccludeAnimation); + shellTransitions.registerRemote(f, new RemoteTransition(mUnoccludeAnimation)); } } else { RemoteAnimationDefinition definition = new RemoteAnimationDefinition(); diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt index 2facf3dedd18..db5dbb0263c8 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt @@ -212,14 +212,32 @@ class MediaCarouselController @Inject constructor( isSsReactivated: Boolean ) { if (addOrUpdatePlayer(key, oldKey, data)) { + // Log card received if a new resumable media card is added MediaPlayerData.getMediaPlayer(key)?.let { logSmartspaceCardReported(759, // SMARTSPACE_CARD_RECEIVED it.mInstanceId, + it.mUid, /* isRecommendationCard */ false, it.surfaceForSmartspaceLogging, rank = MediaPlayerData.getMediaPlayerIndex(key)) } } + if (isSsReactivated) { + // If resumable media is reactivated by headphone connection, update instance + // id for each card and log a receive event. + MediaPlayerData.players().forEachIndexed { index, it -> + if (it.recommendationViewHolder == null) { + it.mInstanceId = SmallHash.hash(it.mUid + + systemClock.currentTimeMillis().toInt()) + logSmartspaceCardReported(759, // SMARTSPACE_CARD_RECEIVED + it.mInstanceId, + it.mUid, + /* isRecommendationCard */ false, + it.surfaceForSmartspaceLogging, + rank = index) + } + } + } if (mediaCarouselScrollHandler.visibleToUser && isSsReactivated && !mediaCarouselScrollHandler.qsExpanded) { // It could happen that reactived media player isn't visible to user because @@ -252,6 +270,7 @@ class MediaCarouselController @Inject constructor( MediaPlayerData.getMediaPlayer(key)?.let { logSmartspaceCardReported(759, // SMARTSPACE_CARD_RECEIVED it.mInstanceId, + it.mUid, /* isRecommendationCard */ true, it.surfaceForSmartspaceLogging, rank = MediaPlayerData.getMediaPlayerIndex(key)) @@ -261,6 +280,7 @@ class MediaCarouselController @Inject constructor( MediaPlayerData.getMediaPlayerIndex(key)) { logSmartspaceCardReported(800, // SMARTSPACE_CARD_SEEN it.mInstanceId, + it.mUid, /* isRecommendationCard */ true, it.surfaceForSmartspaceLogging) } @@ -339,9 +359,9 @@ class MediaCarouselController @Inject constructor( if (activeMediaIndex != -1) { previousVisiblePlayerKey?.let { val previousVisibleIndex = MediaPlayerData.playerKeys() - .indexOfFirst { key -> it == key } + .indexOfFirst { key -> it == key } mediaCarouselScrollHandler - .scrollToPlayer(previousVisibleIndex, activeMediaIndex) + .scrollToPlayer(previousVisibleIndex, activeMediaIndex) } ?: { mediaCarouselScrollHandler.scrollToPlayer(destIndex = activeMediaIndex) } @@ -355,11 +375,11 @@ class MediaCarouselController @Inject constructor( MediaPlayerData.moveIfExists(oldKey, key) val existingPlayer = MediaPlayerData.getMediaPlayer(key) val curVisibleMediaKey = MediaPlayerData.playerKeys() - .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) + .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) if (existingPlayer == null) { var newPlayer = mediaControlPanelFactory.get() newPlayer.attachPlayer( - PlayerViewHolder.create(LayoutInflater.from(context), mediaContent)) + PlayerViewHolder.create(LayoutInflater.from(context), mediaContent)) newPlayer.mediaViewController.sizeChangedListener = this::updateCarouselDimensions val lp = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) @@ -407,14 +427,14 @@ class MediaCarouselController @Inject constructor( var newRecs = mediaControlPanelFactory.get() newRecs.attachRecommendation( - RecommendationViewHolder.create(LayoutInflater.from(context), mediaContent)) + RecommendationViewHolder.create(LayoutInflater.from(context), mediaContent)) newRecs.mediaViewController.sizeChangedListener = this::updateCarouselDimensions val lp = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT) + ViewGroup.LayoutParams.WRAP_CONTENT) newRecs.recommendationViewHolder?.recommendations?.setLayoutParams(lp) newRecs.bindRecommendation(data.copy(backgroundColor = bgColor)) val curVisibleMediaKey = MediaPlayerData.playerKeys() - .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) + .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) MediaPlayerData.addMediaRecommendation(key, data, newRecs, shouldPrioritize, systemClock) updatePlayerToState(newRecs, noAnimation = true) reorderAllPlayers(curVisibleMediaKey) @@ -462,7 +482,7 @@ class MediaCarouselController @Inject constructor( removePlayer(key, dismissMediaData = false, dismissRecommendation = false) smartspaceMediaData?.let { addSmartspaceMediaRecommendations( - it.targetId, it, MediaPlayerData.shouldPrioritizeSs) + it.targetId, it, MediaPlayerData.shouldPrioritizeSs) } } else { removePlayer(key, dismissMediaData = false, dismissRecommendation = false) @@ -585,7 +605,7 @@ class MediaCarouselController @Inject constructor( ?: endShowsActive if (currentlyShowingOnlyActive != endShowsActive || ((currentTransitionProgress != 1.0f && currentTransitionProgress != 0.0f) && - startShowsActive != endShowsActive)) { + startShowsActive != endShowsActive)) { // Whenever we're transitioning from between differing states or the endstate differs // we reset the translation currentlyShowingOnlyActive = endShowsActive @@ -696,23 +716,43 @@ class MediaCarouselController @Inject constructor( } logSmartspaceCardReported(800, // SMARTSPACE_CARD_SEEN mediaControlPanel.mInstanceId, + mediaControlPanel.mUid, isRecommendationCard, mediaControlPanel.surfaceForSmartspaceLogging) } } @JvmOverloads + /** + * Log Smartspace events + * + * @param eventId UI event id (e.g. 800 for SMARTSPACE_CARD_SEEN) + * @param instanceId id to uniquely identify a card, e.g. each headphone generates a new + * instanceId + * @param uid uid for the application that media comes from + * @param isRecommendationCard whether the card is media recommendation + * @param surface which display surface the media card is on (e.g. lockscreen, shade) + * @param interactedSubcardRank the rank for interacted media item for recommendation card, -1 + * for tapping on card but not on any media item, 0 for first media item, 1 for second, etc. + * @param interactedSubcardCardinality how many media items were shown to the user when there + * is user interaction + * @param rank the rank for media card in the media carousel, starting from 0 + * + */ fun logSmartspaceCardReported( eventId: Int, instanceId: Int, + uid: Int, isRecommendationCard: Boolean, surface: Int, + interactedSubcardRank: Int = 0, + interactedSubcardCardinality: Int = 0, rank: Int = mediaCarouselScrollHandler.visibleMediaIndex ) { // Only log media resume card when Smartspace data is available if (!isRecommendationCard && - !mediaManager.smartspaceMediaData.isActive && - MediaPlayerData.smartspaceMediaData == null) { + !mediaManager.smartspaceMediaData.isActive && + MediaPlayerData.smartspaceMediaData == null) { return } @@ -720,13 +760,20 @@ class MediaCarouselController @Inject constructor( SysUiStatsLog.write(SysUiStatsLog.SMARTSPACE_CARD_REPORTED, eventId, instanceId, - if (isRecommendationCard) - SysUiStatsLog.SMART_SPACE_CARD_REPORTED__CARD_TYPE__HEADPHONE_MEDIA_RECOMMENDATIONS - else - SysUiStatsLog.SMART_SPACE_CARD_REPORTED__CARD_TYPE__HEADPHONE_RESUME_MEDIA, + // Deprecated, replaced with AiAi feature type so we don't need to create logging + // card type for each new feature. + SysUiStatsLog.SMART_SPACE_CARD_REPORTED__CARD_TYPE__UNKNOWN_CARD, surface, rank, - mediaContent.getChildCount()) + mediaContent.getChildCount(), + if (isRecommendationCard) + 15 // MEDIA_RECOMMENDATION + else + 31, // MEDIA_RESUME + uid, + interactedSubcardRank, + interactedSubcardCardinality + ) /* ktlint-disable max-line-length */ } @@ -738,18 +785,20 @@ class MediaCarouselController @Inject constructor( if (!recommendation.isEmpty()) { logSmartspaceCardReported(761, // SMARTSPACE_CARD_DISMISS recommendation.get(0).mInstanceId, + recommendation.get(0).mUid, true, recommendation.get(0).surfaceForSmartspaceLogging, - /* rank */-1) + rank = -1) } else { val visibleMediaIndex = mediaCarouselScrollHandler.visibleMediaIndex if (MediaPlayerData.players().size > visibleMediaIndex) { val player = MediaPlayerData.players().elementAt(visibleMediaIndex) logSmartspaceCardReported(761, // SMARTSPACE_CARD_DISMISS player.mInstanceId, - false, + player.mUid, + false, player.surfaceForSmartspaceLogging, - /* rank */-1) + rank = -1) } } mediaManager.onSwipeToDismiss() @@ -768,7 +817,7 @@ class MediaCarouselController @Inject constructor( @VisibleForTesting internal object MediaPlayerData { private val EMPTY = MediaData(-1, false, 0, null, null, null, null, null, - emptyList(), emptyList(), "INVALID", null, null, null, true, null) + emptyList(), emptyList(), "INVALID", null, null, null, true, null) // Whether should prioritize Smartspace card. internal var shouldPrioritizeSs: Boolean = false private set @@ -776,18 +825,18 @@ internal object MediaPlayerData { private set data class MediaSortKey( - // Whether the item represents a Smartspace media recommendation. + // Whether the item represents a Smartspace media recommendation. val isSsMediaRec: Boolean, val data: MediaData, val updateTime: Long = 0 ) private val comparator = - compareByDescending<MediaSortKey> { it.data.isPlaying } - .thenByDescending { if (shouldPrioritizeSs) it.isSsMediaRec else !it.isSsMediaRec } - .thenByDescending { it.data.isLocalSession } - .thenByDescending { !it.data.resumption } - .thenByDescending { it.updateTime } + compareByDescending<MediaSortKey> { it.data.isPlaying } + .thenByDescending { if (shouldPrioritizeSs) it.isSsMediaRec else !it.isSsMediaRec } + .thenByDescending { it.data.isLocalSession } + .thenByDescending { !it.data.resumption } + .thenByDescending { it.updateTime } private val mediaPlayers = TreeMap<MediaSortKey, MediaControlPanel>(comparator) private val mediaData: MutableMap<String, MediaSortKey> = mutableMapOf() @@ -888,4 +937,4 @@ internal object MediaPlayerData { } return false } -} +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index 15a70831b2f9..c125612380d3 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -33,6 +33,7 @@ import android.graphics.drawable.Icon; import android.media.session.MediaController; import android.media.session.MediaSession; import android.media.session.PlaybackState; +import android.os.Process; import android.text.Layout; import android.util.Log; import android.view.View; @@ -111,6 +112,9 @@ public class MediaControlPanel { private int mAlbumArtSize; // Instance id for logging purpose. protected int mInstanceId = -1; + // Uid for the media app. + protected int mUid = Process.INVALID_UID; + private int mSmartspaceMediaItemsCount; private MediaCarouselController mMediaCarouselController; private final MediaOutputDialogFactory mMediaOutputDialogFactory; @@ -266,7 +270,13 @@ public class MediaControlPanel { } mKey = key; MediaSession.Token token = data.getToken(); - mInstanceId = SmallHash.hash(data.getPackageName()); + PackageManager packageManager = mContext.getPackageManager(); + try { + mUid = packageManager.getApplicationInfo(data.getPackageName(), 0 /* flags */).uid; + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Unable to look up package name", e); + } + mInstanceId = SmallHash.hash(mUid); mBackgroundColor = data.getBackgroundColor(); if (mToken == null || !mToken.equals(token)) { @@ -360,27 +370,16 @@ public class MediaControlPanel { final MediaDeviceData device = data.getDevice(); final int seamlessId = mPlayerViewHolder.getSeamless().getId(); - final int seamlessFallbackId = mPlayerViewHolder.getSeamlessFallback().getId(); - final boolean showFallback = device != null && !device.getEnabled(); - final int seamlessFallbackVisibility = showFallback ? View.VISIBLE : View.GONE; - mPlayerViewHolder.getSeamlessFallback().setVisibility(seamlessFallbackVisibility); - expandedSet.setVisibility(seamlessFallbackId, seamlessFallbackVisibility); - collapsedSet.setVisibility(seamlessFallbackId, seamlessFallbackVisibility); - final int seamlessVisibility = showFallback ? View.GONE : View.VISIBLE; - mPlayerViewHolder.getSeamless().setVisibility(seamlessVisibility); - expandedSet.setVisibility(seamlessId, seamlessVisibility); - collapsedSet.setVisibility(seamlessId, seamlessVisibility); - final float seamlessAlpha = data.getResumption() ? DISABLED_ALPHA : 1.0f; + // Disable clicking on output switcher for invalid devices and resumption controls + final boolean seamlessDisabled = (device != null && !device.getEnabled()) + || data.getResumption(); + final float seamlessAlpha = seamlessDisabled ? DISABLED_ALPHA : 1.0f; expandedSet.setAlpha(seamlessId, seamlessAlpha); collapsedSet.setAlpha(seamlessId, seamlessAlpha); - // Disable clicking on output switcher for resumption controls. - mPlayerViewHolder.getSeamless().setEnabled(!data.getResumption()); + mPlayerViewHolder.getSeamless().setEnabled(!seamlessDisabled); String deviceString = null; - if (showFallback) { - iconView.setImageDrawable(null); - } else if (device != null) { + if (device != null && device.getEnabled()) { Drawable icon = device.getIcon(); - iconView.setVisibility(View.VISIBLE); if (icon instanceof AdaptiveIcon) { AdaptiveIcon aIcon = (AdaptiveIcon) icon; aIcon.setBackgroundColor(mBackgroundColor); @@ -391,10 +390,9 @@ public class MediaControlPanel { deviceString = device.getName(); } else { // Reset to default - Log.w(TAG, "device is null. Not binding output chip."); - iconView.setVisibility(View.GONE); - deviceString = mContext.getString( - com.android.internal.R.string.ext_media_seamless_action); + Log.w(TAG, "Device is null or not enabled: " + device + ", not binding output chip."); + iconView.setImageResource(R.drawable.ic_media_home_devices); + deviceString = mContext.getString(R.string.media_seamless_other_device); } deviceName.setText(deviceString); seamlessView.setContentDescription(deviceString); @@ -531,10 +529,11 @@ public class MediaControlPanel { } // Set up recommendation card's header. - ApplicationInfo applicationInfo = null; + ApplicationInfo applicationInfo; try { applicationInfo = mContext.getPackageManager() .getApplicationInfo(data.getPackageName(), 0 /* flags */); + mUid = applicationInfo.uid; } catch (PackageManager.NameNotFoundException e) { Log.w(TAG, "Fail to get media recommendation's app info", e); return; @@ -553,7 +552,8 @@ public class MediaControlPanel { headerTitleText.setText(appLabel); } // Set up media rec card's tap action if applicable. - setSmartspaceRecItemOnClickListener(recommendationCard, data.getCardAction()); + setSmartspaceRecItemOnClickListener(recommendationCard, data.getCardAction(), + /* interactedSubcardRank */ -1); // Set up media rec card's accessibility label. recommendationCard.setContentDescription( mContext.getString(R.string.controls_media_smartspace_rec_description, appLabel)); @@ -567,7 +567,8 @@ public class MediaControlPanel { ConstraintSet collapsedSet = mMediaViewController.getCollapsedLayout(); int mediaRecommendationNum = Math.min(mediaRecommendationList.size(), MEDIA_RECOMMENDATION_MAX_NUM); - for (int itemIndex = 0, uiComponentIndex = 0; + int uiComponentIndex = 0; + for (int itemIndex = 0; itemIndex < mediaRecommendationNum && uiComponentIndex < mediaRecommendationNum; itemIndex++) { SmartspaceAction recommendation = mediaRecommendationList.get(itemIndex); @@ -582,7 +583,8 @@ public class MediaControlPanel { // Set up the media item's click listener if applicable. ViewGroup mediaCoverContainer = mediaCoverContainers.get(uiComponentIndex); - setSmartspaceRecItemOnClickListener(mediaCoverContainer, recommendation); + setSmartspaceRecItemOnClickListener(mediaCoverContainer, recommendation, + uiComponentIndex); // Set up the accessibility label for the media item. String artistName = recommendation.getExtras() @@ -614,10 +616,10 @@ public class MediaControlPanel { mediaCoverItemsResIds.get(uiComponentIndex), true); setVisibleAndAlpha(expandedSet, mediaCoverContainersResIds.get(uiComponentIndex), true); - uiComponentIndex++; } + mSmartspaceMediaItemsCount = uiComponentIndex; // Set up long press to show guts setting panel. mRecommendationViewHolder.getDismiss().setOnClickListener(v -> { logSmartspaceCardReported(761, // SMARTSPACE_CARD_DISMISS @@ -750,7 +752,8 @@ public class MediaControlPanel { private void setSmartspaceRecItemOnClickListener( @NonNull View view, - @NonNull SmartspaceAction action) { + @NonNull SmartspaceAction action, + int interactedSubcardRank) { if (view == null || action == null || action.getIntent() == null || action.getIntent().getExtras() == null) { Log.e(TAG, "No tap action can be set up"); @@ -758,9 +761,10 @@ public class MediaControlPanel { } view.setOnClickListener(v -> { - // When media recommendation card is shown, it will always be the top card. logSmartspaceCardReported(760, // SMARTSPACE_CARD_CLICK - /* isRecommendationCard */ true); + /* isRecommendationCard */ true, + interactedSubcardRank, + getSmartspaceSubCardCardinality()); if (shouldSmartspaceRecItemOpenInForeground(action)) { // Request to unlock the device if the activity needs to be opened in foreground. @@ -818,9 +822,28 @@ public class MediaControlPanel { } private void logSmartspaceCardReported(int eventId, boolean isRecommendationCard) { + logSmartspaceCardReported(eventId, isRecommendationCard, + /* interactedSubcardRank */ 0, + /* interactedSubcardCardinality */ 0); + } + + private void logSmartspaceCardReported(int eventId, boolean isRecommendationCard, + int interactedSubcardRank, int interactedSubcardCardinality) { mMediaCarouselController.logSmartspaceCardReported(eventId, mInstanceId, + mUid, isRecommendationCard, - getSurfaceForSmartspaceLogging()); + getSurfaceForSmartspaceLogging(), + interactedSubcardRank, + interactedSubcardCardinality); + } + + private int getSmartspaceSubCardCardinality() { + if (!mMediaCarouselController.getMediaCarouselScrollHandler().getQsExpanded() + && mSmartspaceMediaItemsCount > 3) { + return 3; + } + + return mSmartspaceMediaItemsCount; } -} +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/media/PlayerViewHolder.kt b/packages/SystemUI/src/com/android/systemui/media/PlayerViewHolder.kt index 791f59d3ae13..35603b6ef6cc 100644 --- a/packages/SystemUI/src/com/android/systemui/media/PlayerViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/media/PlayerViewHolder.kt @@ -43,7 +43,6 @@ class PlayerViewHolder private constructor(itemView: View) { val seamless = itemView.requireViewById<ViewGroup>(R.id.media_seamless) val seamlessIcon = itemView.requireViewById<ImageView>(R.id.media_seamless_image) val seamlessText = itemView.requireViewById<TextView>(R.id.media_seamless_text) - val seamlessFallback = itemView.requireViewById<ImageView>(R.id.media_seamless_fallback) // Seek bar val seekBar = itemView.requireViewById<SeekBar>(R.id.media_progress_bar) @@ -124,7 +123,6 @@ class PlayerViewHolder private constructor(itemView: View) { R.id.header_title, R.id.header_artist, R.id.media_seamless, - R.id.media_seamless_fallback, R.id.notification_media_progress_time, R.id.media_progress_bar, R.id.action0, diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 4a67e9442510..7de0a1293f8c 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -422,6 +422,12 @@ public class NavigationBar implements View.OnAttachStateChangeListener, new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange, Uri uri) { + // TODO(b/198002034): Content observers currently can still be called back after being + // unregistered, and in this case we can ignore the change if the nav bar has been + // destroyed already + if (mNavigationBarView == null) { + return; + } updateAssistantEntrypoints(); } }; @@ -648,7 +654,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, if (mIsOnDefaultDisplay) { final RotationButtonController rotationButtonController = mNavigationBarView.getRotationButtonController(); - rotationButtonController.addRotationCallback(mRotationWatcher); + rotationButtonController.setRotationCallback(mRotationWatcher); // Reset user rotation pref to match that of the WindowManager if starting in locked // mode. This will automatically happen when switching from auto-rotate to locked mode. @@ -687,6 +693,9 @@ public class NavigationBar implements View.OnAttachStateChangeListener, @Override public void onViewDetachedFromWindow(View v) { + final RotationButtonController rotationButtonController = + mNavigationBarView.getRotationButtonController(); + rotationButtonController.setRotationCallback(null); mNavigationBarView.getBarTransitions().destroy(); mNavigationBarView.getLightTransitionsController().destroy(mContext); mOverviewProxyService.removeCallback(mOverviewProxyListener); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index 0f888cbd14a8..2de40262f42d 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -279,7 +279,7 @@ public class NavigationBarView extends FrameLayout implements new RotationButtonUpdatesCallback() { @Override public void onVisibilityChanged(boolean visible) { - if (visible) { + if (visible && mAutoHideController != null) { // If the button will actually become visible and the navbar is about // to hide, tell the statusbar to keep it around for longer mAutoHideController.touchAutoHide(); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java index 196625b3630e..0f5c03a2a596 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/RotationButtonController.java @@ -183,7 +183,7 @@ public class RotationButtonController { TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mTaskStackListener); } - void addRotationCallback(Consumer<Integer> watcher) { + void setRotationCallback(Consumer<Integer> watcher) { mRotWatcherListener = watcher; } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index e0caf125084a..3167070e2c3e 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -18,20 +18,27 @@ package com.android.systemui.navigationbar; import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; +import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; +import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_CLICKABLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BACK_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED; +import android.app.StatusBarManager; +import android.app.StatusBarManager.WindowVisibleState; import android.content.Context; import android.inputmethodservice.InputMethodService; import android.os.IBinder; import android.view.InsetsVisibilities; import android.view.View; +import android.view.WindowInsetsController.Behavior; import com.android.internal.view.AppearanceRegion; import com.android.systemui.Dependency; @@ -60,6 +67,8 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private final NavigationBarA11yHelper.NavA11yEventListener mNavA11yEventListener = this::updateSysuiFlags; private int mDisabledFlags; + private @WindowVisibleState int mTaskBarWindowState = WINDOW_STATE_SHOWING; + private @Behavior int mBehavior; @Inject public TaskbarDelegate(Context context) { @@ -114,6 +123,9 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, (mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0) .setFlag(SYSUI_STATE_BACK_DISABLED, (mDisabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0) + .setFlag(SYSUI_STATE_NAV_BAR_HIDDEN, !isWindowVisible()) + .setFlag(SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY, + allowSystemGestureIgnoringBarVisibility()) .commitUpdate(mDisplayId); } @@ -130,6 +142,16 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, } @Override + public void setWindowState(int displayId, int window, int state) { + if (displayId == mDisplayId + && window == StatusBarManager.WINDOW_NAVIGATION_BAR + && mTaskBarWindowState != state) { + mTaskBarWindowState = state; + updateSysuiFlags(); + } + } + + @Override public void onRotationProposal(int rotation, boolean isValid) { mOverviewProxyService.onRotationProposal(rotation, isValid); } @@ -146,6 +168,10 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, int behavior, InsetsVisibilities requestedVisibilities, String packageName) { mOverviewProxyService.onSystemBarAttributesChanged(displayId, behavior); + if (mBehavior != behavior) { + mBehavior = behavior; + updateSysuiFlags(); + } } @Override @@ -161,4 +187,12 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, public void onNavigationModeChanged(int mode) { mEdgeBackGestureHandler.onNavigationModeChanged(mode); } + + private boolean isWindowVisible() { + return mTaskBarWindowState == WINDOW_STATE_SHOWING; + } + + private boolean allowSystemGestureIgnoringBarVisibility() { + return mBehavior != BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; + } } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java index aaa3bf0f40ee..bf1a98fa39e6 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java @@ -384,7 +384,7 @@ public class EdgeBackGestureHandler extends CurrentUserTracker private void onNavigationSettingsChanged() { boolean wasBackAllowed = isHandlingGestures(); updateCurrentUserResources(); - if (wasBackAllowed != isHandlingGestures()) { + if (mStateChangeCallback != null && wasBackAllowed != isHandlingGestures()) { mStateChangeCallback.run(); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index a85800bfa76e..7eedb3a91c82 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -140,6 +140,10 @@ public class QuickStatusBarHeader extends FrameLayout { mBatteryRemainingIcon = findViewById(R.id.batteryRemainingIcon); updateResources(); + Configuration config = mContext.getResources().getConfiguration(); + setDatePrivacyContainersWidth(config.orientation == Configuration.ORIENTATION_LANDSCAPE); + setSecurityHeaderContainerVisibility( + config.orientation == Configuration.ORIENTATION_LANDSCAPE); // QS will always show the estimate, and BatteryMeterView handles the case where // it's unavailable or charging @@ -189,6 +193,8 @@ public class QuickStatusBarHeader extends FrameLayout { super.onConfigurationChanged(newConfig); updateResources(); setDatePrivacyContainersWidth(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE); + setSecurityHeaderContainerVisibility( + newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE); } @Override @@ -209,6 +215,10 @@ public class QuickStatusBarHeader extends FrameLayout { mPrivacyContainer.setLayoutParams(lp); } + private void setSecurityHeaderContainerVisibility(boolean landscape) { + mSecurityHeaderView.setVisibility(landscape ? VISIBLE : GONE); + } + private void updateBatteryMode() { if (mConfigShowBatteryEstimate && !mHasCenterCutout) { mBatteryRemainingIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java index 4d0cbd15a788..52bf2df53fb0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java @@ -486,8 +486,7 @@ public class InternetDialog extends SystemUIDialog implements } private void showTurnOffMobileDialog() { - CharSequence carrierName = - mSubscriptionManager.getDefaultDataSubscriptionInfo().getCarrierName(); + CharSequence carrierName = getMobileNetworkTitle(); boolean isInService = mInternetDialogController.isVoiceStateInService(); if (TextUtils.isEmpty(carrierName) || !isInService) { carrierName = mContext.getString(R.string.mobile_data_disable_message_default_carrier); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java index dfe78de81f7f..62fa3d4ac819 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java @@ -391,7 +391,8 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, level += 1; numLevels += 1; } - return getSignalStrengthIcon(mContext, level, numLevels, NO_CELL_DATA_TYPE_ICON, false); + return getSignalStrengthIcon(mContext, level, numLevels, NO_CELL_DATA_TYPE_ICON, + !isMobileDataEnabled()); } Drawable getSignalStrengthIcon(Context context, int level, int numLevels, diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 50b1186c91f1..4584b6db9340 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -547,7 +547,7 @@ public class OverviewProxyService extends CurrentUserTracker implements com.android.internal.R.string.config_recentsComponentName)); mQuickStepIntent = new Intent(ACTION_QUICKSTEP) .setPackage(mRecentsComponentName.getPackageName()); - mWindowCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(mContext.getResources()); + mWindowCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(mContext); mSupportsRoundedCornersOnWindows = ScreenDecorationsUtils .supportsRoundedCornersOnWindows(mContext.getResources()); mSysUiState = sysUiState; diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java index 3fbdc23f55d0..8def475c192c 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java @@ -33,6 +33,7 @@ import static java.util.Objects.requireNonNull; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.annotation.MainThread; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityOptions; @@ -261,6 +262,7 @@ public class ScreenshotController { private Bitmap mScreenBitmap; private SaveImageInBackgroundTask mSaveInBgTask; private boolean mScreenshotTakenInPortrait; + private boolean mBlockAttach; private Animator mScreenshotAnimation; private RequestCallback mCurrentRequestCallback; @@ -731,6 +733,7 @@ public class ScreenshotController { new ViewTreeObserver.OnWindowAttachListener() { @Override public void onWindowAttached() { + mBlockAttach = false; decorView.getViewTreeObserver().removeOnWindowAttachListener(this); action.run(); } @@ -747,14 +750,16 @@ public class ScreenshotController { mWindow.setContentView(contentView); } + @MainThread private void attachWindow() { View decorView = mWindow.getDecorView(); - if (decorView.isAttachedToWindow()) { + if (decorView.isAttachedToWindow() || mBlockAttach) { return; } if (DEBUG_WINDOW) { Log.d(TAG, "attachWindow"); } + mBlockAttach = true; mWindowManager.addView(decorView, mWindowLayoutParams); decorView.requestApplyInsets(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 90158c32c099..aba1a249d349 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -291,8 +291,8 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< default void showAuthenticationDialog(PromptInfo promptInfo, IBiometricSysuiReceiver receiver, int[] sensorIds, boolean credentialAllowed, - boolean requireConfirmation, int userId, String opPackageName, - long operationId, @BiometricMultiSensorMode int multiSensorConfig) { + boolean requireConfirmation, int userId, long operationId, String opPackageName, + long requestId, @BiometricMultiSensorMode int multiSensorConfig) { } /** @see IStatusBar#onBiometricAuthenticated() */ @@ -845,7 +845,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< @Override public void showAuthenticationDialog(PromptInfo promptInfo, IBiometricSysuiReceiver receiver, int[] sensorIds, boolean credentialAllowed, boolean requireConfirmation, - int userId, String opPackageName, long operationId, + int userId, long operationId, String opPackageName, long requestId, @BiometricMultiSensorMode int multiSensorConfig) { synchronized (mLock) { SomeArgs args = SomeArgs.obtain(); @@ -857,6 +857,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< args.argi1 = userId; args.arg6 = opPackageName; args.arg7 = operationId; + args.arg8 = requestId; args.argi2 = multiSensorConfig; mHandler.obtainMessage(MSG_BIOMETRIC_SHOW, args) .sendToTarget(); @@ -1315,8 +1316,9 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< (boolean) someArgs.arg4 /* credentialAllowed */, (boolean) someArgs.arg5 /* requireConfirmation */, someArgs.argi1 /* userId */, - (String) someArgs.arg6 /* opPackageName */, (long) someArgs.arg7 /* operationId */, + (String) someArgs.arg6 /* opPackageName */, + (long) someArgs.arg8 /* requestId */, someArgs.argi2 /* multiSensorConfig */); } someArgs.recycle(); 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 4e1e61dc030a..51d531ba5672 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -902,7 +902,8 @@ public class NotificationPanelViewController extends PanelViewController { R.dimen.pulse_expansion_max_top_overshoot); mScrimCornerRadius = mResources.getDimensionPixelSize( R.dimen.notification_scrim_corner_radius); - mScreenCornerRadius = (int) ScreenDecorationsUtils.getWindowCornerRadius(mResources); + mScreenCornerRadius = (int) ScreenDecorationsUtils.getWindowCornerRadius( + mView.getContext()); mLockscreenNotificationQSPadding = mResources.getDimensionPixelSize( R.dimen.notification_side_paddings); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java index 20b66f03192e..cd8894cae684 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java @@ -103,7 +103,7 @@ public class KeyguardUserSwitcherListView extends AlphaOptimizedLinearLayout { } } - if (animate) { + if (animate && userItemViews.length > 1) { // AnimationUtils will immediately hide/show the first item in the array. Since the // first view is the current user, we want to manage its visibility separately. // Set first item to null so AnimationUtils ignores it. diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java index c3b4fbe9a13d..fe0b97056024 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java @@ -132,14 +132,18 @@ public class ThemeOverlayApplier implements Dumpable { /* Target package for each overlay category. */ private final Map<String, String> mCategoryToTargetPackage = new ArrayMap<>(); private final OverlayManager mOverlayManager; - private final Executor mExecutor; + private final Executor mBgExecutor; + private final Executor mMainExecutor; private final String mLauncherPackage; private final String mThemePickerPackage; - public ThemeOverlayApplier(OverlayManager overlayManager, Executor executor, + public ThemeOverlayApplier(OverlayManager overlayManager, + Executor bgExecutor, + Executor mainExecutor, String launcherPackage, String themePickerPackage, DumpManager dumpManager) { mOverlayManager = overlayManager; - mExecutor = executor; + mBgExecutor = bgExecutor; + mMainExecutor = mainExecutor; mLauncherPackage = launcherPackage; mThemePickerPackage = themePickerPackage; mTargetPackageToCategories.put(ANDROID_PACKAGE, Sets.newHashSet( @@ -170,12 +174,13 @@ public class ThemeOverlayApplier implements Dumpable { * Apply the set of overlay packages to the set of {@code UserHandle}s provided. Overlays that * affect sysui will also be applied to the system user. */ - void applyCurrentUserOverlays( + public void applyCurrentUserOverlays( Map<String, OverlayIdentifier> categoryToPackage, FabricatedOverlay[] pendingCreation, int currentUser, - Set<UserHandle> managedProfiles) { - mExecutor.execute(() -> { + Set<UserHandle> managedProfiles, + Runnable onOverlaysApplied) { + mBgExecutor.execute(() -> { // Disable all overlays that have not been specified in the user setting. final Set<String> overlayCategoriesToDisable = new HashSet<>(THEME_CATEGORIES); @@ -221,6 +226,7 @@ public class ThemeOverlayApplier implements Dumpable { try { mOverlayManager.commit(transaction.build()); + mMainExecutor.execute(onOverlaysApplied); } catch (SecurityException | IllegalStateException e) { Log.e(TAG, "setEnabled failed", e); } diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java index a53d528ac78c..0130cb2f8cd3 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java @@ -521,16 +521,16 @@ public class ThemeOverlayController extends SystemUI implements Dumpable { .map(key -> key + " -> " + categoryToPackage.get(key)).collect( Collectors.joining(", "))); } + Runnable overlaysAppliedRunnable = () -> onOverlaysApplied(); if (mNeedsOverlayCreation) { mNeedsOverlayCreation = false; mThemeManager.applyCurrentUserOverlays(categoryToPackage, new FabricatedOverlay[] { mSecondaryOverlay, mNeutralOverlay - }, currentUser, managedProfiles); + }, currentUser, managedProfiles, overlaysAppliedRunnable); } else { mThemeManager.applyCurrentUserOverlays(categoryToPackage, null, currentUser, - managedProfiles); + managedProfiles, overlaysAppliedRunnable); } - onOverlaysApplied(); } protected void onOverlaysApplied() { diff --git a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt index 9283403edd1a..3c3cc64a49cd 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldLightRevealOverlayAnimation.kt @@ -58,6 +58,10 @@ class UnfoldLightRevealOverlayAnimation @Inject constructor( } override fun onTransitionStarted() { + // When unfolding the view is added earlier, add view for folding case + if (scrimView == null) { + addOverlayView() + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java index ed5cbe20aa11..afbd2f2929aa 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java @@ -43,6 +43,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.res.Configuration; +import android.content.res.TypedArray; import android.graphics.Insets; import android.graphics.Point; import android.graphics.Rect; @@ -60,7 +61,6 @@ import android.view.WindowMetrics; import androidx.test.filters.SmallTest; -import com.android.systemui.R.dimen; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.events.PrivacyDotViewController; @@ -100,6 +100,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { private UserTracker mUserTracker; @Mock private PrivacyDotViewController mDotViewController; + @Mock + private TypedArray mMockTypedArray; @Before public void setup() { @@ -121,6 +123,7 @@ public class ScreenDecorationsTest extends SysuiTestCase { .getDisplay(DEFAULT_DISPLAY); when(mDisplayManager.getDisplay(anyInt())).thenReturn(display); mContext.addMockSystemService(DisplayManager.class, mDisplayManager); + when(mMockTypedArray.length()).thenReturn(0); mScreenDecorations = spy(new ScreenDecorations(mContext, mExecutor, mSecureSettings, mBroadcastDispatcher, mTunerService, mUserTracker, mDotViewController, @@ -148,18 +151,9 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Test public void testNoRounding_NoCutout() { - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_top, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); - mContext.getOrCreateTestableResources() - .addOverride(dimen.rounded_corner_content_padding, 0); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 0 /* roundedPadding */, false /* multipleRadius */, + false /* fillCutout */); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); @@ -173,14 +167,9 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Test public void testRounding_NoCutout() { - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 20); - mContext.getOrCreateTestableResources() - .addOverride(dimen.rounded_corner_content_padding, 20); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 20 /* roundedPadding */, false /* multipleRadius */, + false /* fillCutout */); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); @@ -203,19 +192,10 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Test public void testRoundingRadius_NoCutout() { - final int testRadius = 1; final Point testRadiusPoint = new Point(1, 1); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, testRadius); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_top, testRadius); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_bottom, testRadius); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); - + setupResources(1 /* radius */, 1 /* radiusTop */, 1 /* radiusBottom */, + 0 /* roundedPadding */, false /* multipleRadius */, + false /* fillCutout */); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); @@ -230,16 +210,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { public void testRoundingTopBottomRadius_OnTopBottomOverlay() { final int testTopRadius = 1; final int testBottomRadius = 5; - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, testTopRadius); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_top, testTopRadius); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_bottom, testBottomRadius); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(testTopRadius, testTopRadius, testBottomRadius, 0 /* roundedPadding */, + false /* multipleRadius */, false /* fillCutout */); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); @@ -267,16 +239,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { public void testRoundingTopBottomRadius_OnLeftRightOverlay() { final int testTopRadius = 1; final int testBottomRadius = 5; - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, testTopRadius); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_top, testTopRadius); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_bottom, testBottomRadius); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(testTopRadius, testTopRadius, testBottomRadius, 0 /* roundedPadding */, + false /* multipleRadius */, false /* fillCutout */); // left cutout doReturn(new DisplayCutout( @@ -310,15 +274,9 @@ public class ScreenDecorationsTest extends SysuiTestCase { public void testRoundingMultipleRadius_NoCutout() { final VectorDrawable d = (VectorDrawable) mContext.getDrawable(R.drawable.rounded); final Point multipleRadiusSize = new Point(d.getIntrinsicWidth(), d.getIntrinsicHeight()); - - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 9999); - mContext.getOrCreateTestableResources() - .addOverride(dimen.rounded_corner_content_padding, 9999); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, true); + setupResources(9999 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 9999 /* roundedPadding */, true /* multipleRadius */, + false /* fillCutout */); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); @@ -345,27 +303,18 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Test public void testNoRounding_CutoutShortEdge() { - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, true); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_top, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); - mContext.getOrCreateTestableResources() - .addOverride(dimen.rounded_corner_content_padding, 0); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 0 /* roundedPadding */, false /* multipleRadius */, + true /* fillCutout */); // top cutout doReturn(new DisplayCutout( - Insets.of(0, 10, 0, 0), - ZERO_RECT, - new Rect(9, 0, 10, 1), - ZERO_RECT, - ZERO_RECT, - Insets.NONE)).when(mScreenDecorations).getCutout(); + Insets.of(0, 10, 0, 0), + ZERO_RECT, + new Rect(9, 0, 10, 1), + ZERO_RECT, + ZERO_RECT, + Insets.NONE)).when(mScreenDecorations).getCutout(); mScreenDecorations.start(); // Top window is created for top cutout. @@ -381,18 +330,9 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Test public void testNoRounding_CutoutLongEdge() { - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, true); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_top, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); - mContext.getOrCreateTestableResources() - .addOverride(dimen.rounded_corner_content_padding, 0); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 0 /* roundedPadding */, false /* multipleRadius */, + true /* fillCutout */); // left cutout doReturn(new DisplayCutout( @@ -417,14 +357,9 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Test public void testRounding_CutoutShortEdge() { - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, true); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 20); - mContext.getOrCreateTestableResources() - .addOverride(dimen.rounded_corner_content_padding, 20); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 20 /* roundedPadding */, false /* multipleRadius */, + true /* fillCutout */); // top cutout doReturn(new DisplayCutout( @@ -450,14 +385,9 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Test public void testRounding_CutoutLongEdge() { - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, true); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 20); - mContext.getOrCreateTestableResources() - .addOverride(dimen.rounded_corner_content_padding, 20); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 20 /* roundedPadding */, false /* multipleRadius */, + true /* fillCutout */); // left cutout doReturn(new DisplayCutout( @@ -483,14 +413,9 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Test public void testRounding_CutoutShortAndLongEdge() { - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, true); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 20); - mContext.getOrCreateTestableResources() - .addOverride(dimen.rounded_corner_content_padding, 20); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 20 /* roundedPadding */, false /* multipleRadius */, + true /* fillCutout */); // top and left cutout doReturn(new DisplayCutout( @@ -517,18 +442,9 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Test public void testNoRounding_SwitchFrom_ShortEdgeCutout_To_LongCutout() { - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, true); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_top, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); - mContext.getOrCreateTestableResources() - .addOverride(dimen.rounded_corner_content_padding, 0); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 0 /* roundedPadding */, false /* multipleRadius */, + true /* fillCutout */); // Set to short edge cutout(top). doReturn(new DisplayCutout( @@ -566,18 +482,9 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Test public void testDelayedCutout() { - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_top, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); - mContext.getOrCreateTestableResources() - .addOverride(dimen.rounded_corner_content_padding, 0); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 0 /* roundedPadding */, false /* multipleRadius */, + false /* fillCutout */); // top cutout doReturn(new DisplayCutout( @@ -591,8 +498,9 @@ public class ScreenDecorationsTest extends SysuiTestCase { mScreenDecorations.start(); assertNull(mScreenDecorations.mOverlays); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, true); + when(mContext.getResources().getBoolean( + com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout)) + .thenReturn(true); mScreenDecorations.onConfigurationChanged(new Configuration()); // Only top windows should be added. @@ -612,34 +520,24 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Test public void testUpdateRoundedCorners() { - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 20); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 0 /* roundedPadding */, false /* multipleRadius */, + false /* fillCutout */); mScreenDecorations.start(); assertEquals(mScreenDecorations.mRoundedDefault, new Point(20, 20)); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 5); + when(mContext.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.rounded_corner_radius)).thenReturn(5); mScreenDecorations.onConfigurationChanged(null); assertEquals(mScreenDecorations.mRoundedDefault, new Point(5, 5)); } @Test public void testOnlyRoundedCornerRadiusTop() { - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_top, 10); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(0 /* radius */, 10 /* radiusTop */, 0 /* radiusBottom */, + 0 /* roundedPadding */, false /* multipleRadius */, + false /* fillCutout */); mScreenDecorations.start(); assertEquals(new Point(0, 0), mScreenDecorations.mRoundedDefault); @@ -649,16 +547,9 @@ public class ScreenDecorationsTest extends SysuiTestCase { @Test public void testOnlyRoundedCornerRadiusBottom() { - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_top, 0); - mContext.getOrCreateTestableResources().addOverride( - com.android.internal.R.dimen.rounded_corner_radius_bottom, 20); - mContext.getOrCreateTestableResources() - .addOverride(R.bool.config_roundedCornerMultipleRadius, false); + setupResources(0 /* radius */, 0 /* radiusTop */, 20 /* radiusBottom */, + 0 /* roundedPadding */, false /* multipleRadius */, + false /* fillCutout */); mScreenDecorations.start(); assertEquals(new Point(0, 0), mScreenDecorations.mRoundedDefault); @@ -721,4 +612,44 @@ public class ScreenDecorationsTest extends SysuiTestCase { verify(mTunerService, times(1)).removeTunable(any()); assertThat(mScreenDecorations.mIsRegistered, is(false)); } + + private void setupResources(int radius, int radiusTop, int radiusBottom, int roundedPadding, + boolean multipleRadius, boolean fillCutout) { + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.array.config_displayUniqueIdArray, + new String[]{}); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.array.config_roundedCornerRadiusArray, + mMockTypedArray); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.array.config_roundedCornerTopRadiusArray, + mMockTypedArray); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.array.config_roundedCornerBottomRadiusArray, + mMockTypedArray); + mContext.getOrCreateTestableResources().addOverride( + R.array.config_roundedCornerDrawableArray, + mMockTypedArray); + mContext.getOrCreateTestableResources().addOverride( + R.array.config_roundedCornerTopDrawableArray, + mMockTypedArray); + mContext.getOrCreateTestableResources().addOverride( + R.array.config_roundedCornerBottomDrawableArray, + mMockTypedArray); + mContext.getOrCreateTestableResources().addOverride( + R.array.config_roundedCornerMultipleRadiusArray, + mMockTypedArray); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.dimen.rounded_corner_radius, radius); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.dimen.rounded_corner_radius_top, radiusTop); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.dimen.rounded_corner_radius_bottom, radiusBottom); + mContext.getOrCreateTestableResources().addOverride( + R.dimen.rounded_corner_content_padding, roundedPadding); + mContext.getOrCreateTestableResources().addOverride( + R.bool.config_roundedCornerMultipleRadius, multipleRadius); + mContext.getOrCreateTestableResources().addOverride( + com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, fillCutout); + } } 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 323b5fe4636f..3291a7c24867 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java @@ -171,6 +171,29 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { } @Test + public void enableWindowMagnification_LargeScreen_windowSizeIsConstrained() { + final int screenSize = mContext.getResources().getDimensionPixelSize( + R.dimen.magnification_max_frame_size) * 10; + mWindowManager.setWindowBounds(new Rect(0, 0, screenSize, screenSize)); + //We need to initialize new one because the window size is determined when initialization. + final WindowMagnificationController controller = new WindowMagnificationController(mContext, + mHandler, mSfVsyncFrameProvider, + mMirrorWindowControl, mTransaction, mWindowMagnifierCallback, mSysUiState); + + mInstrumentation.runOnMainSync(() -> { + controller.enableWindowMagnification(Float.NaN, Float.NaN, + Float.NaN); + }); + + final int halfScreenSize = screenSize / 2; + WindowManager.LayoutParams params = mWindowManager.getLayoutParamsFromAttachedView(); + // The frame size should be the half of smaller value of window height/width unless it + //exceed the max frame size. + assertTrue(params.width < halfScreenSize); + assertTrue(params.height < halfScreenSize); + } + + @Test public void deleteWindowMagnification_destroyControl() { mInstrumentation.runOnMainSync(() -> { mWindowMagnificationController.enableWindowMagnification(Float.NaN, Float.NaN, @@ -318,6 +341,27 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { mWindowMagnificationController.getCenterY() / testWindowBounds.height(), 0); } + @Test + public void screenSizeIsChangedToLarge_enabled_windowSizeIsConstrained() { + mInstrumentation.runOnMainSync(() -> { + mWindowMagnificationController.enableWindowMagnification(Float.NaN, Float.NaN, + Float.NaN); + }); + final int screenSize = mContext.getResources().getDimensionPixelSize( + R.dimen.magnification_max_frame_size) * 10; + mWindowManager.setWindowBounds(new Rect(0, 0, screenSize, screenSize)); + + mInstrumentation.runOnMainSync(() -> { + mWindowMagnificationController.onConfigurationChanged(ActivityInfo.CONFIG_SCREEN_SIZE); + }); + + final int halfScreenSize = screenSize / 2; + WindowManager.LayoutParams params = mWindowManager.getLayoutParamsFromAttachedView(); + // The frame size should be the half of smaller value of window height/width unless it + //exceed the max frame size. + assertTrue(params.width < halfScreenSize); + assertTrue(params.height < halfScreenSize); + } @Test public void onDensityChanged_enabled_updateDimensionsAndResetWindowMagnification() { 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 39d5314107ee..8dd5d6c01394 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java @@ -565,8 +565,9 @@ public class AuthControllerTest extends SysuiTestCase { credentialAllowed, true /* requireConfirmation */, 0 /* userId */, - "testPackage", 0 /* operationId */, + "testPackage", + 1 /* requestId */, BIOMETRIC_MULTI_SENSOR_FACE_THEN_FINGERPRINT); } @@ -612,7 +613,7 @@ public class AuthControllerTest extends SysuiTestCase { @Override protected AuthDialog buildDialog(PromptInfo promptInfo, boolean requireConfirmation, int userId, int[] sensorIds, boolean credentialAllowed, - String opPackageName, boolean skipIntro, long operationId, + String opPackageName, boolean skipIntro, long operationId, long requestId, @BiometricManager.BiometricMultiSensorMode int multiSensorConfig) { mLastBiometricPromptInfo = promptInfo; 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 b129fdd0d844..42629f545559 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt @@ -37,6 +37,7 @@ import android.widget.TextView import androidx.constraintlayout.widget.ConstraintSet import androidx.lifecycle.LiveData import androidx.test.filters.SmallTest +import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.media.dialog.MediaOutputDialogFactory import com.android.systemui.plugins.ActivityStarter @@ -101,7 +102,6 @@ public class MediaControlPanelTest : SysuiTestCase() { private lateinit var seamless: ViewGroup private lateinit var seamlessIcon: ImageView private lateinit var seamlessText: TextView - private lateinit var seamlessFallback: ImageView private lateinit var seekBar: SeekBar private lateinit var elapsedTimeView: TextView private lateinit var totalTimeView: TextView @@ -154,8 +154,6 @@ public class MediaControlPanelTest : SysuiTestCase() { whenever(holder.seamlessIcon).thenReturn(seamlessIcon) seamlessText = TextView(context) whenever(holder.seamlessText).thenReturn(seamlessText) - seamlessFallback = ImageView(context) - whenever(holder.seamlessFallback).thenReturn(seamlessFallback) seekBar = SeekBar(context) whenever(holder.seekBar).thenReturn(seekBar) elapsedTimeView = TextView(context) @@ -239,21 +237,19 @@ public class MediaControlPanelTest : SysuiTestCase() { @Test fun bindDisabledDevice() { seamless.id = 1 - seamlessFallback.id = 2 + val fallbackString = context.getString(R.string.media_seamless_other_device) player.attachPlayer(holder) val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(), emptyList(), PACKAGE, session.getSessionToken(), null, disabledDevice, true, null) player.bindPlayer(state, PACKAGE) - verify(expandedSet).setVisibility(seamless.id, View.GONE) - verify(expandedSet).setVisibility(seamlessFallback.id, View.VISIBLE) - verify(collapsedSet).setVisibility(seamless.id, View.GONE) - verify(collapsedSet).setVisibility(seamlessFallback.id, View.VISIBLE) + assertThat(seamless.isEnabled()).isFalse() + assertThat(seamlessText.getText()).isEqualTo(fallbackString) + assertThat(seamless.contentDescription).isEqualTo(fallbackString) } @Test fun bindNullDevice() { - val fallbackString = context.getResources().getString( - com.android.internal.R.string.ext_media_seamless_action) + val fallbackString = context.getResources().getString(R.string.media_seamless_other_device) player.attachPlayer(holder) val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(), emptyList(), PACKAGE, session.getSessionToken(), null, null, true, null) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index be7917a30fc3..2416132d8b83 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -425,17 +425,18 @@ public class CommandQueueTest extends SysuiTestCase { final boolean credentialAllowed = true; final boolean requireConfirmation = true; final int userId = 10; - final String packageName = "test"; final long operationId = 1; + final String packageName = "test"; + final long requestId = 10; final int multiSensorConfig = BiometricManager.BIOMETRIC_MULTI_SENSOR_DEFAULT; mCommandQueue.showAuthenticationDialog(promptInfo, receiver, sensorIds, - credentialAllowed, requireConfirmation , userId, packageName, operationId, + credentialAllowed, requireConfirmation, userId, operationId, packageName, requestId, multiSensorConfig); waitForIdleSync(); verify(mCallbacks).showAuthenticationDialog(eq(promptInfo), eq(receiver), eq(sensorIds), - eq(credentialAllowed), eq(requireConfirmation), eq(userId), eq(packageName), - eq(operationId), eq(multiSensorConfig)); + eq(credentialAllowed), eq(requireConfirmation), eq(userId), eq(operationId), + eq(packageName), eq(requestId), eq(multiSensorConfig)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayApplierTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayApplierTest.java index 9c47f19b20c8..e6dc4db34f91 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayApplierTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayApplierTest.java @@ -96,6 +96,8 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { DumpManager mDumpManager; @Mock OverlayManagerTransaction.Builder mTransactionBuilder; + @Mock + Runnable mOnOverlaysApplied; private ThemeOverlayApplier mManager; private boolean mGetOverlayInfoEnabled = true; @@ -103,7 +105,8 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { @Before public void setup() throws Exception { MockitoAnnotations.initMocks(this); - mManager = new ThemeOverlayApplier(mOverlayManager, MoreExecutors.directExecutor(), + mManager = new ThemeOverlayApplier(mOverlayManager, + MoreExecutors.directExecutor(), MoreExecutors.directExecutor(), LAUNCHER_PACKAGE, THEMEPICKER_PACKAGE, mDumpManager) { @Override protected OverlayManagerTransaction.Builder getTransactionBuilder() { @@ -173,7 +176,7 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { @Test public void allCategoriesSpecified_allEnabledExclusively() { mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, null, TEST_USER.getIdentifier(), - TEST_USER_HANDLES); + TEST_USER_HANDLES, mOnOverlaysApplied); verify(mOverlayManager).commit(any()); for (OverlayIdentifier overlayPackage : ALL_CATEGORIES_MAP.values()) { @@ -185,7 +188,7 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { @Test public void allCategoriesSpecified_sysuiCategoriesAlsoAppliedToSysuiUser() { mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, null, TEST_USER.getIdentifier(), - TEST_USER_HANDLES); + TEST_USER_HANDLES, mOnOverlaysApplied); for (Map.Entry<String, OverlayIdentifier> entry : ALL_CATEGORIES_MAP.entrySet()) { if (SYSTEM_USER_CATEGORIES.contains(entry.getKey())) { @@ -202,8 +205,9 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { public void allCategoriesSpecified_enabledForAllUserHandles() { Set<UserHandle> userHandles = Sets.newHashSet(TEST_USER_HANDLES); mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, null, TEST_USER.getIdentifier(), - userHandles); + userHandles, mOnOverlaysApplied); + verify(mOnOverlaysApplied).run(); for (OverlayIdentifier overlayPackage : ALL_CATEGORIES_MAP.values()) { verify(mTransactionBuilder).setEnabled(eq(overlayPackage), eq(true), eq(TEST_USER.getIdentifier())); @@ -219,7 +223,7 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { Set<UserHandle> userHandles = Sets.newHashSet(TEST_USER_HANDLES); mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, null, TEST_USER.getIdentifier(), - userHandles); + userHandles, mOnOverlaysApplied); for (OverlayIdentifier overlayPackage : ALL_CATEGORIES_MAP.values()) { verify(mTransactionBuilder, never()).setEnabled(eq(overlayPackage), eq(true), @@ -233,7 +237,7 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { mock(FabricatedOverlay.class) }; mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, pendingCreation, - TEST_USER.getIdentifier(), TEST_USER_HANDLES); + TEST_USER.getIdentifier(), TEST_USER_HANDLES, mOnOverlaysApplied); for (FabricatedOverlay overlay : pendingCreation) { verify(mTransactionBuilder).registerFabricatedOverlay(eq(overlay)); @@ -247,7 +251,7 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { categoryToPackage.remove(OVERLAY_CATEGORY_ICON_ANDROID); mManager.applyCurrentUserOverlays(categoryToPackage, null, TEST_USER.getIdentifier(), - TEST_USER_HANDLES); + TEST_USER_HANDLES, mOnOverlaysApplied); for (OverlayIdentifier overlayPackage : categoryToPackage.values()) { verify(mTransactionBuilder).setEnabled(eq(overlayPackage), eq(true), @@ -264,7 +268,7 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { @Test public void zeroCategoriesSpecified_allDisabled() { mManager.applyCurrentUserOverlays(Maps.newArrayMap(), null, TEST_USER.getIdentifier(), - TEST_USER_HANDLES); + TEST_USER_HANDLES, mOnOverlaysApplied); for (String category : THEME_CATEGORIES) { verify(mTransactionBuilder).setEnabled( @@ -279,7 +283,7 @@ public class ThemeOverlayApplierTest extends SysuiTestCase { categoryToPackage.put("blah.category", new OverlayIdentifier("com.example.blah.category")); mManager.applyCurrentUserOverlays(categoryToPackage, null, TEST_USER.getIdentifier(), - TEST_USER_HANDLES); + TEST_USER_HANDLES, mOnOverlaysApplied); verify(mTransactionBuilder, never()).setEnabled( eq(new OverlayIdentifier("com.example.blah.category")), eq(false), 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 f6a549363955..cd911cc533f7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java @@ -161,7 +161,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { ArgumentCaptor.forClass(Map.class); verify(mThemeOverlayApplier) - .applyCurrentUserOverlays(themeOverlays.capture(), any(), anyInt(), any()); + .applyCurrentUserOverlays(themeOverlays.capture(), any(), anyInt(), any(), any()); // Assert that we received the colors that we were expecting assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_SYSTEM_PALETTE)) @@ -183,7 +183,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { mBroadcastReceiver.getValue().onReceive(null, new Intent(Intent.ACTION_WALLPAPER_CHANGED)); mColorsListener.getValue().onColorsChanged(new WallpaperColors(Color.valueOf(Color.BLACK), null, null), WallpaperManager.FLAG_SYSTEM); - verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any()); + verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -204,7 +204,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { ArgumentCaptor.forClass(Map.class); verify(mThemeOverlayApplier) - .applyCurrentUserOverlays(themeOverlays.capture(), any(), anyInt(), any()); + .applyCurrentUserOverlays(themeOverlays.capture(), any(), anyInt(), any(), any()); // Assert that we received the colors that we were expecting assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_SYSTEM_PALETTE)) @@ -240,7 +240,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { .isFalse(); verify(mThemeOverlayApplier) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -270,7 +270,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { "android.theme.customization.color_both\":\"0")).isTrue(); verify(mThemeOverlayApplier) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -300,7 +300,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { "android.theme.customization.color_both\":\"1")).isTrue(); verify(mThemeOverlayApplier) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -327,7 +327,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { assertThat(updatedSetting.getValue().contains("android.theme.customization.color_index")) .isFalse(); verify(mThemeOverlayApplier) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -354,7 +354,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { assertThat(updatedSetting.getValue().contains("android.theme.customization.color_index")) .isFalse(); verify(mThemeOverlayApplier) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -382,7 +382,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), updatedSetting.capture()); verify(mThemeOverlayApplier) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -411,14 +411,14 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { verify(mThemeOverlayApplier, never()) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test public void onProfileAdded_setsTheme() { mBroadcastReceiver.getValue().onReceive(null, new Intent(Intent.ACTION_MANAGED_PROFILE_ADDED)); - verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any()); + verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -428,7 +428,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { mBroadcastReceiver.getValue().onReceive(null, new Intent(Intent.ACTION_MANAGED_PROFILE_ADDED)); verify(mThemeOverlayApplier) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -438,7 +438,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { mBroadcastReceiver.getValue().onReceive(null, new Intent(Intent.ACTION_MANAGED_PROFILE_ADDED)); verify(mThemeOverlayApplier, never()) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -450,7 +450,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { Color.valueOf(Color.BLUE), null); mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM); - verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any()); + verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); // Regression test: null events should not reset the internal state and allow colors to be // applied again. @@ -458,11 +458,11 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { mBroadcastReceiver.getValue().onReceive(null, new Intent(Intent.ACTION_WALLPAPER_CHANGED)); mColorsListener.getValue().onColorsChanged(null, WallpaperManager.FLAG_SYSTEM); verify(mThemeOverlayApplier, never()).applyCurrentUserOverlays(any(), any(), anyInt(), - any()); + any(), any()); mColorsListener.getValue().onColorsChanged(new WallpaperColors(Color.valueOf(Color.GREEN), null, null), WallpaperManager.FLAG_SYSTEM); verify(mThemeOverlayApplier, never()).applyCurrentUserOverlays(any(), any(), anyInt(), - any()); + any(), any()); } @Test @@ -499,7 +499,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { verify(mDeviceProvisionedController).addCallback(mDeviceProvisionedListener.capture()); // Colors were applied during controller initialization. - verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any()); + verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); clearInvocations(mThemeOverlayApplier); } @@ -533,7 +533,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { verify(mDeviceProvisionedController).addCallback(mDeviceProvisionedListener.capture()); // Colors were applied during controller initialization. - verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any()); + verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); clearInvocations(mThemeOverlayApplier); WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED), @@ -542,12 +542,12 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { // Defers event because we already have initial colors. verify(mThemeOverlayApplier, never()) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); // Then event happens after setup phase is over. when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true); mDeviceProvisionedListener.getValue().onUserSetupChanged(); - verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any()); + verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -568,11 +568,11 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { Color.valueOf(Color.RED), null); mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM); verify(mThemeOverlayApplier, never()) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); mWakefulnessLifecycle.dispatchFinishedGoingToSleep(); verify(mThemeOverlayApplier, never()) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -592,10 +592,10 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { Color.valueOf(Color.RED), null); mColorsListener.getValue().onColorsChanged(mainColors, WallpaperManager.FLAG_SYSTEM); verify(mThemeOverlayApplier, never()) - .applyCurrentUserOverlays(any(), any(), anyInt(), any()); + .applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); mWakefulnessLifecycleObserver.getValue().onFinishedGoingToSleep(); - verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any()); + verify(mThemeOverlayApplier).applyCurrentUserOverlays(any(), any(), anyInt(), any(), any()); } @Test @@ -614,7 +614,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { ArgumentCaptor.forClass(Map.class); verify(mThemeOverlayApplier) - .applyCurrentUserOverlays(themeOverlays.capture(), any(), anyInt(), any()); + .applyCurrentUserOverlays(themeOverlays.capture(), any(), anyInt(), any(), any()); // Assert that we received the colors that we were expecting assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_SYSTEM_PALETTE)) diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index b7c61a0d25cf..dc7904ddf8ec 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -2479,7 +2479,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { try { foregroundUser = ActivityManager.getCurrentUser(); valid = (callingUser == foregroundUser) || parentUser == foregroundUser - || callingAppId == Process.NFC_UID || callingAppId == mSystemUiUid; + || callingAppId == Process.NFC_UID || callingAppId == mSystemUiUid + || callingAppId == Process.SHELL_UID; if (DBG && !valid) { Slog.d(TAG, "checkIfCallerIsForegroundUser: valid=" + valid + " callingUser=" + callingUser + " parentUser=" + parentUser + " foregroundUser=" diff --git a/services/core/java/com/android/server/audio/RotationHelper.java b/services/core/java/com/android/server/audio/RotationHelper.java index ad7216600e61..872b1feb2d72 100644 --- a/services/core/java/com/android/server/audio/RotationHelper.java +++ b/services/core/java/com/android/server/audio/RotationHelper.java @@ -21,20 +21,26 @@ import android.hardware.display.DisplayManager; import android.media.AudioSystem; import android.os.Handler; import android.util.Log; +import android.view.Display; import android.view.Surface; import android.view.WindowManager; /** * Class to handle device rotation events for AudioService, and forward device rotation - * to the audio HALs through AudioSystem. + * and current active ID to the audio HALs through AudioSystem. * * The role of this class is to monitor device orientation changes, and upon rotation, * verify the UI orientation. In case of a change, send the new orientation, in increments * of 90deg, through AudioSystem. * + * Another role of this class is to track current active display ID changes. In case of a + * change, send the new active display ID through AudioSystem. + * * Note that even though we're responding to device orientation events, we always * query the display rotation so audio stays in sync with video/dialogs. This is * done with .getDefaultDisplay().getRotation() from WINDOW_SERVICE. + * + * We also monitor current display ID and audio is able to know which display is active. */ class RotationHelper { @@ -43,7 +49,9 @@ class RotationHelper { private static AudioDisplayListener sDisplayListener; private static final Object sRotationLock = new Object(); + private static final Object sActiveDisplayLock = new Object(); private static int sDeviceRotation = Surface.ROTATION_0; // R/W synchronized on sRotationLock + private static int sDisplayId = Display.DEFAULT_DISPLAY; // synchronized on sActiveDisplayLock private static Context sContext; private static Handler sHandler; @@ -112,6 +120,18 @@ class RotationHelper { } /** + * Query current display active id and publish the change if any. + */ + static void updateActiveDisplayId(int displayId) { + synchronized (sActiveDisplayLock) { + if (displayId != Display.DEFAULT_DISPLAY && sDisplayId != displayId) { + sDisplayId = displayId; + AudioSystem.setParameters("active_displayId=" + sDisplayId); + } + } + } + + /** * Uses android.hardware.display.DisplayManager.DisplayListener */ final static class AudioDisplayListener implements DisplayManager.DisplayListener { @@ -126,6 +146,7 @@ class RotationHelper { @Override public void onDisplayChanged(int displayId) { + updateActiveDisplayId(displayId); updateOrientation(); } } diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java index 0cd2e3d0ff59..b42f8980d1c0 100644 --- a/services/core/java/com/android/server/biometrics/AuthService.java +++ b/services/core/java/com/android/server/biometrics/AuthService.java @@ -206,7 +206,7 @@ public class AuthService extends SystemService { } @Override - public void authenticate(IBinder token, long sessionId, int userId, + public long authenticate(IBinder token, long sessionId, int userId, IBiometricServiceReceiver receiver, String opPackageName, PromptInfo promptInfo) throws RemoteException { // Only allow internal clients to authenticate with a different userId. @@ -223,18 +223,18 @@ public class AuthService extends SystemService { if (!checkAppOps(callingUid, opPackageName, "authenticate()")) { authenticateFastFail("Denied by app ops: " + opPackageName, receiver); - return; + return -1; } if (token == null || receiver == null || opPackageName == null || promptInfo == null) { authenticateFastFail( "Unable to authenticate, one or more null arguments", receiver); - return; + return -1; } if (!Utils.isForeground(callingUid, callingPid)) { authenticateFastFail("Caller is not foreground: " + opPackageName, receiver); - return; + return -1; } if (promptInfo.containsTestConfigurations()) { @@ -251,7 +251,7 @@ public class AuthService extends SystemService { final long identity = Binder.clearCallingIdentity(); try { - mBiometricService.authenticate( + return mBiometricService.authenticate( token, sessionId, userId, receiver, opPackageName, promptInfo); } finally { Binder.restoreCallingIdentity(identity); @@ -270,7 +270,7 @@ public class AuthService extends SystemService { } @Override - public void cancelAuthentication(IBinder token, String opPackageName) + public void cancelAuthentication(IBinder token, String opPackageName, long requestId) throws RemoteException { checkPermission(); @@ -281,7 +281,7 @@ public class AuthService extends SystemService { final long identity = Binder.clearCallingIdentity(); try { - mBiometricService.cancelAuthentication(token, opPackageName); + mBiometricService.cancelAuthentication(token, opPackageName, requestId); } finally { Binder.restoreCallingIdentity(identity); } diff --git a/services/core/java/com/android/server/biometrics/AuthSession.java b/services/core/java/com/android/server/biometrics/AuthSession.java index bdde980f5cae..0da6a1ba3109 100644 --- a/services/core/java/com/android/server/biometrics/AuthSession.java +++ b/services/core/java/com/android/server/biometrics/AuthSession.java @@ -128,6 +128,7 @@ public final class AuthSession implements IBinder.DeathRecipient { @VisibleForTesting final IBinder mToken; // Info to be shown on BiometricDialog when all cookies are returned. @VisibleForTesting final PromptInfo mPromptInfo; + private final long mRequestId; private final long mOperationId; private final int mUserId; private final IBiometricSensorReceiver mSensorReceiver; @@ -142,6 +143,8 @@ public final class AuthSession implements IBinder.DeathRecipient { private @BiometricMultiSensorMode int mMultiSensorMode; private @MultiSensorState int mMultiSensorState; private int[] mSensors; + // TODO(b/197265902): merge into state + private boolean mCancelled; // For explicit confirmation, do not send to keystore until the user has confirmed // the authentication. private byte[] mTokenEscrow; @@ -162,6 +165,7 @@ public final class AuthSession implements IBinder.DeathRecipient { @NonNull ClientDeathReceiver clientDeathReceiver, @NonNull PreAuthInfo preAuthInfo, @NonNull IBinder token, + long requestId, long operationId, int userId, @NonNull IBiometricSensorReceiver sensorReceiver, @@ -179,6 +183,7 @@ public final class AuthSession implements IBinder.DeathRecipient { mClientDeathReceiver = clientDeathReceiver; mPreAuthInfo = preAuthInfo; mToken = token; + mRequestId = requestId; mOperationId = operationId; mUserId = userId; mSensorReceiver = sensorReceiver; @@ -187,6 +192,7 @@ public final class AuthSession implements IBinder.DeathRecipient { mPromptInfo = promptInfo; mDebugEnabled = debugEnabled; mFingerprintSensorProperties = fingerprintSensorProperties; + mCancelled = false; try { mClientReceiver.asBinder().linkToDeath(this, 0 /* flags */); @@ -233,7 +239,7 @@ public final class AuthSession implements IBinder.DeathRecipient { Slog.v(TAG, "waiting for cooking for sensor: " + sensor.id); } sensor.goToStateWaitingForCookie(requireConfirmation, mToken, mOperationId, - mUserId, mSensorReceiver, mOpPackageName, cookie, + mUserId, mSensorReceiver, mOpPackageName, mRequestId, cookie, mPromptInfo.isAllowBackgroundAuthentication()); } } @@ -255,8 +261,9 @@ public final class AuthSession implements IBinder.DeathRecipient { true /* credentialAllowed */, false /* requireConfirmation */, mUserId, - mOpPackageName, mOperationId, + mOpPackageName, + mRequestId, mMultiSensorMode); } else if (!mPreAuthInfo.eligibleSensors.isEmpty()) { // Some combination of biometric or biometric|credential is requested @@ -270,6 +277,11 @@ public final class AuthSession implements IBinder.DeathRecipient { } void onCookieReceived(int cookie) { + if (mCancelled) { + Slog.w(TAG, "Received cookie but already cancelled (ignoring): " + cookie); + return; + } + for (BiometricSensor sensor : mPreAuthInfo.eligibleSensors) { sensor.goToStateCookieReturnedIfCookieMatches(cookie); } @@ -301,8 +313,9 @@ public final class AuthSession implements IBinder.DeathRecipient { mPreAuthInfo.shouldShowCredential(), requireConfirmation, mUserId, - mOpPackageName, mOperationId, + mOpPackageName, + mRequestId, mMultiSensorMode); mState = STATE_AUTH_STARTED; } catch (RemoteException e) { @@ -369,7 +382,7 @@ public final class AuthSession implements IBinder.DeathRecipient { final boolean shouldCancel = filter.apply(sensor); Slog.d(TAG, "sensorId: " + sensor.id + ", shouldCancel: " + shouldCancel); if (shouldCancel) { - sensor.goToStateCancelling(mToken, mOpPackageName); + sensor.goToStateCancelling(mToken, mOpPackageName, mRequestId); } } catch (RemoteException e) { Slog.e(TAG, "Unable to cancel authentication"); @@ -425,8 +438,9 @@ public final class AuthSession implements IBinder.DeathRecipient { true /* credentialAllowed */, false /* requireConfirmation */, mUserId, - mOpPackageName, mOperationId, + mOpPackageName, + mRequestId, mMultiSensorMode); } else { mClientReceiver.onError(modality, error, vendorCode); @@ -775,6 +789,8 @@ public final class AuthSession implements IBinder.DeathRecipient { * @return true if this AuthSession is finished, e.g. should be set to null */ boolean onCancelAuthSession(boolean force) { + mCancelled = true; + final boolean authStarted = mState == STATE_AUTH_CALLED || mState == STATE_AUTH_STARTED || mState == STATE_AUTH_STARTED_UI_SHOWING; @@ -820,6 +836,7 @@ public final class AuthSession implements IBinder.DeathRecipient { return Utils.isCredentialRequested(mPromptInfo); } + @VisibleForTesting boolean allCookiesReceived() { final int remainingCookies = mPreAuthInfo.numSensorsWaitingForCookie(); Slog.d(TAG, "Remaining cookies: " + remainingCookies); @@ -839,6 +856,10 @@ public final class AuthSession implements IBinder.DeathRecipient { return mState; } + long getRequestId() { + return mRequestId; + } + private int statsModality() { int modality = 0; @@ -901,7 +922,9 @@ public final class AuthSession implements IBinder.DeathRecipient { @Override public String toString() { return "State: " + mState + + ", cancelled: " + mCancelled + ", isCrypto: " + isCrypto() - + ", PreAuthInfo: " + mPreAuthInfo; + + ", PreAuthInfo: " + mPreAuthInfo + + ", requestId: " + mRequestId; } } diff --git a/services/core/java/com/android/server/biometrics/BiometricSensor.java b/services/core/java/com/android/server/biometrics/BiometricSensor.java index 8a842b53d8e8..0333c3e247c0 100644 --- a/services/core/java/com/android/server/biometrics/BiometricSensor.java +++ b/services/core/java/com/android/server/biometrics/BiometricSensor.java @@ -108,11 +108,11 @@ public abstract class BiometricSensor { void goToStateWaitingForCookie(boolean requireConfirmation, IBinder token, long sessionId, int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, - int cookie, boolean allowBackgroundAuthentication) + long requestId, int cookie, boolean allowBackgroundAuthentication) throws RemoteException { mCookie = cookie; impl.prepareForAuthentication(requireConfirmation, token, - sessionId, userId, sensorReceiver, opPackageName, mCookie, + sessionId, userId, sensorReceiver, opPackageName, requestId, mCookie, allowBackgroundAuthentication); mSensorState = STATE_WAITING_FOR_COOKIE; } @@ -129,8 +129,9 @@ public abstract class BiometricSensor { mSensorState = STATE_AUTHENTICATING; } - void goToStateCancelling(IBinder token, String opPackageName) throws RemoteException { - impl.cancelAuthenticationFromService(token, opPackageName); + void goToStateCancelling(IBinder token, String opPackageName, long requestId) + throws RemoteException { + impl.cancelAuthenticationFromService(token, opPackageName, requestId); mSensorState = STATE_CANCELING; } diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index b1d300cd838e..e0775d48b42f 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -83,6 +83,7 @@ import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; /** * System service that arbitrates the modality for BiometricPrompt to use. @@ -115,6 +116,7 @@ public class BiometricService extends SystemService { final SettingObserver mSettingObserver; private final List<EnabledOnKeyguardCallback> mEnabledOnKeyguardCallbacks; private final Random mRandom = new Random(); + @NonNull private final AtomicLong mRequestCounter; @VisibleForTesting IStatusBarService mStatusBarService; @@ -194,6 +196,7 @@ public class BiometricService extends SystemService { SomeArgs args = (SomeArgs) msg.obj; handleAuthenticate( (IBinder) args.arg1 /* token */, + (long) args.arg6 /* requestId */, (long) args.arg2 /* operationId */, args.argi1 /* userid */, (IBiometricServiceReceiver) args.arg3 /* receiver */, @@ -204,7 +207,9 @@ public class BiometricService extends SystemService { } case MSG_CANCEL_AUTHENTICATION: { - handleCancelAuthentication(); + SomeArgs args = (SomeArgs) msg.obj; + handleCancelAuthentication((long) args.arg3 /* requestId */); + args.recycle(); break; } @@ -683,13 +688,13 @@ public class BiometricService extends SystemService { } @Override // Binder call - public void authenticate(IBinder token, long operationId, int userId, + public long authenticate(IBinder token, long operationId, int userId, IBiometricServiceReceiver receiver, String opPackageName, PromptInfo promptInfo) { checkInternalPermission(); if (token == null || receiver == null || opPackageName == null || promptInfo == null) { Slog.e(TAG, "Unable to authenticate, one or more null arguments"); - return; + return -1; } if (!Utils.isValidAuthenticatorConfig(promptInfo)) { @@ -706,6 +711,8 @@ public class BiometricService extends SystemService { } } + final long requestId = mRequestCounter.incrementAndGet(); + SomeArgs args = SomeArgs.obtain(); args.arg1 = token; args.arg2 = operationId; @@ -713,15 +720,23 @@ public class BiometricService extends SystemService { args.arg3 = receiver; args.arg4 = opPackageName; args.arg5 = promptInfo; + args.arg6 = requestId; mHandler.obtainMessage(MSG_AUTHENTICATE, args).sendToTarget(); + + return requestId; } @Override // Binder call - public void cancelAuthentication(IBinder token, String opPackageName) { + public void cancelAuthentication(IBinder token, String opPackageName, long requestId) { checkInternalPermission(); - mHandler.obtainMessage(MSG_CANCEL_AUTHENTICATION).sendToTarget(); + SomeArgs args = SomeArgs.obtain(); + args.arg1 = token; + args.arg2 = opPackageName; + args.arg3 = requestId; + + mHandler.obtainMessage(MSG_CANCEL_AUTHENTICATION, args).sendToTarget(); } @Override // Binder call @@ -1111,6 +1126,10 @@ public class BiometricService extends SystemService { return Settings.Secure.getInt(context.getContentResolver(), CoexCoordinator.FACE_HAPTIC_DISABLE, 1) != 0; } + + public AtomicLong getRequestGenerator() { + return new AtomicLong(0); + } } /** @@ -1136,6 +1155,7 @@ public class BiometricService extends SystemService { mEnabledOnKeyguardCallbacks = new ArrayList<>(); mSettingObserver = mInjector.getSettingObserver(context, mHandler, mEnabledOnKeyguardCallbacks); + mRequestCounter = mInjector.getRequestGenerator(); // TODO(b/193089985) This logic lives here (outside of CoexCoordinator) so that it doesn't // need to depend on context. We can remove this code once the advanced logic is enabled @@ -1349,7 +1369,7 @@ public class BiometricService extends SystemService { mCurrentAuthSession.onCookieReceived(cookie); } - private void handleAuthenticate(IBinder token, long operationId, int userId, + private void handleAuthenticate(IBinder token, long requestId, long operationId, int userId, IBiometricServiceReceiver receiver, String opPackageName, PromptInfo promptInfo) { mHandler.post(() -> { try { @@ -1360,7 +1380,8 @@ public class BiometricService extends SystemService { final Pair<Integer, Integer> preAuthStatus = preAuthInfo.getPreAuthenticateStatus(); Slog.d(TAG, "handleAuthenticate: modality(" + preAuthStatus.first - + "), status(" + preAuthStatus.second + "), preAuthInfo: " + preAuthInfo); + + "), status(" + preAuthStatus.second + "), preAuthInfo: " + preAuthInfo + + " requestId: " + requestId); if (preAuthStatus.second == BiometricConstants.BIOMETRIC_SUCCESS) { // If BIOMETRIC_WEAK or BIOMETRIC_STRONG are allowed, but not enrolled, but @@ -1372,8 +1393,8 @@ public class BiometricService extends SystemService { promptInfo.setAuthenticators(Authenticators.DEVICE_CREDENTIAL); } - authenticateInternal(token, operationId, userId, receiver, opPackageName, - promptInfo, preAuthInfo); + authenticateInternal(token, requestId, operationId, userId, receiver, + opPackageName, promptInfo, preAuthInfo); } else { receiver.onError(preAuthStatus.first /* modality */, preAuthStatus.second /* errorCode */, @@ -1394,7 +1415,7 @@ public class BiometricService extends SystemService { * Note that this path is NOT invoked when the BiometricPrompt "Try again" button is pressed. * In that case, see {@link #handleOnTryAgainPressed()}. */ - private void authenticateInternal(IBinder token, long operationId, int userId, + private void authenticateInternal(IBinder token, long requestId, long operationId, int userId, IBiometricServiceReceiver receiver, String opPackageName, PromptInfo promptInfo, PreAuthInfo preAuthInfo) { Slog.d(TAG, "Creating authSession with authRequest: " + preAuthInfo); @@ -1412,9 +1433,9 @@ public class BiometricService extends SystemService { final boolean debugEnabled = mInjector.isDebugEnabled(getContext(), userId); mCurrentAuthSession = new AuthSession(getContext(), mStatusBarService, mSysuiReceiver, - mKeyStore, mRandom, mClientDeathReceiver, preAuthInfo, token, operationId, userId, - mBiometricSensorReceiver, receiver, opPackageName, promptInfo, debugEnabled, - mInjector.getFingerprintSensorProperties(getContext())); + mKeyStore, mRandom, mClientDeathReceiver, preAuthInfo, token, requestId, + operationId, userId, mBiometricSensorReceiver, receiver, opPackageName, promptInfo, + debugEnabled, mInjector.getFingerprintSensorProperties(getContext())); try { mCurrentAuthSession.goToInitialState(); } catch (RemoteException e) { @@ -1422,11 +1443,21 @@ public class BiometricService extends SystemService { } } - private void handleCancelAuthentication() { + private void handleCancelAuthentication(long requestId) { if (mCurrentAuthSession == null) { Slog.e(TAG, "handleCancelAuthentication: AuthSession is null"); return; } + if (mCurrentAuthSession.getRequestId() != requestId) { + // TODO: actually cancel the operation + // This can happen if the operation has been queued, but is cancelled before + // it reaches the head of the scheduler. Consider it a programming error for now + // and ignore it. + Slog.e(TAG, "handleCancelAuthentication: AuthSession mismatch current requestId: " + + mCurrentAuthSession.getRequestId() + " cancel for: " + requestId + + " (ignoring cancellation)"); + return; + } final boolean finished = mCurrentAuthSession.onCancelAuthSession(false /* force */); if (finished) { 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 3eb6f4ae48a2..0a1c77bf10a2 100644 --- a/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/sensors/BaseClientMonitor.java @@ -101,6 +101,7 @@ public abstract class BaseClientMonitor extends LoggableMonitor private final int mSensorId; // sensorId as configured by the framework @Nullable private IBinder mToken; + private long mRequestId; @Nullable private ClientMonitorCallbackConverter mListener; // Currently only used for authentication client. The cookie generated by BiometricService // is never 0. @@ -154,6 +155,7 @@ public abstract class BaseClientMonitor extends LoggableMonitor mSequentialId = sCount++; mContext = context; mToken = token; + mRequestId = -1; mListener = listener; mTargetUserId = userId; mOwner = owner; @@ -258,6 +260,29 @@ public abstract class BaseClientMonitor extends LoggableMonitor return mSensorId; } + /** Unique request id. */ + public final long getRequestId() { + return mRequestId; + } + + /** If a unique id has been set via {@link #setRequestId(long)} */ + public final boolean hasRequestId() { + return mRequestId > 0; + } + + /** + * A unique identifier used to tie this operation to a request (i.e an API invocation). + * + * Subclasses should not call this method if this operation does not have a direct + * correspondence to a request and {@link #hasRequestId()} will return false. + */ + protected final void setRequestId(long id) { + if (id <= 0) { + throw new IllegalArgumentException("request id must be positive"); + } + mRequestId = id; + } + @VisibleForTesting public Callback getCallback() { return mCallback; @@ -270,6 +295,7 @@ public abstract class BaseClientMonitor extends LoggableMonitor + ", proto=" + getProtoEnum() + ", owner=" + getOwnerString() + ", cookie=" + getCookie() + + ", requestId=" + getRequestId() + ", userId=" + getTargetUserId() + "}"; } } diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java index feb9e2a5b03f..361ec40f2877 100644 --- a/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java +++ b/services/core/java/com/android/server/biometrics/sensors/BiometricScheduler.java @@ -643,22 +643,18 @@ public class BiometricScheduler { /** * Requests to cancel authentication or detection. * @param token from the caller, should match the token passed in when requesting authentication + * @param requestId the id returned when requesting authentication */ - public void cancelAuthenticationOrDetection(IBinder token) { - if (mCurrentOperation == null) { - Slog.e(getTag(), "Unable to cancel authentication, null operation"); - return; - } - final boolean isCorrectClient = isAuthenticationOrDetectionOperation(mCurrentOperation); - final boolean tokenMatches = mCurrentOperation.mClientMonitor.getToken() == token; - - Slog.d(getTag(), "cancelAuthenticationOrDetection, isCorrectClient: " + isCorrectClient - + ", tokenMatches: " + tokenMatches); + public void cancelAuthenticationOrDetection(IBinder token, long requestId) { + Slog.d(getTag(), "cancelAuthenticationOrDetection, requestId: " + requestId + + " current: " + mCurrentOperation + + " stack size: " + mPendingOperations.size()); - if (isCorrectClient && tokenMatches) { + if (mCurrentOperation != null + && canCancelAuthOperation(mCurrentOperation, token, requestId)) { Slog.d(getTag(), "Cancelling: " + mCurrentOperation); cancelInternal(mCurrentOperation); - } else if (!isCorrectClient) { + } else { // Look through the current queue for all authentication clients for the specified // token, and mark them as STATE_WAITING_IN_QUEUE_CANCELING. Note that we're marking // all of them, instead of just the first one, since the API surface currently doesn't @@ -666,8 +662,7 @@ public class BiometricScheduler { // process. However, this generally does not happen anyway, and would be a class of // bugs on its own. for (Operation operation : mPendingOperations) { - if (isAuthenticationOrDetectionOperation(operation) - && operation.mClientMonitor.getToken() == token) { + if (canCancelAuthOperation(operation, token, requestId)) { Slog.d(getTag(), "Marking " + operation + " as STATE_WAITING_IN_QUEUE_CANCELING"); operation.mState = Operation.STATE_WAITING_IN_QUEUE_CANCELING; @@ -676,10 +671,26 @@ public class BiometricScheduler { } } - private boolean isAuthenticationOrDetectionOperation(@NonNull Operation operation) { - final boolean isAuthentication = operation.mClientMonitor - instanceof AuthenticationConsumer; - final boolean isDetection = operation.mClientMonitor instanceof DetectionConsumer; + private static boolean canCancelAuthOperation(Operation operation, IBinder token, + long requestId) { + // TODO: restrict callers that can cancel without requestId (negative value)? + return isAuthenticationOrDetectionOperation(operation) + && operation.mClientMonitor.getToken() == token + && isMatchingRequestId(operation, requestId); + } + + // By default, monitors are not associated with a request id to retain the original + // behavior (i.e. if no requestId is explicitly set then assume it matches) + private static boolean isMatchingRequestId(Operation operation, long requestId) { + return !operation.mClientMonitor.hasRequestId() + || operation.mClientMonitor.getRequestId() == requestId; + } + + private static boolean isAuthenticationOrDetectionOperation(@NonNull Operation operation) { + final boolean isAuthentication = + operation.mClientMonitor instanceof AuthenticationConsumer; + final boolean isDetection = + operation.mClientMonitor instanceof DetectionConsumer; return isAuthentication || isDetection; } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java index 0bc4f1b54d59..b2fd46d1475d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java @@ -61,10 +61,11 @@ public final class FaceAuthenticator extends IBiometricAuthenticator.Stub { @Override public void prepareForAuthentication(boolean requireConfirmation, IBinder token, long operationId, int userId, IBiometricSensorReceiver sensorReceiver, - String opPackageName, int cookie, boolean allowBackgroundAuthentication) + String opPackageName, long requestId, int cookie, boolean allowBackgroundAuthentication) throws RemoteException { mFaceService.prepareForAuthentication(mSensorId, requireConfirmation, token, operationId, - userId, sensorReceiver, opPackageName, cookie, allowBackgroundAuthentication); + userId, sensorReceiver, opPackageName, requestId, cookie, + allowBackgroundAuthentication); } @Override @@ -73,9 +74,9 @@ public final class FaceAuthenticator extends IBiometricAuthenticator.Stub { } @Override - public void cancelAuthenticationFromService(IBinder token, String opPackageName) + public void cancelAuthenticationFromService(IBinder token, String opPackageName, long requestId) throws RemoteException { - mFaceService.cancelAuthenticationFromService(mSensorId, token, opPackageName); + mFaceService.cancelAuthenticationFromService(mSensorId, token, opPackageName, requestId); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java index 12d6b08b8bcf..675ee545a14f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java @@ -250,7 +250,7 @@ public class FaceService extends SystemService { } @Override // Binder call - public void authenticate(final IBinder token, final long operationId, int userId, + public long authenticate(final IBinder token, final long operationId, int userId, final IFaceServiceReceiver receiver, final String opPackageName, boolean isKeyguardBypassEnabled) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); @@ -270,38 +270,38 @@ public class FaceService extends SystemService { final Pair<Integer, ServiceProvider> provider = getSingleProvider(); if (provider == null) { Slog.w(TAG, "Null provider for authenticate"); - return; + return -1; } - provider.second.scheduleAuthenticate(provider.first, token, operationId, userId, + return provider.second.scheduleAuthenticate(provider.first, token, operationId, userId, 0 /* cookie */, new ClientMonitorCallbackConverter(receiver), opPackageName, restricted, statsClient, isKeyguard, isKeyguardBypassEnabled); } @Override // Binder call - public void detectFace(final IBinder token, final int userId, + public long detectFace(final IBinder token, final int userId, final IFaceServiceReceiver receiver, final String opPackageName) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); if (!Utils.isKeyguard(getContext(), opPackageName)) { Slog.w(TAG, "detectFace called from non-sysui package: " + opPackageName); - return; + return -1; } if (!Utils.isUserEncryptedOrLockdown(mLockPatternUtils, userId)) { // If this happens, something in KeyguardUpdateMonitor is wrong. This should only // ever be invoked when the user is encrypted or lockdown. Slog.e(TAG, "detectFace invoked when user is not encrypted or lockdown"); - return; + return -1; } final Pair<Integer, ServiceProvider> provider = getSingleProvider(); if (provider == null) { Slog.w(TAG, "Null provider for detectFace"); - return; + return -1; } - provider.second.scheduleFaceDetect(provider.first, token, userId, + return provider.second.scheduleFaceDetect(provider.first, token, userId, new ClientMonitorCallbackConverter(receiver), opPackageName, BiometricsProtoEnums.CLIENT_KEYGUARD); } @@ -309,8 +309,8 @@ public class FaceService extends SystemService { @Override // Binder call public void prepareForAuthentication(int sensorId, boolean requireConfirmation, IBinder token, long operationId, int userId, - IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie, - boolean allowBackgroundAuthentication) { + IBiometricSensorReceiver sensorReceiver, String opPackageName, long requestId, + int cookie, boolean allowBackgroundAuthentication) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); final ServiceProvider provider = getProviderForSensor(sensorId); @@ -322,9 +322,9 @@ public class FaceService extends SystemService { final boolean isKeyguardBypassEnabled = false; // only valid for keyguard clients final boolean restricted = true; // BiometricPrompt is always restricted provider.scheduleAuthenticate(sensorId, token, operationId, userId, cookie, - new ClientMonitorCallbackConverter(sensorReceiver), opPackageName, restricted, - BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, allowBackgroundAuthentication, - isKeyguardBypassEnabled); + new ClientMonitorCallbackConverter(sensorReceiver), opPackageName, requestId, + restricted, BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, + allowBackgroundAuthentication, isKeyguardBypassEnabled); } @Override // Binder call @@ -341,7 +341,8 @@ public class FaceService extends SystemService { } @Override // Binder call - public void cancelAuthentication(final IBinder token, final String opPackageName) { + public void cancelAuthentication(final IBinder token, final String opPackageName, + final long requestId) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); final Pair<Integer, ServiceProvider> provider = getSingleProvider(); @@ -350,11 +351,12 @@ public class FaceService extends SystemService { return; } - provider.second.cancelAuthentication(provider.first, token); + provider.second.cancelAuthentication(provider.first, token, requestId); } @Override // Binder call - public void cancelFaceDetect(final IBinder token, final String opPackageName) { + public void cancelFaceDetect(final IBinder token, final String opPackageName, + final long requestId) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); if (!Utils.isKeyguard(getContext(), opPackageName)) { Slog.w(TAG, "cancelFaceDetect called from non-sysui package: " @@ -368,12 +370,12 @@ public class FaceService extends SystemService { return; } - provider.second.cancelFaceDetect(provider.first, token); + provider.second.cancelFaceDetect(provider.first, token, requestId); } @Override // Binder call public void cancelAuthenticationFromService(int sensorId, final IBinder token, - final String opPackageName) { + final String opPackageName, final long requestId) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); final ServiceProvider provider = getProviderForSensor(sensorId); @@ -382,7 +384,7 @@ public class FaceService extends SystemService { return; } - provider.cancelAuthentication(sensorId, token); + provider.cancelAuthentication(sensorId, token, requestId); } @Override // Binder call diff --git a/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java index 93ab1b65edff..e099ba372b05 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java @@ -101,18 +101,23 @@ public interface ServiceProvider { void cancelEnrollment(int sensorId, @NonNull IBinder token); - void scheduleFaceDetect(int sensorId, @NonNull IBinder token, int userId, + long scheduleFaceDetect(int sensorId, @NonNull IBinder token, int userId, @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName, int statsClient); - void cancelFaceDetect(int sensorId, @NonNull IBinder token); + void cancelFaceDetect(int sensorId, @NonNull IBinder token, long requestId); - void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, + long scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName, boolean restricted, int statsClient, boolean allowBackgroundAuthentication, boolean isKeyguardBypassEnabled); - void cancelAuthentication(int sensorId, @NonNull IBinder token); + void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, + int cookie, @NonNull ClientMonitorCallbackConverter callback, + @NonNull String opPackageName, long requestId, boolean restricted, int statsClient, + boolean allowBackgroundAuthentication, boolean isKeyguardBypassEnabled); + + void cancelAuthentication(int sensorId, @NonNull IBinder token, long requestId); void scheduleRemove(int sensorId, @NonNull IBinder token, int faceId, int userId, @NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java index d66a27920f49..cbceba6cc959 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java @@ -65,7 +65,8 @@ class FaceAuthenticationClient extends AuthenticationClient<ISession> implements @FaceManager.FaceAcquired private int mLastAcquire = FaceManager.FACE_ACQUIRED_UNKNOWN; FaceAuthenticationClient(@NonNull Context context, - @NonNull LazyDaemon<ISession> lazyDaemon, @NonNull IBinder token, + @NonNull LazyDaemon<ISession> lazyDaemon, + @NonNull IBinder token, long requestId, @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, String owner, int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric, int statsClient, @NonNull UsageStats usageStats, @@ -76,6 +77,7 @@ class FaceAuthenticationClient extends AuthenticationClient<ISession> implements BiometricsProtoEnums.MODALITY_FACE, statsClient, null /* taskStackListener */, lockoutCache, allowBackgroundAuthentication, true /* shouldVibrate */, isKeyguardBypassEnabled); + setRequestId(requestId); mUsageStats = usageStats; mLockoutCache = lockoutCache; mNotificationManager = context.getSystemService(NotificationManager.class); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java index 1e73ac528f08..2ef0911658b1 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceDetectClient.java @@ -43,11 +43,13 @@ public class FaceDetectClient extends AcquisitionClient<ISession> implements Det @Nullable private ICancellationSignal mCancellationSignal; public FaceDetectClient(@NonNull Context context, @NonNull LazyDaemon<ISession> lazyDaemon, - @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, + @NonNull IBinder token, long requestId, + @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int sensorId, boolean isStrongBiometric, int statsClient) { super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, true /* shouldVibrate */, BiometricsProtoEnums.MODALITY_FACE, BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient); + setRequestId(requestId); mIsStrongBiometric = isStrongBiometric; } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java index 718b9da968f5..4bae7756abe0 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java @@ -65,6 +65,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicLong; /** * Provider for a single instance of the {@link IFace} HAL. @@ -83,6 +84,8 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { @NonNull private final UsageStats mUsageStats; @NonNull private final ActivityTaskManager mActivityTaskManager; @NonNull private final BiometricTaskStackListener mTaskStackListener; + // for requests that do not use biometric prompt + @NonNull private final AtomicLong mRequestCounter = new AtomicLong(0); @Nullable private IFace mDaemon; @@ -110,8 +113,8 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { && !client.isAlreadyDone()) { Slog.e(getTag(), "Stopping background authentication, top: " + topPackage + " currentClient: " + client); - mSensors.valueAt(i).getScheduler() - .cancelAuthenticationOrDetection(client.getToken()); + mSensors.valueAt(i).getScheduler().cancelAuthenticationOrDetection( + client.getToken(), client.getRequestId()); } } } @@ -356,34 +359,39 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { } @Override - public void scheduleFaceDetect(int sensorId, @NonNull IBinder token, + public long scheduleFaceDetect(int sensorId, @NonNull IBinder token, int userId, @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName, int statsClient) { + final long id = mRequestCounter.incrementAndGet(); + mHandler.post(() -> { final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId); final FaceDetectClient client = new FaceDetectClient(mContext, - mSensors.get(sensorId).getLazySession(), token, callback, userId, opPackageName, + mSensors.get(sensorId).getLazySession(), + token, id, callback, userId, opPackageName, sensorId, isStrongBiometric, statsClient); scheduleForSensor(sensorId, client); }); + + return id; } @Override - public void cancelFaceDetect(int sensorId, @NonNull IBinder token) { + public void cancelFaceDetect(int sensorId, @NonNull IBinder token, long requestId) { mHandler.post(() -> mSensors.get(sensorId).getScheduler() - .cancelAuthenticationOrDetection(token)); + .cancelAuthenticationOrDetection(token, requestId)); } @Override public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback, - @NonNull String opPackageName, boolean restricted, int statsClient, + @NonNull String opPackageName, long requestId, boolean restricted, int statsClient, boolean allowBackgroundAuthentication, boolean isKeyguardBypassEnabled) { mHandler.post(() -> { final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId); final FaceAuthenticationClient client = new FaceAuthenticationClient( - mContext, mSensors.get(sensorId).getLazySession(), token, callback, userId, - operationId, restricted, opPackageName, cookie, + mContext, mSensors.get(sensorId).getLazySession(), token, requestId, callback, + userId, operationId, restricted, opPackageName, cookie, false /* requireConfirmation */, sensorId, isStrongBiometric, statsClient, mUsageStats, mSensors.get(sensorId).getLockoutCache(), allowBackgroundAuthentication, isKeyguardBypassEnabled); @@ -392,9 +400,23 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { } @Override - public void cancelAuthentication(int sensorId, @NonNull IBinder token) { + public long scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, + int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback, + @NonNull String opPackageName, boolean restricted, int statsClient, + boolean allowBackgroundAuthentication, boolean isKeyguardBypassEnabled) { + final long id = mRequestCounter.incrementAndGet(); + + scheduleAuthenticate(sensorId, token, operationId, userId, cookie, callback, + opPackageName, id, restricted, statsClient, + allowBackgroundAuthentication, isKeyguardBypassEnabled); + + return id; + } + + @Override + public void cancelAuthentication(int sensorId, @NonNull IBinder token, long requestId) { mHandler.post(() -> mSensors.get(sensorId).getScheduler() - .cancelAuthenticationOrDetection(token)); + .cancelAuthenticationOrDetection(token, requestId)); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java index d05333db7532..f4dcbbba21d7 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java @@ -87,6 +87,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; /** * Supports a single instance of the {@link android.hardware.biometrics.face.V1_0} or its extended @@ -115,6 +116,8 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { @NonNull private final Map<Integer, Long> mAuthenticatorIds; @Nullable private IBiometricsFace mDaemon; @NonNull private final HalResultController mHalResultController; + // for requests that do not use biometric prompt + @NonNull private final AtomicLong mRequestCounter = new AtomicLong(0); private int mCurrentUserId = UserHandle.USER_NULL; private final int mSensorId; private final List<Long> mGeneratedChallengeCount = new ArrayList<>(); @@ -605,7 +608,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { } @Override - public void scheduleFaceDetect(int sensorId, @NonNull IBinder token, + public long scheduleFaceDetect(int sensorId, @NonNull IBinder token, int userId, @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName, int statsClient) { throw new IllegalStateException("Face detect not supported by IBiometricsFace@1.0. Did you" @@ -613,7 +616,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { } @Override - public void cancelFaceDetect(int sensorId, @NonNull IBinder token) { + public void cancelFaceDetect(int sensorId, @NonNull IBinder token, long requestId) { throw new IllegalStateException("Face detect not supported by IBiometricsFace@1.0. Did you" + "forget to check the supportsFaceDetection flag?"); } @@ -621,26 +624,38 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { @Override public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, int cookie, @NonNull ClientMonitorCallbackConverter receiver, - @NonNull String opPackageName, boolean restricted, int statsClient, + @NonNull String opPackageName, long requestId, boolean restricted, int statsClient, boolean allowBackgroundAuthentication, boolean isKeyguardBypassEnabled) { mHandler.post(() -> { scheduleUpdateActiveUserWithoutHandler(userId); final boolean isStrongBiometric = Utils.isStrongBiometric(mSensorId); final FaceAuthenticationClient client = new FaceAuthenticationClient(mContext, - mLazyDaemon, token, receiver, userId, operationId, restricted, opPackageName, - cookie, false /* requireConfirmation */, mSensorId, isStrongBiometric, - statsClient, mLockoutTracker, mUsageStats, allowBackgroundAuthentication, - isKeyguardBypassEnabled); + mLazyDaemon, token, requestId, receiver, userId, operationId, restricted, + opPackageName, cookie, false /* requireConfirmation */, mSensorId, + isStrongBiometric, statsClient, mLockoutTracker, mUsageStats, + allowBackgroundAuthentication, isKeyguardBypassEnabled); mScheduler.scheduleClientMonitor(client); }); } @Override - public void cancelAuthentication(int sensorId, @NonNull IBinder token) { - mHandler.post(() -> { - mScheduler.cancelAuthenticationOrDetection(token); - }); + public long scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, + int userId, int cookie, @NonNull ClientMonitorCallbackConverter receiver, + @NonNull String opPackageName, boolean restricted, int statsClient, + boolean allowBackgroundAuthentication, boolean isKeyguardBypassEnabled) { + final long id = mRequestCounter.incrementAndGet(); + + scheduleAuthenticate(sensorId, token, operationId, userId, cookie, receiver, + opPackageName, id, restricted, statsClient, + allowBackgroundAuthentication, isKeyguardBypassEnabled); + + return id; + } + + @Override + public void cancelAuthentication(int sensorId, @NonNull IBinder token, long requestId) { + mHandler.post(() -> mScheduler.cancelAuthenticationOrDetection(token, requestId)); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java index 33950af2216f..40f2801541d3 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java @@ -57,7 +57,8 @@ class FaceAuthenticationClient extends AuthenticationClient<IBiometricsFace> { private int mLastAcquire; FaceAuthenticationClient(@NonNull Context context, - @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, @NonNull IBinder token, + @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, + @NonNull IBinder token, long requestId, @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, String owner, int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric, int statsClient, @NonNull LockoutTracker lockoutTracker, @@ -68,6 +69,7 @@ class FaceAuthenticationClient extends AuthenticationClient<IBiometricsFace> { BiometricsProtoEnums.MODALITY_FACE, statsClient, null /* taskStackListener */, lockoutTracker, allowBackgroundAuthentication, true /* shouldVibrate */, isKeyguardBypassEnabled); + setRequestId(requestId); mUsageStats = usageStats; final Resources resources = getContext().getResources(); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java index 1e5942930b01..52d887a75216 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java @@ -61,10 +61,10 @@ public final class FingerprintAuthenticator extends IBiometricAuthenticator.Stub @Override public void prepareForAuthentication(boolean requireConfirmation, IBinder token, long operationId, int userId, IBiometricSensorReceiver sensorReceiver, - String opPackageName, int cookie, boolean allowBackgroundAuthentication) + String opPackageName, long requestId, int cookie, boolean allowBackgroundAuthentication) throws RemoteException { mFingerprintService.prepareForAuthentication(mSensorId, token, operationId, userId, - sensorReceiver, opPackageName, cookie, allowBackgroundAuthentication); + sensorReceiver, opPackageName, requestId, cookie, allowBackgroundAuthentication); } @Override @@ -73,9 +73,10 @@ public final class FingerprintAuthenticator extends IBiometricAuthenticator.Stub } @Override - public void cancelAuthenticationFromService(IBinder token, String opPackageName) + public void cancelAuthenticationFromService(IBinder token, String opPackageName, long requestId) throws RemoteException { - mFingerprintService.cancelAuthenticationFromService(mSensorId, token, opPackageName); + mFingerprintService.cancelAuthenticationFromService( + mSensorId, token, opPackageName, requestId); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index 183fabdc2a7b..f0a8b9ca3146 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -245,7 +245,7 @@ public class FingerprintService extends SystemService { @SuppressWarnings("deprecation") @Override // Binder call - public void authenticate(final IBinder token, final long operationId, + public long authenticate(final IBinder token, final long operationId, final int sensorId, final int userId, final IFingerprintServiceReceiver receiver, final String opPackageName) { final int callingUid = Binder.getCallingUid(); @@ -255,7 +255,7 @@ public class FingerprintService extends SystemService { if (!canUseFingerprint(opPackageName, true /* requireForeground */, callingUid, callingPid, callingUserId)) { Slog.w(TAG, "Authenticate rejecting package: " + opPackageName); - return; + return -1; } // Keyguard check must be done on the caller's binder identity, since it also checks @@ -270,7 +270,7 @@ public class FingerprintService extends SystemService { // SafetyNet for b/79776455 EventLog.writeEvent(0x534e4554, "79776455"); Slog.e(TAG, "Authenticate invoked when user is encrypted or lockdown"); - return; + return -1; } } finally { Binder.restoreCallingIdentity(identity); @@ -290,7 +290,7 @@ public class FingerprintService extends SystemService { } if (provider == null) { Slog.w(TAG, "Null provider for authenticate"); - return; + return -1; } final FingerprintSensorPropertiesInternal sensorProps = @@ -299,18 +299,17 @@ public class FingerprintService extends SystemService { && sensorProps != null && sensorProps.isAnyUdfpsType()) { identity = Binder.clearCallingIdentity(); try { - authenticateWithPrompt(operationId, sensorProps, userId, receiver); + return authenticateWithPrompt(operationId, sensorProps, userId, receiver); } finally { Binder.restoreCallingIdentity(identity); } - } else { - provider.second.scheduleAuthenticate(provider.first, token, operationId, userId, - 0 /* cookie */, new ClientMonitorCallbackConverter(receiver), opPackageName, - restricted, statsClient, isKeyguard, mFingerprintStateCallback); } + return provider.second.scheduleAuthenticate(provider.first, token, operationId, userId, + 0 /* cookie */, new ClientMonitorCallbackConverter(receiver), opPackageName, + restricted, statsClient, isKeyguard, mFingerprintStateCallback); } - private void authenticateWithPrompt( + private long authenticateWithPrompt( final long operationId, @NonNull final FingerprintSensorPropertiesInternal props, final int userId, @@ -387,33 +386,33 @@ public class FingerprintService extends SystemService { } }; - biometricPrompt.authenticateUserForOperation( + return biometricPrompt.authenticateUserForOperation( new CancellationSignal(), executor, promptCallback, userId, operationId); } @Override - public void detectFingerprint(final IBinder token, final int userId, + public long detectFingerprint(final IBinder token, final int userId, final IFingerprintServiceReceiver receiver, final String opPackageName) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); if (!Utils.isKeyguard(getContext(), opPackageName)) { Slog.w(TAG, "detectFingerprint called from non-sysui package: " + opPackageName); - return; + return -1; } if (!Utils.isUserEncryptedOrLockdown(mLockPatternUtils, userId)) { // If this happens, something in KeyguardUpdateMonitor is wrong. This should only // ever be invoked when the user is encrypted or lockdown. Slog.e(TAG, "detectFingerprint invoked when user is not encrypted or lockdown"); - return; + return -1; } final Pair<Integer, ServiceProvider> provider = getSingleProvider(); if (provider == null) { Slog.w(TAG, "Null provider for detectFingerprint"); - return; + return -1; } - provider.second.scheduleFingerDetect(provider.first, token, userId, + return provider.second.scheduleFingerDetect(provider.first, token, userId, new ClientMonitorCallbackConverter(receiver), opPackageName, BiometricsProtoEnums.CLIENT_KEYGUARD, mFingerprintStateCallback); } @@ -421,7 +420,7 @@ public class FingerprintService extends SystemService { @Override // Binder call public void prepareForAuthentication(int sensorId, IBinder token, long operationId, int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, - int cookie, boolean allowBackgroundAuthentication) { + long requestId, int cookie, boolean allowBackgroundAuthentication) { Utils.checkPermission(getContext(), MANAGE_BIOMETRIC); final ServiceProvider provider = getProviderForSensor(sensorId); @@ -432,9 +431,9 @@ public class FingerprintService extends SystemService { final boolean restricted = true; // BiometricPrompt is always restricted provider.scheduleAuthenticate(sensorId, token, operationId, userId, cookie, - new ClientMonitorCallbackConverter(sensorReceiver), opPackageName, restricted, - BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, allowBackgroundAuthentication, - mFingerprintStateCallback); + new ClientMonitorCallbackConverter(sensorReceiver), opPackageName, requestId, + restricted, BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, + allowBackgroundAuthentication, mFingerprintStateCallback); } @Override // Binder call @@ -452,7 +451,8 @@ public class FingerprintService extends SystemService { @Override // Binder call - public void cancelAuthentication(final IBinder token, final String opPackageName) { + public void cancelAuthentication(final IBinder token, final String opPackageName, + long requestId) { final int callingUid = Binder.getCallingUid(); final int callingPid = Binder.getCallingPid(); final int callingUserId = UserHandle.getCallingUserId(); @@ -469,11 +469,12 @@ public class FingerprintService extends SystemService { return; } - provider.second.cancelAuthentication(provider.first, token); + provider.second.cancelAuthentication(provider.first, token, requestId); } @Override // Binder call - public void cancelFingerprintDetect(final IBinder token, final String opPackageName) { + public void cancelFingerprintDetect(final IBinder token, final String opPackageName, + final long requestId) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); if (!Utils.isKeyguard(getContext(), opPackageName)) { Slog.w(TAG, "cancelFingerprintDetect called from non-sysui package: " @@ -489,12 +490,12 @@ public class FingerprintService extends SystemService { return; } - provider.second.cancelAuthentication(provider.first, token); + provider.second.cancelAuthentication(provider.first, token, requestId); } @Override // Binder call public void cancelAuthenticationFromService(final int sensorId, final IBinder token, - final String opPackageName) { + final String opPackageName, final long requestId) { Utils.checkPermission(getContext(), MANAGE_BIOMETRIC); @@ -506,7 +507,7 @@ public class FingerprintService extends SystemService { return; } - provider.cancelAuthentication(sensorId, token); + provider.cancelAuthentication(sensorId, token, requestId); } @Override // Binder call diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java index 706ac1013746..b9fcd8ef4e42 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/ServiceProvider.java @@ -95,20 +95,26 @@ public interface ServiceProvider { void cancelEnrollment(int sensorId, @NonNull IBinder token); - void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId, + long scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId, @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName, int statsClient, @NonNull FingerprintStateCallback fingerprintStateCallback); void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback, + @NonNull String opPackageName, long requestId, boolean restricted, int statsClient, + boolean allowBackgroundAuthentication, + @NonNull FingerprintStateCallback fingerprintStateCallback); + + long scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, + int cookie, @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName, boolean restricted, int statsClient, boolean allowBackgroundAuthentication, @NonNull FingerprintStateCallback fingerprintStateCallback); void startPreparedClient(int sensorId, int cookie); - void cancelAuthentication(int sensorId, @NonNull IBinder token); + void cancelAuthentication(int sensorId, @NonNull IBinder token, long requestId); void scheduleRemove(int sensorId, @NonNull IBinder token, @NonNull IFingerprintServiceReceiver receiver, int fingerId, int userId, diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java index 37ee76adeece..9d911e0a320b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java @@ -61,7 +61,8 @@ class FingerprintAuthenticationClient extends AuthenticationClient<ISession> imp private boolean mIsPointerDown; FingerprintAuthenticationClient(@NonNull Context context, - @NonNull LazyDaemon<ISession> lazyDaemon, @NonNull IBinder token, + @NonNull LazyDaemon<ISession> lazyDaemon, + @NonNull IBinder token, long requestId, @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, @NonNull String owner, int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric, int statsClient, @@ -74,6 +75,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<ISession> imp BiometricsProtoEnums.MODALITY_FINGERPRINT, statsClient, taskStackListener, lockoutCache, allowBackgroundAuthentication, true /* shouldVibrate */, false /* isKeyguardBypassEnabled */); + setRequestId(requestId); mLockoutCache = lockoutCache; mUdfpsOverlayController = udfpsOverlayController; mSensorProps = sensorProps; diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java index c5dc44988612..da91cdd981b9 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintDetectClient.java @@ -47,13 +47,15 @@ class FingerprintDetectClient extends AcquisitionClient<ISession> implements Det @Nullable private ICancellationSignal mCancellationSignal; FingerprintDetectClient(@NonNull Context context, @NonNull LazyDaemon<ISession> lazyDaemon, - @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, + @NonNull IBinder token, long requestId, + @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int sensorId, @Nullable IUdfpsOverlayController udfpsOverlayController, boolean isStrongBiometric, int statsClient) { super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, true /* shouldVibrate */, BiometricsProtoEnums.MODALITY_FINGERPRINT, BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient); + setRequestId(requestId); mIsStrongBiometric = isStrongBiometric; mUdfpsOverlayController = udfpsOverlayController; } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java index 102b07493134..377fecac6117 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java @@ -71,6 +71,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicLong; /** * Provider for a single instance of the {@link IFingerprint} HAL. @@ -88,6 +89,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi @NonNull private final LockoutResetDispatcher mLockoutResetDispatcher; @NonNull private final ActivityTaskManager mActivityTaskManager; @NonNull private final BiometricTaskStackListener mTaskStackListener; + // for requests that do not use biometric prompt + @NonNull private final AtomicLong mRequestCounter = new AtomicLong(0); @Nullable private IFingerprint mDaemon; @Nullable private IUdfpsOverlayController mUdfpsOverlayController; @@ -118,8 +121,8 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi && !client.isAlreadyDone()) { Slog.e(getTag(), "Stopping background authentication, top: " + topPackage + " currentClient: " + client); - mSensors.valueAt(i).getScheduler() - .cancelAuthenticationOrDetection(client.getToken()); + mSensors.valueAt(i).getScheduler().cancelAuthenticationOrDetection( + client.getToken(), client.getRequestId()); } } } @@ -369,31 +372,35 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi } @Override - public void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId, + public long scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId, @NonNull ClientMonitorCallbackConverter callback, @NonNull String opPackageName, int statsClient, @NonNull FingerprintStateCallback fingerprintStateCallback) { + final long id = mRequestCounter.incrementAndGet(); + mHandler.post(() -> { final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId); final FingerprintDetectClient client = new FingerprintDetectClient(mContext, - mSensors.get(sensorId).getLazySession(), token, callback, userId, + mSensors.get(sensorId).getLazySession(), token, id, callback, userId, opPackageName, sensorId, mUdfpsOverlayController, isStrongBiometric, statsClient); scheduleForSensor(sensorId, client, fingerprintStateCallback); }); + + return id; } @Override public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback, - @NonNull String opPackageName, boolean restricted, int statsClient, + @NonNull String opPackageName, long requestId, boolean restricted, int statsClient, boolean allowBackgroundAuthentication, @NonNull FingerprintStateCallback fingerprintStateCallback) { mHandler.post(() -> { final boolean isStrongBiometric = Utils.isStrongBiometric(sensorId); final FingerprintAuthenticationClient client = new FingerprintAuthenticationClient( - mContext, mSensors.get(sensorId).getLazySession(), token, callback, userId, - operationId, restricted, opPackageName, cookie, + mContext, mSensors.get(sensorId).getLazySession(), token, requestId, callback, + userId, operationId, restricted, opPackageName, cookie, false /* requireConfirmation */, sensorId, isStrongBiometric, statsClient, mTaskStackListener, mSensors.get(sensorId).getLockoutCache(), mUdfpsOverlayController, allowBackgroundAuthentication, @@ -403,14 +410,29 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi } @Override + public long scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, + int userId, int cookie, @NonNull ClientMonitorCallbackConverter callback, + @NonNull String opPackageName, boolean restricted, int statsClient, + boolean allowBackgroundAuthentication, + @NonNull FingerprintStateCallback fingerprintStateCallback) { + final long id = mRequestCounter.incrementAndGet(); + + scheduleAuthenticate(sensorId, token, operationId, userId, cookie, callback, + opPackageName, id, restricted, statsClient, allowBackgroundAuthentication, + fingerprintStateCallback); + + return id; + } + + @Override public void startPreparedClient(int sensorId, int cookie) { mHandler.post(() -> mSensors.get(sensorId).getScheduler().startPreparedClient(cookie)); } @Override - public void cancelAuthentication(int sensorId, @NonNull IBinder token) { + public void cancelAuthentication(int sensorId, @NonNull IBinder token, long requestId) { mHandler.post(() -> mSensors.get(sensorId).getScheduler() - .cancelAuthenticationOrDetection(token)); + .cancelAuthenticationOrDetection(token, requestId)); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java index 2f5b5c7b9727..f17bcc8c6354 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java @@ -88,6 +88,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; /** * Supports a single instance of the {@link android.hardware.biometrics.fingerprint.V2_1} or @@ -115,6 +116,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider @NonNull private final HalResultController mHalResultController; @Nullable private IUdfpsOverlayController mUdfpsOverlayController; @Nullable private ISidefpsController mSidefpsController; + // for requests that do not use biometric prompt + @NonNull private final AtomicLong mRequestCounter = new AtomicLong(0); private int mCurrentUserId = UserHandle.USER_NULL; private final boolean mIsUdfps; private final int mSensorId; @@ -142,7 +145,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider && !client.isAlreadyDone()) { Slog.e(TAG, "Stopping background authentication, top: " + topPackage + " currentClient: " + client); - mScheduler.cancelAuthenticationOrDetection(client.getToken()); + mScheduler.cancelAuthenticationOrDetection( + client.getToken(), client.getRequestId()); } } }); @@ -591,26 +595,30 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider } @Override - public void scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId, + public long scheduleFingerDetect(int sensorId, @NonNull IBinder token, int userId, @NonNull ClientMonitorCallbackConverter listener, @NonNull String opPackageName, int statsClient, @NonNull FingerprintStateCallback fingerprintStateCallback) { + final long id = mRequestCounter.incrementAndGet(); + mHandler.post(() -> { scheduleUpdateActiveUserWithoutHandler(userId); final boolean isStrongBiometric = Utils.isStrongBiometric(mSensorProperties.sensorId); final FingerprintDetectClient client = new FingerprintDetectClient(mContext, - mLazyDaemon, token, listener, userId, opPackageName, + mLazyDaemon, token, id, listener, userId, opPackageName, mSensorProperties.sensorId, mUdfpsOverlayController, isStrongBiometric, statsClient); mScheduler.scheduleClientMonitor(client, fingerprintStateCallback); }); + + return id; } @Override public void scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, int userId, int cookie, @NonNull ClientMonitorCallbackConverter listener, - @NonNull String opPackageName, boolean restricted, int statsClient, + @NonNull String opPackageName, long requestId, boolean restricted, int statsClient, boolean allowBackgroundAuthentication, @NonNull FingerprintStateCallback fingerprintStateCallback) { mHandler.post(() -> { @@ -618,8 +626,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider final boolean isStrongBiometric = Utils.isStrongBiometric(mSensorProperties.sensorId); final FingerprintAuthenticationClient client = new FingerprintAuthenticationClient( - mContext, mLazyDaemon, token, listener, userId, operationId, restricted, - opPackageName, cookie, false /* requireConfirmation */, + mContext, mLazyDaemon, token, requestId, listener, userId, operationId, + restricted, opPackageName, cookie, false /* requireConfirmation */, mSensorProperties.sensorId, isStrongBiometric, statsClient, mTaskStackListener, mLockoutTracker, mUdfpsOverlayController, allowBackgroundAuthentication, mSensorProperties); @@ -628,14 +636,29 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider } @Override + public long scheduleAuthenticate(int sensorId, @NonNull IBinder token, long operationId, + int userId, int cookie, @NonNull ClientMonitorCallbackConverter listener, + @NonNull String opPackageName, boolean restricted, int statsClient, + boolean allowBackgroundAuthentication, + @NonNull FingerprintStateCallback fingerprintStateCallback) { + final long id = mRequestCounter.incrementAndGet(); + + scheduleAuthenticate(sensorId, token, operationId, userId, cookie, listener, + opPackageName, id, restricted, statsClient, allowBackgroundAuthentication, + fingerprintStateCallback); + + return id; + } + + @Override public void startPreparedClient(int sensorId, int cookie) { mHandler.post(() -> mScheduler.startPreparedClient(cookie)); } @Override - public void cancelAuthentication(int sensorId, @NonNull IBinder token) { + public void cancelAuthentication(int sensorId, @NonNull IBinder token, long requestId) { Slog.d(TAG, "cancelAuthentication, sensorId: " + sensorId); - mHandler.post(() -> mScheduler.cancelAuthenticationOrDetection(token)); + mHandler.post(() -> mScheduler.cancelAuthenticationOrDetection(token, requestId)); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java index 5060744bb33e..7d95ec098fee 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java @@ -59,7 +59,8 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi private boolean mIsPointerDown; FingerprintAuthenticationClient(@NonNull Context context, - @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token, + @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, + @NonNull IBinder token, long requestId, @NonNull ClientMonitorCallbackConverter listener, int targetUserId, long operationId, boolean restricted, @NonNull String owner, int cookie, boolean requireConfirmation, int sensorId, boolean isStrongBiometric, int statsClient, @@ -73,6 +74,7 @@ class FingerprintAuthenticationClient extends AuthenticationClient<IBiometricsFi BiometricsProtoEnums.MODALITY_FINGERPRINT, statsClient, taskStackListener, lockoutTracker, allowBackgroundAuthentication, true /* shouldVibrate */, false /* isKeyguardBypassEnabled */); + setRequestId(requestId); mLockoutFrameworkImpl = lockoutTracker; mUdfpsOverlayController = udfpsOverlayController; mSensorProps = sensorProps; diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java index 8e73ee6b3e9f..147a20699b54 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintDetectClient.java @@ -52,13 +52,15 @@ class FingerprintDetectClient extends AcquisitionClient<IBiometricsFingerprint> private boolean mIsPointerDown; public FingerprintDetectClient(@NonNull Context context, - @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, @NonNull IBinder token, + @NonNull LazyDaemon<IBiometricsFingerprint> lazyDaemon, + @NonNull IBinder token, long requestId, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull String owner, int sensorId, @Nullable IUdfpsOverlayController udfpsOverlayController, boolean isStrongBiometric, int statsClient) { super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId, true /* shouldVibrate */, BiometricsProtoEnums.MODALITY_FINGERPRINT, BiometricsProtoEnums.ACTION_AUTHENTICATE, statsClient); + setRequestId(requestId); mUdfpsOverlayController = udfpsOverlayController; mIsStrongBiometric = isStrongBiometric; } diff --git a/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java index 491818520e3c..5c0c3626037a 100644 --- a/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java +++ b/services/core/java/com/android/server/biometrics/sensors/iris/IrisAuthenticator.java @@ -59,7 +59,7 @@ public final class IrisAuthenticator extends IBiometricAuthenticator.Stub { @Override public void prepareForAuthentication(boolean requireConfirmation, IBinder token, long sessionId, int userId, IBiometricSensorReceiver sensorReceiver, - String opPackageName, int cookie, boolean allowBackgroundAuthentication) + String opPackageName, long requestId, int cookie, boolean allowBackgroundAuthentication) throws RemoteException { } @@ -68,7 +68,7 @@ public final class IrisAuthenticator extends IBiometricAuthenticator.Stub { } @Override - public void cancelAuthenticationFromService(IBinder token, String opPackageName) + public void cancelAuthenticationFromService(IBinder token, String opPackageName, long requestId) throws RemoteException { } diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java index 6610e8c4392b..42b676f0d816 100644 --- a/services/core/java/com/android/server/camera/CameraServiceProxy.java +++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java @@ -692,8 +692,11 @@ public class CameraServiceProxy extends SystemService } try { - WindowManagerGlobal.getWindowManagerService().registerDisplayWindowListener( - mDisplayWindowListener); + int[] displayIds = WindowManagerGlobal.getWindowManagerService() + .registerDisplayWindowListener(mDisplayWindowListener); + for (int i = 0; i < displayIds.length; i++) { + mDisplayWindowListener.onDisplayAdded(displayIds[i]); + } } catch (RemoteException e) { Log.e(TAG, "Failed to register display window listener!"); } diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index d66d7ee99f2e..5797b061f2d0 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -36,9 +36,14 @@ import android.hardware.display.DisplayManagerInternal.RefreshRateRange; import android.hardware.fingerprint.IUdfpsHbmListener; import android.net.Uri; import android.os.Handler; +import android.os.IThermalEventListener; +import android.os.IThermalService; import android.os.Looper; import android.os.Message; +import android.os.RemoteException; +import android.os.ServiceManager; import android.os.SystemClock; +import android.os.Temperature; import android.os.UserHandle; import android.provider.DeviceConfig; import android.provider.Settings; @@ -108,6 +113,7 @@ public class DisplayModeDirector { private final UdfpsObserver mUdfpsObserver; private final SensorObserver mSensorObserver; private final HbmObserver mHbmObserver; + private final SkinThermalStatusObserver mSkinThermalStatusObserver; private final DeviceConfigInterface mDeviceConfig; private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings; @@ -156,6 +162,7 @@ public class DisplayModeDirector { }; mSensorObserver = new SensorObserver(context, ballotBox, injector); mHbmObserver = new HbmObserver(injector, ballotBox, BackgroundThread.getHandler()); + mSkinThermalStatusObserver = new SkinThermalStatusObserver(injector, ballotBox); mDeviceConfigDisplaySettings = new DeviceConfigDisplaySettings(); mDeviceConfig = injector.getDeviceConfig(); mAlwaysRespectAppRequest = false; @@ -174,6 +181,7 @@ public class DisplayModeDirector { mBrightnessObserver.observe(sensorManager); mSensorObserver.observe(); mHbmObserver.observe(); + mSkinThermalStatusObserver.observe(); synchronized (mLock) { // We may have a listener already registered before the call to start, so go ahead and // notify them to pick up our newly initialized state. @@ -606,6 +614,7 @@ public class DisplayModeDirector { mUdfpsObserver.dumpLocked(pw); mSensorObserver.dumpLocked(pw); mHbmObserver.dumpLocked(pw); + mSkinThermalStatusObserver.dumpLocked(pw); } } @@ -714,7 +723,6 @@ public class DisplayModeDirector { return mUdfpsObserver; } - @VisibleForTesting DesiredDisplayModeSpecs getDesiredDisplayModeSpecsWithInjectedFpsSettings( float minRefreshRate, float peakRefreshRate, float defaultRefreshRate) { @@ -950,16 +958,19 @@ public class DisplayModeDirector { // user seeing the display flickering when the switches occur. public static final int PRIORITY_FLICKER_REFRESH_RATE_SWITCH = 8; + // Force display to [0, 60HZ] if skin temperature is at or above CRITICAL. + public static final int PRIORITY_SKIN_TEMPERATURE = 9; + // High-brightness-mode may need a specific range of refresh-rates to function properly. - public static final int PRIORITY_HIGH_BRIGHTNESS_MODE = 9; + public static final int PRIORITY_HIGH_BRIGHTNESS_MODE = 10; // The proximity sensor needs the refresh rate to be locked in order to function, so this is // set to a high priority. - public static final int PRIORITY_PROXIMITY = 10; + public static final int PRIORITY_PROXIMITY = 11; // The Under-Display Fingerprint Sensor (UDFPS) needs the refresh rate to be locked in order // to function, so this needs to be the highest priority of all votes. - public static final int PRIORITY_UDFPS = 11; + public static final int PRIORITY_UDFPS = 12; // Whenever a new priority is added, remember to update MIN_PRIORITY, MAX_PRIORITY, and // APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF, as well as priorityToString. @@ -1054,6 +1065,8 @@ public class DisplayModeDirector { return "PRIORITY_PROXIMITY"; case PRIORITY_LOW_POWER_MODE: return "PRIORITY_LOW_POWER_MODE"; + case PRIORITY_SKIN_TEMPERATURE: + return "PRIORITY_SKIN_TEMPERATURE"; case PRIORITY_UDFPS: return "PRIORITY_UDFPS"; case PRIORITY_USER_SETTING_MIN_REFRESH_RATE: @@ -2309,6 +2322,52 @@ public class DisplayModeDirector { } } + private final class SkinThermalStatusObserver extends IThermalEventListener.Stub { + private final BallotBox mBallotBox; + private final Injector mInjector; + + private @Temperature.ThrottlingStatus int mStatus = -1; + + SkinThermalStatusObserver(Injector injector, BallotBox ballotBox) { + mInjector = injector; + mBallotBox = ballotBox; + } + + @Override + public void notifyThrottling(Temperature temp) { + mStatus = temp.getStatus(); + if (mLoggingEnabled) { + Slog.d(TAG, "New thermal throttling status " + + ", current thermal status = " + mStatus); + } + final Vote vote; + if (mStatus >= Temperature.THROTTLING_CRITICAL) { + vote = Vote.forRefreshRates(0f, 60f); + } else { + vote = null; + } + mBallotBox.vote(GLOBAL_ID, Vote.PRIORITY_SKIN_TEMPERATURE, vote); + } + + public void observe() { + IThermalService thermalService = mInjector.getThermalService(); + if (thermalService == null) { + Slog.w(TAG, "Could not observe thermal status. Service not available"); + return; + } + try { + thermalService.registerThermalEventListenerWithType(this, Temperature.TYPE_SKIN); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to register thermal status listener", e); + } + } + + void dumpLocked(PrintWriter writer) { + writer.println(" SkinThermalStatusObserver:"); + writer.println(" mStatus: " + mStatus); + } + } + private class DeviceConfigDisplaySettings implements DeviceConfig.OnPropertiesChangedListener { public DeviceConfigDisplaySettings() { } @@ -2470,6 +2529,8 @@ public class DisplayModeDirector { BrightnessInfo getBrightnessInfo(int displayId); boolean isDozeState(Display d); + + IThermalService getThermalService(); } @VisibleForTesting @@ -2530,6 +2591,12 @@ public class DisplayModeDirector { return Display.isDozeState(d.getState()); } + @Override + public IThermalService getThermalService() { + return IThermalService.Stub.asInterface( + ServiceManager.getService(Context.THERMAL_SERVICE)); + } + private DisplayManager getDisplayManager() { if (mDisplayManager == null) { mDisplayManager = mContext.getSystemService(DisplayManager.class); diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 17697127d508..5a9efd707f5d 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -601,8 +601,6 @@ final class LocalDisplayAdapter extends DisplayAdapter { && SystemProperties.getBoolean(PROPERTY_EMULATOR_CIRCULAR, false))) { mInfo.flags |= DisplayDeviceInfo.FLAG_ROUND; } - mInfo.roundedCorners = RoundedCorners.fromResources( - res, mInfo.width, mInfo.height); } else { if (!res.getBoolean( com.android.internal.R.bool.config_localDisplaysMirrorContent)) { @@ -620,6 +618,9 @@ final class LocalDisplayAdapter extends DisplayAdapter { mInfo.displayCutout = DisplayCutout.fromResourcesRectApproximation(res, mInfo.uniqueId, mInfo.width, mInfo.height); + mInfo.roundedCorners = RoundedCorners.fromResources( + res, mInfo.uniqueId, mInfo.width, mInfo.height); + if (mStaticDisplayInfo.isInternal) { mInfo.type = Display.TYPE_INTERNAL; mInfo.touch = DisplayDeviceInfo.TOUCH_INTERNAL; diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java index 8955c288391f..62d8c320a13c 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -1078,7 +1078,7 @@ public class LocationProviderManager extends } private void onTransportFailure(Exception e) { - if (e instanceof RemoteException) { + if (e instanceof PendingIntent.CanceledException) { Log.w(TAG, mName + " provider registration " + getIdentity() + " removed", e); synchronized (mLock) { remove(); diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index ff7e903e80d8..b58ca1f4ef80 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -785,13 +785,14 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void showAuthenticationDialog(PromptInfo promptInfo, IBiometricSysuiReceiver receiver, int[] sensorIds, boolean credentialAllowed, boolean requireConfirmation, - int userId, String opPackageName, long operationId, + int userId, long operationId, String opPackageName, long requestId, @BiometricMultiSensorMode int multiSensorConfig) { enforceBiometricDialog(); if (mBar != null) { try { mBar.showAuthenticationDialog(promptInfo, receiver, sensorIds, credentialAllowed, - requireConfirmation, userId, opPackageName, operationId, multiSensorConfig); + requireConfirmation, userId, operationId, opPackageName, requestId, + multiSensorConfig); } catch (RemoteException ex) { } } diff --git a/services/core/java/com/android/server/vr/Vr2dDisplay.java b/services/core/java/com/android/server/vr/Vr2dDisplay.java index a713e5b13667..39d7a1555dfc 100644 --- a/services/core/java/com/android/server/vr/Vr2dDisplay.java +++ b/services/core/java/com/android/server/vr/Vr2dDisplay.java @@ -302,7 +302,8 @@ class Vr2dDisplay { builder.setUniqueId(UNIQUE_DISPLAY_ID); builder.setFlags(flags); mVirtualDisplay = mDisplayManager.createVirtualDisplay(null /* projection */, - builder.build(), null /* callback */, null /* handler */); + builder.build(), null /* callback */, null /* handler */, + null /* windowContext */); if (mVirtualDisplay != null) { updateDisplayId(mVirtualDisplay.getDisplay().getDisplayId()); diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index a4d2348d03f1..cea30ed3e299 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -43,6 +43,7 @@ import static com.android.server.accessibility.AccessibilityTraceProto.WHERE; import static com.android.server.accessibility.AccessibilityTraceProto.WINDOW_MANAGER_SERVICE; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; +import static com.android.server.wm.WindowTracing.WINSCOPE_EXT; import static com.android.server.wm.utils.RegionUtils.forEachRect; import android.accessibilityservice.AccessibilityTrace; @@ -2081,7 +2082,7 @@ final class AccessibilityController { } private static final int BUFFER_CAPACITY = 1024 * 1024 * 12; - private static final String TRACE_FILENAME = "/data/misc/a11ytrace/a11y_trace.pb"; + private static final String TRACE_FILENAME = "/data/misc/a11ytrace/a11y_trace" + WINSCOPE_EXT; private static final String TAG = "AccessibilityTracing"; private static final long MAGIC_NUMBER_VALUE = ((long) MAGIC_NUMBER_H << 32) | MAGIC_NUMBER_L; diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index d7c3e7067e94..73faca70de6b 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -316,7 +316,7 @@ import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.view.WindowManager.TransitionOldType; import android.view.animation.Animation; -import android.window.IRemoteTransition; +import android.window.RemoteTransition; import android.window.SizeConfigurationBuckets; import android.window.SplashScreen; import android.window.SplashScreenView; @@ -490,7 +490,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A private ActivityOptions mPendingOptions; /** Non-null if {@link #mPendingOptions} specifies the remote animation. */ private RemoteAnimationAdapter mPendingRemoteAnimation; - private IRemoteTransition mPendingRemoteTransition; + private RemoteTransition mPendingRemoteTransition; ActivityOptions returningOptions; // options that are coming back via convertToTranslucent AppTimeTracker appTimeTracker; // set if we are tracking the time in this app/task/activity ActivityServiceConnectionsHolder mServiceConnectionsHolder; // Service connections. @@ -1021,7 +1021,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A pw.println(mPendingRemoteAnimation.getCallingPid()); } if (mPendingRemoteTransition != null) { - pw.print(prefix + " pendingRemoteTransition=" + mPendingRemoteTransition); + pw.print(prefix + " pendingRemoteTransition=" + + mPendingRemoteTransition.getRemoteTransition()); } if (appTimeTracker != null) { appTimeTracker.dumpWithHeader(pw, prefix, false); @@ -1353,14 +1354,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A updatePictureInPictureMode(null, false); } else { mLastReportedMultiWindowMode = inMultiWindowMode; - // If the activity is in stopping or stopped state, for instance, it's in the - // split screen task and not the top one, the last configuration it should keep - // is the one before multi-window mode change. - final State state = getState(); - if (state != STOPPED && state != STOPPING) { - ensureActivityConfiguration(0 /* globalChanges */, PRESERVE_WINDOWS, - true /* ignoreVisibility */); - } + ensureActivityConfiguration(0 /* globalChanges */, PRESERVE_WINDOWS, + false /* ignoreVisibility */); } } } @@ -4584,8 +4579,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return opts; } - IRemoteTransition takeRemoteTransition() { - IRemoteTransition out = mPendingRemoteTransition; + RemoteTransition takeRemoteTransition() { + RemoteTransition out = mPendingRemoteTransition; mPendingRemoteTransition = null; return out; } @@ -4899,6 +4894,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // getting visible so we also wait for them. forAllWindows(mWmService::makeWindowFreezingScreenIfNeededLocked, true); } + // dispatchTaskInfoChangedIfNeeded() right after ActivityRecord#setVisibility() can report + // the stale visible state, because the state will be updated after the app transition. + // So tries to report the actual visible state again where the state is changed. + if (task != null) task.dispatchTaskInfoChangedIfNeeded(false /* force */); ProtoLog.v(WM_DEBUG_APP_TRANSITIONS, "commitVisibility: %s: visible=%b mVisibleRequested=%b", this, isVisible(), mVisibleRequested); @@ -6950,7 +6949,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A Rect appRect; if (win != null) { insets = win.getInsetsStateWithVisibilityOverride().calculateInsets( - win.getFrame(), Type.systemBars(), false /* ignoreVisibility */); + win.getFrame(), Type.systemBars(), false /* ignoreVisibility */).toRect(); appRect = new Rect(win.getFrame()); appRect.inset(insets); } else { @@ -9218,7 +9217,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return null; } final Rect insets = mainWindow.getInsetsStateWithVisibilityOverride().calculateInsets( - task.getBounds(), Type.systemBars(), false /* ignoreVisibility */); + task.getBounds(), Type.systemBars(), false /* ignoreVisibility */).toRect(); InsetUtils.addInsets(insets, getLetterboxInsets()); return new RemoteAnimationTarget(task.mTaskId, record.getMode(), diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index ab97094c0e6a..3b43e48a53af 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -115,7 +115,7 @@ import android.util.ArraySet; import android.util.DebugUtils; import android.util.Pools.SynchronizedPool; import android.util.Slog; -import android.window.IRemoteTransition; +import android.window.RemoteTransition; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.HeavyWeightSwitcherActivity; @@ -1568,7 +1568,7 @@ class ActivityStarter { final Transition newTransition = (!mService.getTransitionController().isCollecting() && mService.getTransitionController().getTransitionPlayer() != null) ? mService.getTransitionController().createTransition(TRANSIT_OPEN) : null; - IRemoteTransition remoteTransition = r.takeRemoteTransition(); + RemoteTransition remoteTransition = r.takeRemoteTransition(); if (newTransition != null && remoteTransition != null) { newTransition.setRemoteTransition(remoteTransition); } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index c1d6c1765a7a..3dff680c9497 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -377,6 +377,8 @@ public class DisplayPolicy { private PointerLocationView mPointerLocationView; + private int mDisplayCutoutTouchableRegionSize; + /** * The area covered by system windows which belong to another display. Forwarded insets is set * in case this is a virtual display, this is displayed on another display that has insets, and @@ -480,7 +482,8 @@ public class DisplayPolicy { if (mStatusBar != null) { requestTransientBars(mStatusBar); } - checkAltBarSwipeForTransientBars(ALT_BAR_TOP); + checkAltBarSwipeForTransientBars(ALT_BAR_TOP, + false /* allowForAllPositions */); } } @@ -491,7 +494,8 @@ public class DisplayPolicy { && mNavigationBarPosition == NAV_BAR_BOTTOM) { requestTransientBars(mNavigationBar); } - checkAltBarSwipeForTransientBars(ALT_BAR_BOTTOM); + checkAltBarSwipeForTransientBars(ALT_BAR_BOTTOM, + false /* allowForAllPositions */); } } @@ -501,13 +505,13 @@ public class DisplayPolicy { synchronized (mLock) { mDisplayContent.calculateSystemGestureExclusion( excludedRegion, null /* outUnrestricted */); - final boolean excluded = - mSystemGestures.currentGestureStartedInRegion(excludedRegion); + final boolean allowSideSwipe = mNavigationBarAlwaysShowOnSideGesture && + !mSystemGestures.currentGestureStartedInRegion(excludedRegion); if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_RIGHT - || !excluded && mNavigationBarAlwaysShowOnSideGesture)) { + || allowSideSwipe)) { requestTransientBars(mNavigationBar); } - checkAltBarSwipeForTransientBars(ALT_BAR_RIGHT); + checkAltBarSwipeForTransientBars(ALT_BAR_RIGHT, allowSideSwipe); } excludedRegion.recycle(); } @@ -518,13 +522,13 @@ public class DisplayPolicy { synchronized (mLock) { mDisplayContent.calculateSystemGestureExclusion( excludedRegion, null /* outUnrestricted */); - final boolean excluded = - mSystemGestures.currentGestureStartedInRegion(excludedRegion); + final boolean allowSideSwipe = mNavigationBarAlwaysShowOnSideGesture && + !mSystemGestures.currentGestureStartedInRegion(excludedRegion); if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_LEFT - || !excluded && mNavigationBarAlwaysShowOnSideGesture)) { + || allowSideSwipe)) { requestTransientBars(mNavigationBar); } - checkAltBarSwipeForTransientBars(ALT_BAR_LEFT); + checkAltBarSwipeForTransientBars(ALT_BAR_LEFT, allowSideSwipe); } excludedRegion.recycle(); } @@ -678,17 +682,19 @@ public class DisplayPolicy { mHandler.post(mGestureNavigationSettingsObserver::register); } - private void checkAltBarSwipeForTransientBars(@WindowManagerPolicy.AltBarPosition int pos) { - if (mStatusBarAlt != null && mStatusBarAltPosition == pos) { + private void checkAltBarSwipeForTransientBars(@WindowManagerPolicy.AltBarPosition int pos, + boolean allowForAllPositions) { + if (mStatusBarAlt != null && (mStatusBarAltPosition == pos || allowForAllPositions)) { requestTransientBars(mStatusBarAlt); } - if (mNavigationBarAlt != null && mNavigationBarAltPosition == pos) { + if (mNavigationBarAlt != null + && (mNavigationBarAltPosition == pos || allowForAllPositions)) { requestTransientBars(mNavigationBarAlt); } - if (mClimateBarAlt != null && mClimateBarAltPosition == pos) { + if (mClimateBarAlt != null && (mClimateBarAltPosition == pos || allowForAllPositions)) { requestTransientBars(mClimateBarAlt); } - if (mExtraNavBarAlt != null && mExtraNavBarAltPosition == pos) { + if (mExtraNavBarAlt != null && (mExtraNavBarAltPosition == pos || allowForAllPositions)) { requestTransientBars(mExtraNavBarAlt); } } @@ -1109,8 +1115,21 @@ public class DisplayPolicy { rect.bottom = rect.top + getStatusBarHeight(displayFrames); } }; + final TriConsumer<DisplayFrames, WindowState, Rect> gestureFrameProvider = + (displayFrames, windowState, rect) -> { + rect.bottom = rect.top + getStatusBarHeight(displayFrames); + final DisplayCutout cutout = + displayFrames.mInsetsState.getDisplayCutout(); + if (cutout != null) { + final Rect top = cutout.getBoundingRectTop(); + if (!top.isEmpty()) { + rect.bottom = rect.bottom + mDisplayCutoutTouchableRegionSize; + } + } + }; mDisplayContent.setInsetProvider(ITYPE_STATUS_BAR, win, frameProvider); - mDisplayContent.setInsetProvider(ITYPE_TOP_MANDATORY_GESTURES, win, frameProvider); + mDisplayContent.setInsetProvider( + ITYPE_TOP_MANDATORY_GESTURES, win, gestureFrameProvider); mDisplayContent.setInsetProvider(ITYPE_TOP_TAPPABLE_ELEMENT, win, frameProvider); break; case TYPE_NAVIGATION_BAR: @@ -1175,6 +1194,12 @@ public class DisplayPolicy { default: if (attrs.providesInsetsTypes != null) { for (@InternalInsetsType int insetsType : attrs.providesInsetsTypes) { + final TriConsumer<DisplayFrames, WindowState, Rect> imeFrameProvider = + !attrs.providedInternalImeInsets.equals(Insets.NONE) + ? (displayFrames, windowState, inOutFrame) -> + inOutFrame.inset(windowState.getLayoutingAttrs( + displayFrames.mRotation).providedInternalImeInsets) + : null; switch (insetsType) { case ITYPE_STATUS_BAR: mStatusBarAlt = win; @@ -1194,12 +1219,13 @@ public class DisplayPolicy { break; } if (!INSETS_LAYOUT_GENERALIZATION) { - mDisplayContent.setInsetProvider(insetsType, win, null); + mDisplayContent.setInsetProvider(insetsType, win, null, + imeFrameProvider); } else { mDisplayContent.setInsetProvider(insetsType, win, (displayFrames, windowState, inOutFrame) -> inOutFrame.inset( windowState.getLayoutingAttrs(displayFrames.mRotation) - .providedInternalInsets)); + .providedInternalInsets), imeFrameProvider); } } } @@ -2091,11 +2117,14 @@ public class DisplayPolicy { mStatusBarHeightForRotation[landscapeRotation] = mStatusBarHeightForRotation[seascapeRotation] = res.getDimensionPixelSize(R.dimen.status_bar_height_landscape); + mDisplayCutoutTouchableRegionSize = res.getDimensionPixelSize( + R.dimen.display_cutout_touchable_region_size); } else { mStatusBarHeightForRotation[portraitRotation] = mStatusBarHeightForRotation[upsideDownRotation] = mStatusBarHeightForRotation[landscapeRotation] = mStatusBarHeightForRotation[seascapeRotation] = 0; + mDisplayCutoutTouchableRegionSize = 0; } // Height of the navigation bar when presented horizontally at bottom @@ -2255,7 +2284,10 @@ public class DisplayPolicy { void notifyDisplayReady() { mHandler.post(() -> { final int displayId = getDisplayId(); - getStatusBarManagerInternal().onDisplayReady(displayId); + StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); + if (statusBar != null) { + statusBar.onDisplayReady(displayId); + } final WallpaperManagerInternal wpMgr = LocalServices .getService(WallpaperManagerInternal.class); if (wpMgr != null) { @@ -2391,7 +2423,7 @@ public class DisplayPolicy { */ float getWindowCornerRadius() { return mDisplayContent.getDisplay().getType() == TYPE_INTERNAL - ? ScreenDecorationsUtils.getWindowCornerRadius(mContext.getResources()) : 0f; + ? ScreenDecorationsUtils.getWindowCornerRadius(mContext) : 0f; } boolean isShowingDreamLw() { diff --git a/services/core/java/com/android/server/wm/DisplayWindowListenerController.java b/services/core/java/com/android/server/wm/DisplayWindowListenerController.java index b627b33c036e..4141090f7fa0 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowListenerController.java +++ b/services/core/java/com/android/server/wm/DisplayWindowListenerController.java @@ -19,6 +19,7 @@ package com.android.server.wm; import android.content.res.Configuration; import android.os.RemoteCallbackList; import android.os.RemoteException; +import android.util.IntArray; import android.view.IDisplayWindowListener; /** @@ -28,23 +29,20 @@ import android.view.IDisplayWindowListener; class DisplayWindowListenerController { RemoteCallbackList<IDisplayWindowListener> mDisplayListeners = new RemoteCallbackList<>(); -// private final ArrayList<DisplayContainerListener> mDisplayListeners = new ArrayList<>(); private final WindowManagerService mService; DisplayWindowListenerController(WindowManagerService service) { mService = service; } - void registerListener(IDisplayWindowListener listener) { + int[] registerListener(IDisplayWindowListener listener) { synchronized (mService.mGlobalLock) { mDisplayListeners.register(listener); - try { - for (int i = 0; i < mService.mAtmService.mRootWindowContainer.getChildCount(); - ++i) { - DisplayContent d = mService.mAtmService.mRootWindowContainer.getChildAt(i); - listener.onDisplayAdded(d.mDisplayId); - } - } catch (RemoteException e) { } + final IntArray displayIds = new IntArray(); + mService.mAtmService.mRootWindowContainer.forAllDisplays((displayContent) -> { + displayIds.add(displayContent.mDisplayId); + }); + return displayIds.toArray(); } } diff --git a/services/core/java/com/android/server/wm/DisplayWindowSettingsProvider.java b/services/core/java/com/android/server/wm/DisplayWindowSettingsProvider.java index 8fcdf2e96889..4a70fa336838 100644 --- a/services/core/java/com/android/server/wm/DisplayWindowSettingsProvider.java +++ b/services/core/java/com/android/server/wm/DisplayWindowSettingsProvider.java @@ -264,8 +264,14 @@ class DisplayWindowSettingsProvider implements SettingsProvider { @NonNull private static AtomicFile getVendorSettingsFile() { - final File vendorFile = new File(Environment.getVendorDirectory(), + // First look under product path for treblized builds. + File vendorFile = new File(Environment.getProductDirectory(), VENDOR_DISPLAY_SETTINGS_FILE_PATH); + if (!vendorFile.exists()) { + // Try and look in vendor path. + vendorFile = new File(Environment.getVendorDirectory(), + VENDOR_DISPLAY_SETTINGS_FILE_PATH); + } return new AtomicFile(vendorFile, WM_DISPLAY_COMMIT_TAG); } diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java index 869d351df7b3..3d19f54ad132 100644 --- a/services/core/java/com/android/server/wm/InsetsPolicy.java +++ b/services/core/java/com/android/server/wm/InsetsPolicy.java @@ -43,16 +43,20 @@ import android.view.InsetsSource; import android.view.InsetsSourceControl; import android.view.InsetsState; import android.view.InsetsState.InternalInsetsType; +import android.view.InternalInsetsAnimationController; import android.view.SurfaceControl; import android.view.SyncRtSurfaceTransactionApplier; +import android.view.WindowInsets.Type; import android.view.WindowInsetsAnimation; import android.view.WindowInsetsAnimation.Bounds; import android.view.WindowInsetsAnimationControlListener; +import android.view.WindowInsetsAnimationController; import android.view.WindowManager; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.server.DisplayThread; +import com.android.server.statusbar.StatusBarManagerInternal; /** * Policy that implements who gets control over the windows generating insets. @@ -169,8 +173,12 @@ class InsetsPolicy { changed = true; } if (changed) { - mPolicy.getStatusBarManagerInternal().showTransient(mDisplayContent.getDisplayId(), - mShowingTransientTypes.toArray()); + StatusBarManagerInternal statusBarManagerInternal = + mPolicy.getStatusBarManagerInternal(); + if (statusBarManagerInternal != null) { + statusBarManagerInternal.showTransient( + mDisplayContent.getDisplayId(), mShowingTransientTypes.toArray()); + } updateBarControlTarget(mFocusedWin); // The leashes can be created while updating bar control target. The surface transaction @@ -305,9 +313,11 @@ class InsetsPolicy { abortTypes.add(type); } } - if (abortTypes.size() > 0) { - mPolicy.getStatusBarManagerInternal().abortTransient(mDisplayContent.getDisplayId(), - abortTypes.toArray()); + StatusBarManagerInternal statusBarManagerInternal = + mPolicy.getStatusBarManagerInternal(); + if (abortTypes.size() > 0 && statusBarManagerInternal != null) { + statusBarManagerInternal.abortTransient( + mDisplayContent.getDisplayId(), abortTypes.toArray()); } } } @@ -317,14 +327,17 @@ class InsetsPolicy { * updateBarControlTarget(mFocusedWin) after this invocation. */ private void abortTransient() { - mPolicy.getStatusBarManagerInternal().abortTransient(mDisplayContent.getDisplayId(), - mShowingTransientTypes.toArray()); + StatusBarManagerInternal statusBarManagerInternal = mPolicy.getStatusBarManagerInternal(); + if (statusBarManagerInternal != null) { + statusBarManagerInternal.abortTransient( + mDisplayContent.getDisplayId(), mShowingTransientTypes.toArray()); + } mShowingTransientTypes.clear(); } private @Nullable InsetsControlTarget getStatusControlTarget(@Nullable WindowState focusedWin, boolean fake) { - if (mShowingTransientTypes.indexOf(ITYPE_STATUS_BAR) != -1 && !fake) { + if (!fake && isShowingTransientTypes(Type.statusBars())) { return mDummyControlTarget; } final WindowState notificationShade = mPolicy.getNotificationShade(); @@ -374,7 +387,7 @@ class InsetsPolicy { // Force showing navigation bar while IME is visible. return null; } - if (mShowingTransientTypes.indexOf(ITYPE_NAVIGATION_BAR) != -1 && !fake) { + if (!fake && isShowingTransientTypes(Type.navigationBars())) { return mDummyControlTarget; } if (focusedWin == mPolicy.getNotificationShade()) { @@ -400,6 +413,16 @@ class InsetsPolicy { return focusedWin; } + private boolean isShowingTransientTypes(@Type.InsetsType int types) { + final IntArray showingTransientTypes = mShowingTransientTypes; + for (int i = showingTransientTypes.size() - 1; i >= 0; i--) { + if ((InsetsState.toPublicType(showingTransientTypes.get(i)) & types) != 0) { + return true; + } + } + return false; + } + /** * Determines whether the remote insets controller should take control of system bars for all * windows. @@ -477,8 +500,12 @@ class InsetsPolicy { final int state = visible ? WINDOW_STATE_SHOWING : WINDOW_STATE_HIDDEN; if (mState != state) { mState = state; - mPolicy.getStatusBarManagerInternal().setWindowState( - mDisplayContent.getDisplayId(), mId, state); + StatusBarManagerInternal statusBarManagerInternal = + mPolicy.getStatusBarManagerInternal(); + if (statusBarManagerInternal != null) { + statusBarManagerInternal.setWindowState( + mDisplayContent.getDisplayId(), mId, state); + } } } } @@ -570,8 +597,8 @@ class InsetsPolicy { } @Override - public void startAnimation(InsetsAnimationControlImpl controller, - WindowInsetsAnimationControlListener listener, int types, + public <T extends InsetsAnimationControlRunner & InternalInsetsAnimationController> + void startAnimation(T runner, WindowInsetsAnimationControlListener listener, int types, WindowInsetsAnimation animation, Bounds bounds) { } diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index e8d9c15b0c07..ba85c9800e56 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -581,7 +581,7 @@ public class RecentsAnimationController implements DeathRecipient { contentInsets = targetAppMainWindow .getInsetsStateWithVisibilityOverride() .calculateInsets(mTargetActivityRecord.getBounds(), Type.systemBars(), - false /* ignoreVisibility */); + false /* ignoreVisibility */).toRect(); } else { // If the window for the activity had not yet been created, use the display insets. mService.getStableInsets(mDisplayId, mTmpRect); @@ -1209,7 +1209,7 @@ public class RecentsAnimationController implements DeathRecipient { return null; } final Rect insets = mainWindow.getInsetsStateWithVisibilityOverride().calculateInsets( - mBounds, Type.systemBars(), false /* ignoreVisibility */); + mBounds, Type.systemBars(), false /* ignoreVisibility */).toRect(); InsetUtils.addInsets(insets, mainWindow.mActivityRecord.getLetterboxInsets()); final int mode = topApp.getActivityType() == mTargetActivityType ? MODE_OPENING diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 43af139889f2..7c939e67077c 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -2079,12 +2079,18 @@ class TaskFragment extends WindowContainer<WindowContainer> { } final Point positionInParent = new Point(); getRelativePosition(positionInParent); + final int[] runningActivityCount = new int[1]; + forAllActivities(a -> { + if (!a.finishing) { + runningActivityCount[0]++; + } + }); return new TaskFragmentInfo( mFragmentToken, mRemoteToken.toWindowContainerToken(), getConfiguration(), getChildCount() == 0, - hasRunningActivity(this), + runningActivityCount[0], isVisible(), childActivities, positionInParent); diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index e74371036619..63951d970808 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -683,7 +683,8 @@ class TaskSnapshotController { } static Rect getSystemBarInsets(Rect frame, InsetsState state) { - return state.calculateInsets(frame, Type.systemBars(), false /* ignoreVisibility */); + return state.calculateInsets( + frame, Type.systemBars(), false /* ignoreVisibility */).toRect(); } void dump(PrintWriter pw, String prefix) { diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 07f0197f520b..6b93364232d7 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -70,7 +70,7 @@ import android.util.ArraySet; import android.util.Slog; import android.view.SurfaceControl; import android.view.animation.Animation; -import android.window.IRemoteTransition; +import android.window.RemoteTransition; import android.window.TransitionInfo; import com.android.internal.annotations.VisibleForTesting; @@ -123,7 +123,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe private @TransitionFlags int mFlags; private final TransitionController mController; private final BLASTSyncEngine mSyncEngine; - private IRemoteTransition mRemoteTransition = null; + private RemoteTransition mRemoteTransition = null; /** Only use for clean-up after binder death! */ private SurfaceControl.Transaction mStartTransaction = null; @@ -436,11 +436,11 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe mSyncEngine.abort(mSyncId); } - void setRemoteTransition(IRemoteTransition remoteTransition) { + void setRemoteTransition(RemoteTransition remoteTransition) { mRemoteTransition = remoteTransition; } - IRemoteTransition getRemoteTransition() { + RemoteTransition getRemoteTransition() { return mRemoteTransition; } @@ -565,7 +565,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe if (mFinishTransaction != null) { mFinishTransaction.apply(); } - finishTransition(); + mController.finishTransition(this); } /** @see RecentsAnimationController#attachNavigationBarToApp */ @@ -978,7 +978,7 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe // Wallpaper must be the top (regardless of how nested it is in DisplayAreas). boolean skipIntermediateReports = isWallpaper(wc); for (WindowContainer p = wc.getParent(); p != null; p = p.getParent()) { - if (!p.isAttached() || !changes.get(p).hasChanged(p)) { + if (!p.isAttached() || changes.get(p) == null || !changes.get(p).hasChanged(p)) { // Again, we're skipping no-ops break; } diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index 419b4c3a706d..69e6a541e009 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -34,6 +34,7 @@ import android.util.proto.ProtoOutputStream; import android.view.WindowManager; import android.window.IRemoteTransition; import android.window.ITransitionPlayer; +import android.window.RemoteTransition; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; @@ -223,7 +224,7 @@ class TransitionController { @Nullable Transition requestTransitionIfNeeded(@WindowManager.TransitionType int type, @WindowManager.TransitionFlags int flags, @Nullable WindowContainer trigger, - @NonNull WindowContainer readyGroupRef, @Nullable IRemoteTransition remoteTransition) { + @NonNull WindowContainer readyGroupRef, @Nullable RemoteTransition remoteTransition) { if (mTransitionPlayer == null) { return null; } @@ -252,7 +253,7 @@ class TransitionController { /** Asks the transition player (shell) to start a created but not yet started transition. */ @NonNull Transition requestStartTransition(@NonNull Transition transition, @Nullable Task startTask, - @Nullable IRemoteTransition remoteTransition) { + @Nullable RemoteTransition remoteTransition) { try { ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Requesting StartTransition: %s", transition); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 4f3c6d5b6b5f..4340a365775a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4340,13 +4340,18 @@ public class WindowManagerService extends IWindowManager.Stub } } - /** Registers a hierarchy listener that gets callbacks when the hierarchy changes. */ + /** + * Registers a hierarchy listener that gets callbacks when the hierarchy changes. The listener's + * onDisplayAdded() will not be called for the displays returned. + * + * @return the displayIds for the existing displays + */ @Override - public void registerDisplayWindowListener(IDisplayWindowListener listener) { + public int[] registerDisplayWindowListener(IDisplayWindowListener listener) { mAtmService.enforceTaskPermission("registerDisplayWindowListener"); final long ident = Binder.clearCallingIdentity(); try { - mDisplayNotificationController.registerListener(listener); + return mDisplayNotificationController.registerListener(listener); } finally { Binder.restoreCallingIdentity(ident); } diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index b568774903c2..8bcd62dffca1 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -275,8 +275,6 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub syncId = startSyncWithOrganizer(callback); applyTransaction(t, syncId, null /* transition */, caller); setSyncReady(syncId); - mService.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY) - .executeAppTransition(); } } finally { Binder.restoreCallingIdentity(ident); @@ -653,18 +651,10 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub options = activityOptions.toBundle(); } - int res = mService.mAmInternal.sendIntentSender(hop.getPendingIntent().getTarget(), + mService.mAmInternal.sendIntentSender(hop.getPendingIntent().getTarget(), hop.getPendingIntent().getWhitelistToken(), 0 /* code */, hop.getActivityIntent(), resolvedType, null /* finishReceiver */, null /* requiredPermission */, options); - if (res != ActivityManager.START_SUCCESS - && res != ActivityManager.START_TASK_TO_FRONT) { - if (!mTransitionController.isShellTransitionsEnabled()) { - final DisplayContent dc = - mService.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY); - dc.cancelAppTransition(); - } - } break; case HIERARCHY_OP_TYPE_CREATE_TASK_FRAGMENT: final TaskFragmentCreationParams taskFragmentCreationOptions = diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 6a2a96076809..22db2975ef41 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -5959,9 +5959,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP outSurfaceInsets.set(getAttrs().surfaceInsets); final InsetsState state = getInsetsStateWithVisibilityOverride(); outInsets.set(state.calculateInsets(outFrame, systemBars(), - false /* ignoreVisibility */)); + false /* ignoreVisibility */).toRect()); outStableInsets.set(state.calculateInsets(outFrame, systemBars(), - true /* ignoreVisibility */)); + true /* ignoreVisibility */).toRect()); } void setViewVisibility(int viewVisibility) { diff --git a/services/core/java/com/android/server/wm/WindowTracing.java b/services/core/java/com/android/server/wm/WindowTracing.java index 0bb97f560a1c..6204824d70a9 100644 --- a/services/core/java/com/android/server/wm/WindowTracing.java +++ b/services/core/java/com/android/server/wm/WindowTracing.java @@ -54,7 +54,8 @@ class WindowTracing { private static final int BUFFER_CAPACITY_CRITICAL = 512 * 1024; private static final int BUFFER_CAPACITY_TRIM = 2048 * 1024; private static final int BUFFER_CAPACITY_ALL = 4096 * 1024; - private static final String TRACE_FILENAME = "/data/misc/wmtrace/wm_trace.pb"; + static final String WINSCOPE_EXT = ".winscope"; + private static final String TRACE_FILENAME = "/data/misc/wmtrace/wm_trace" + WINSCOPE_EXT; private static final String TAG = "WindowTracing"; private static final long MAGIC_NUMBER_VALUE = ((long) MAGIC_NUMBER_H << 32) | MAGIC_NUMBER_L; diff --git a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java index 8840057cc552..85ef8f73534c 100644 --- a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java @@ -207,7 +207,7 @@ public class GameManagerServiceTests { } private void mockDeviceConfigInvalid() { - String configString = "mode=2,downscaleFactor=0.55"; + String configString = ""; when(DeviceConfig.getProperty(anyString(), anyString())) .thenReturn(configString); } @@ -373,11 +373,12 @@ public class GameManagerServiceTests { */ @Test public void testSetGameModePermissionDenied() { + mockModifyGameModeGranted(); + mockDeviceConfigAll(); GameManagerService gameManagerService = new GameManagerService(mMockContext); gameManagerService.onUserStarting(USER_ID_1); // Update the game mode so we can read back something valid. - mockModifyGameModeGranted(); gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_STANDARD, USER_ID_1); assertEquals(GameManager.GAME_MODE_STANDARD, gameManagerService.getGameMode(mPackageName, USER_ID_1)); diff --git a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java index 34856e2580ed..28cdd6317e5a 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java @@ -142,6 +142,12 @@ public class LocalDisplayAdapterTest { .thenReturn(mockArray); when(mMockedResources.obtainTypedArray(R.array.config_waterfallCutoutArray)) .thenReturn(mockArray); + when(mMockedResources.obtainTypedArray(R.array.config_roundedCornerRadiusArray)) + .thenReturn(mockArray); + when(mMockedResources.obtainTypedArray(R.array.config_roundedCornerTopRadiusArray)) + .thenReturn(mockArray); + when(mMockedResources.obtainTypedArray(R.array.config_roundedCornerBottomRadiusArray)) + .thenReturn(mockArray); } @After diff --git a/services/tests/servicestests/src/com/android/server/appsearch/AppSearchImplPlatformTest.java b/services/tests/servicestests/src/com/android/server/appsearch/AppSearchImplPlatformTest.java index 0d475c00569e..91bf4d12a299 100644 --- a/services/tests/servicestests/src/com/android/server/appsearch/AppSearchImplPlatformTest.java +++ b/services/tests/servicestests/src/com/android/server/appsearch/AppSearchImplPlatformTest.java @@ -135,7 +135,8 @@ public class AppSearchImplPlatformTest { "schema1", ImmutableList.of(new PackageIdentifier(packageNameFoo, sha256CertFoo))), /*forceOverride=*/ false, - /*schemaVersion=*/ 0); + /*schemaVersion=*/ 0, + /*setSchemaStatsBuilder=*/ null); // "schema1" is platform hidden now and package visible to package1 assertThat(mVisibilityStore.isSchemaSearchableByCaller( @@ -167,7 +168,8 @@ public class AppSearchImplPlatformTest { "schema1", ImmutableList.of(new PackageIdentifier(packageNameFoo, sha256CertFoo))), /*forceOverride=*/ false, - /*schemaVersion=*/ 0); + /*schemaVersion=*/ 0, + /*setSchemaStatsBuilder=*/ null); // Check that "schema1" still has the same visibility settings SystemUtil.runWithShellPermissionIdentity(() -> assertThat( @@ -241,7 +243,8 @@ public class AppSearchImplPlatformTest { "schema1", ImmutableList.of(new PackageIdentifier(packageNameFoo, sha256CertFoo))), /*forceOverride=*/ false, - /*schemaVersion=*/ 0); + /*schemaVersion=*/ 0, + /*setSchemaStatsBuilder=*/ null); // "schema1" is platform hidden now and package accessible assertThat(mVisibilityStore.isSchemaSearchableByCaller( @@ -269,7 +272,8 @@ public class AppSearchImplPlatformTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ true, - /*schemaVersion=*/ 0); + /*schemaVersion=*/ 0, + /*setSchemaStatsBuilder=*/ null); // Check that "schema1" is no longer considered platform hidden or package accessible assertThat(mVisibilityStore.isSchemaSearchableByCaller( @@ -298,7 +302,8 @@ public class AppSearchImplPlatformTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*schemaVersion=*/ 0); + /*schemaVersion=*/ 0, + /*setSchemaStatsBuilder=*/ null); assertThat(mVisibilityStore.isSchemaSearchableByCaller( "package", @@ -333,7 +338,8 @@ public class AppSearchImplPlatformTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*schemaVersion=*/ 0); + /*schemaVersion=*/ 0, + /*setSchemaStatsBuilder=*/ null); assertThat(mVisibilityStore.isSchemaSearchableByCaller( "package", @@ -361,7 +367,8 @@ public class AppSearchImplPlatformTest { /*schemasNotDisplayedBySystem=*/ Collections.singletonList("Schema"), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*schemaVersion=*/ 0); + /*schemaVersion=*/ 0, + /*setSchemaStatsBuilder=*/ null); assertThat(mVisibilityStore.isSchemaSearchableByCaller( "package", @@ -390,7 +397,8 @@ public class AppSearchImplPlatformTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*schemaVersion=*/ 0); + /*schemaVersion=*/ 0, + /*setSchemaStatsBuilder=*/ null); assertThat(mVisibilityStore .isSchemaSearchableByCaller( "package", @@ -431,7 +439,8 @@ public class AppSearchImplPlatformTest { "Schema", ImmutableList.of(new PackageIdentifier(packageNameFoo, sha256CertFoo))), /*forceOverride=*/ false, - /*schemaVersion=*/ 0); + /*schemaVersion=*/ 0, + /*setSchemaStatsBuilder=*/ null); assertThat(mVisibilityStore .isSchemaSearchableByCaller( "package", diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java index f40a5ad7bcb6..dd3b3ec08dbf 100644 --- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java +++ b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchImplTest.java @@ -76,13 +76,14 @@ import java.util.Map; import java.util.Set; public class AppSearchImplTest { - @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder(); - private AppSearchImpl mAppSearchImpl; /** * Always trigger optimize in this class. OptimizeStrategy will be tested in its own test class. */ private static final OptimizeStrategy ALWAYS_OPTIMIZE = optimizeInfo -> true; + @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder(); + private AppSearchImpl mAppSearchImpl; + @Before public void setUp() throws Exception { mAppSearchImpl = @@ -439,7 +440,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert a document and then remove it to generate garbage. GenericDocument document = new GenericDocument.Builder<>("namespace", "id", "type").build(); @@ -499,7 +501,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert a valid doc GenericDocument validDoc = @@ -591,7 +594,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert a valid doc appSearchImpl.putDocument( @@ -626,7 +630,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert document GenericDocument document = new GenericDocument.Builder<>("namespace", "id", "type").build(); @@ -660,7 +665,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); mAppSearchImpl.setSchema( "package", "database2", @@ -669,7 +675,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert documents GenericDocument document1 = @@ -714,7 +721,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert document GenericDocument document = new GenericDocument.Builder<>("namespace", "id", "type").build(); @@ -756,7 +764,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert package2 schema List<AppSearchSchema> schema2 = @@ -769,7 +778,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert package1 document GenericDocument document = @@ -812,7 +822,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert package2 schema List<AppSearchSchema> schema2 = @@ -825,7 +836,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert package1 document GenericDocument document = @@ -889,7 +901,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert two package1 documents GenericDocument document1 = @@ -914,7 +927,8 @@ public class AppSearchImplTest { assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document2); long nextPageToken = searchResultPage.getNextPageToken(); - searchResultPage = mAppSearchImpl.getNextPage("package1", nextPageToken); + searchResultPage = + mAppSearchImpl.getNextPage("package1", nextPageToken, /*statsBuilder=*/ null); assertThat(searchResultPage.getResults()).hasSize(1); assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document1); } @@ -932,7 +946,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert two package1 documents GenericDocument document1 = @@ -962,14 +977,17 @@ public class AppSearchImplTest { AppSearchException e = assertThrows( AppSearchException.class, - () -> mAppSearchImpl.getNextPage("package2", nextPageToken)); + () -> + mAppSearchImpl.getNextPage( + "package2", nextPageToken, /*statsBuilder=*/ null)); assertThat(e) .hasMessageThat() .contains("Package \"package2\" cannot use nextPageToken: " + nextPageToken); assertThat(e.getResultCode()).isEqualTo(AppSearchResult.RESULT_SECURITY_ERROR); // Can continue getting next page for package1 - searchResultPage = mAppSearchImpl.getNextPage("package1", nextPageToken); + searchResultPage = + mAppSearchImpl.getNextPage("package1", nextPageToken, /*statsBuilder=*/ null); assertThat(searchResultPage.getResults()).hasSize(1); assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document1); } @@ -987,7 +1005,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert two package1 documents GenericDocument document1 = @@ -1019,7 +1038,8 @@ public class AppSearchImplTest { assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document2); long nextPageToken = searchResultPage.getNextPageToken(); - searchResultPage = mAppSearchImpl.getNextPage("package1", nextPageToken); + searchResultPage = + mAppSearchImpl.getNextPage("package1", nextPageToken, /*statsBuilder=*/ null); assertThat(searchResultPage.getResults()).hasSize(1); assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document1); } @@ -1037,7 +1057,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert two package1 documents GenericDocument document1 = @@ -1074,14 +1095,17 @@ public class AppSearchImplTest { AppSearchException e = assertThrows( AppSearchException.class, - () -> mAppSearchImpl.getNextPage("package2", nextPageToken)); + () -> + mAppSearchImpl.getNextPage( + "package2", nextPageToken, /*statsBuilder=*/ null)); assertThat(e) .hasMessageThat() .contains("Package \"package2\" cannot use nextPageToken: " + nextPageToken); assertThat(e.getResultCode()).isEqualTo(AppSearchResult.RESULT_SECURITY_ERROR); // Can continue getting next page for package1 - searchResultPage = mAppSearchImpl.getNextPage("package1", nextPageToken); + searchResultPage = + mAppSearchImpl.getNextPage("package1", nextPageToken, /*statsBuilder=*/ null); assertThat(searchResultPage.getResults()).hasSize(1); assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document1); } @@ -1099,7 +1123,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert two package1 documents GenericDocument document1 = @@ -1132,7 +1157,9 @@ public class AppSearchImplTest { AppSearchException e = assertThrows( AppSearchException.class, - () -> mAppSearchImpl.getNextPage("package1", nextPageToken)); + () -> + mAppSearchImpl.getNextPage( + "package1", nextPageToken, /*statsBuilder=*/ null)); assertThat(e) .hasMessageThat() .contains("Package \"package1\" cannot use nextPageToken: " + nextPageToken); @@ -1152,7 +1179,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert two package1 documents GenericDocument document1 = @@ -1189,7 +1217,8 @@ public class AppSearchImplTest { assertThat(e.getResultCode()).isEqualTo(AppSearchResult.RESULT_SECURITY_ERROR); // Can continue getting next page for package1 - searchResultPage = mAppSearchImpl.getNextPage("package1", nextPageToken); + searchResultPage = + mAppSearchImpl.getNextPage("package1", nextPageToken, /*statsBuilder=*/ null); assertThat(searchResultPage.getResults()).hasSize(1); assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document1); } @@ -1207,7 +1236,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert two package1 documents GenericDocument document1 = @@ -1247,7 +1277,9 @@ public class AppSearchImplTest { AppSearchException e = assertThrows( AppSearchException.class, - () -> mAppSearchImpl.getNextPage("package1", nextPageToken)); + () -> + mAppSearchImpl.getNextPage( + "package1", nextPageToken, /*statsBuilder=*/ null)); assertThat(e) .hasMessageThat() .contains("Package \"package1\" cannot use nextPageToken: " + nextPageToken); @@ -1267,7 +1299,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert two package1 documents GenericDocument document1 = @@ -1311,7 +1344,8 @@ public class AppSearchImplTest { assertThat(e.getResultCode()).isEqualTo(AppSearchResult.RESULT_SECURITY_ERROR); // Can continue getting next page for package1 - searchResultPage = mAppSearchImpl.getNextPage("package1", nextPageToken); + searchResultPage = + mAppSearchImpl.getNextPage("package1", nextPageToken, /*statsBuilder=*/ null); assertThat(searchResultPage.getResults()).hasSize(1); assertThat(searchResultPage.getResults().get(0).getGenericDocument()).isEqualTo(document1); } @@ -1355,7 +1389,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Create expected schemaType proto. SchemaProto expectedProto = @@ -1400,7 +1435,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Create incompatible schema List<AppSearchSchema> newSchemas = @@ -1416,7 +1452,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ true, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); assertThat(setSchemaResponse.getDeletedTypes()).containsExactly("Text"); assertThat(setSchemaResponse.getIncompatibleTypes()).containsExactly("Email"); } @@ -1439,7 +1476,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Create expected schemaType proto. SchemaProto expectedProto = @@ -1472,8 +1510,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); - + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Check the Document type has been deleted. assertThat(setSchemaResponse.getDeletedTypes()).containsExactly("Document"); @@ -1486,7 +1524,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ true, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Check Document schema is removed. expectedProto = @@ -1524,7 +1563,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); mAppSearchImpl.setSchema( "package", "database2", @@ -1533,7 +1573,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Create expected schemaType proto. SchemaProto expectedProto = @@ -1573,7 +1614,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ true, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Create expected schemaType list, database 1 should only contain Email but database 2 // remains in same. @@ -1618,7 +1660,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert package document GenericDocument document = @@ -1680,7 +1723,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); mAppSearchImpl.setSchema( "packageB", "database", @@ -1689,7 +1733,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Verify these two packages is stored in AppSearch SchemaProto expectedProto = @@ -1735,7 +1780,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); assertThat(mAppSearchImpl.getPackageToDatabases()) .containsExactlyEntriesIn(expectedMapping); @@ -1749,7 +1795,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); assertThat(mAppSearchImpl.getPackageToDatabases()) .containsExactlyEntriesIn(expectedMapping); @@ -1763,7 +1810,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); assertThat(mAppSearchImpl.getPackageToDatabases()) .containsExactlyEntriesIn(expectedMapping); } @@ -1822,7 +1870,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert two docs GenericDocument document1 = @@ -1973,7 +2022,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Since "package1" doesn't have a document, it get any space attributed to it. StorageInfo storageInfo = mAppSearchImpl.getStorageInfoForPackage("package1"); @@ -1996,7 +2046,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert document for "package1" GenericDocument document = @@ -2012,7 +2063,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert two documents for "package2" document = new GenericDocument.Builder<>("namespace", "id1", "type").build(); @@ -2061,7 +2113,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // "package2" doesn't exist yet, so it shouldn't have any storage size StorageInfo storageInfo = @@ -2084,7 +2137,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Since "package1", "database1" doesn't have a document, it get any space attributed to it. StorageInfo storageInfo = mAppSearchImpl.getStorageInfoForDatabase("package1", "database1"); @@ -2106,7 +2160,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); mAppSearchImpl.setSchema( "package1", "database2", @@ -2115,7 +2170,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Add a document for "package1", "database1" GenericDocument document = @@ -2165,7 +2221,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); appSearchImpl.close(); @@ -2181,7 +2238,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0)); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null)); assertThrows( IllegalStateException.class, () -> appSearchImpl.getSchema("package", "database")); @@ -2225,7 +2283,9 @@ public class AppSearchImplTest { assertThrows( IllegalStateException.class, - () -> appSearchImpl.getNextPage("package", /*nextPageToken=*/ 1L)); + () -> + appSearchImpl.getNextPage( + "package", /*nextPageToken=*/ 1L, /*statsBuilder=*/ null)); assertThrows( IllegalStateException.class, @@ -2296,7 +2356,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Add a document and persist it. GenericDocument document = @@ -2343,7 +2404,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Add two documents and persist them. GenericDocument document1 = @@ -2423,7 +2485,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Add two documents and persist them. GenericDocument document1 = @@ -2511,7 +2574,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Add two documents GenericDocument document1 = @@ -2562,7 +2626,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert a document which is too large GenericDocument document = @@ -2636,7 +2701,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Index a document mAppSearchImpl.putDocument( @@ -2723,7 +2789,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Index 3 documents mAppSearchImpl.putDocument( @@ -2836,7 +2903,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); mAppSearchImpl.setSchema( "package1", "database2", @@ -2845,7 +2913,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); mAppSearchImpl.setSchema( "package2", "database1", @@ -2854,7 +2923,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); mAppSearchImpl.setSchema( "package2", "database2", @@ -2863,7 +2933,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Index documents in package1/database1 mAppSearchImpl.putDocument( @@ -3002,7 +3073,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Index 3 documents mAppSearchImpl.putDocument( @@ -3131,7 +3203,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Index a document mAppSearchImpl.putDocument( @@ -3210,7 +3283,8 @@ public class AppSearchImplTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Index a document mAppSearchImpl.putDocument( diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchLoggerTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchLoggerTest.java index 7c976876a731..2ab5fd554675 100644 --- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchLoggerTest.java +++ b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/AppSearchLoggerTest.java @@ -33,6 +33,7 @@ import com.android.server.appsearch.external.localstorage.stats.OptimizeStats; import com.android.server.appsearch.external.localstorage.stats.PutDocumentStats; import com.android.server.appsearch.external.localstorage.stats.RemoveStats; import com.android.server.appsearch.external.localstorage.stats.SearchStats; +import com.android.server.appsearch.external.localstorage.stats.SetSchemaStats; import com.android.server.appsearch.icing.proto.DeleteStatsProto; import com.android.server.appsearch.icing.proto.DocumentProto; import com.android.server.appsearch.icing.proto.InitializeStatsProto; @@ -41,6 +42,7 @@ import com.android.server.appsearch.icing.proto.PutDocumentStatsProto; import com.android.server.appsearch.icing.proto.PutResultProto; import com.android.server.appsearch.icing.proto.QueryStatsProto; import com.android.server.appsearch.icing.proto.ScoringSpecProto; +import com.android.server.appsearch.icing.proto.SetSchemaResultProto; import com.android.server.appsearch.icing.proto.StatusProto; import com.android.server.appsearch.icing.proto.TermMatchType; @@ -57,14 +59,17 @@ import java.util.Collections; import java.util.List; public class AppSearchLoggerTest { - @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder(); - private AppSearchImpl mAppSearchImpl; - private TestLogger mLogger; + private static final String PACKAGE_NAME = "packageName"; + private static final String DATABASE = "database"; /** * Always trigger optimize in this class. OptimizeStrategy will be tested in its own test class. */ private static final OptimizeStrategy ALWAYS_OPTIMIZE = optimizeInfo -> true; + @Rule public TemporaryFolder mTemporaryFolder = new TemporaryFolder(); + private AppSearchImpl mAppSearchImpl; + private TestLogger mLogger; + @Before public void setUp() throws Exception { mAppSearchImpl = @@ -84,6 +89,7 @@ public class AppSearchLoggerTest { @Nullable SearchStats mSearchStats; @Nullable RemoveStats mRemoveStats; @Nullable OptimizeStats mOptimizeStats; + @Nullable SetSchemaStats mSetSchemaStats; @Override public void logStats(@NonNull CallStats stats) { @@ -114,6 +120,11 @@ public class AppSearchLoggerTest { public void logStats(@NonNull OptimizeStats stats) { mOptimizeStats = stats; } + + @Override + public void logStats(@NonNull SetSchemaStats stats) { + mSetSchemaStats = stats; + } } @Test @@ -194,7 +205,7 @@ public class AppSearchLoggerTest { .setExceededMaxTokenNum(nativeExceededMaxNumTokens) .build()) .build(); - PutDocumentStats.Builder pBuilder = new PutDocumentStats.Builder("packageName", "database"); + PutDocumentStats.Builder pBuilder = new PutDocumentStats.Builder(PACKAGE_NAME, DATABASE); AppSearchLoggerHelper.copyNativeStats(nativePutDocumentStats, pBuilder); @@ -248,8 +259,8 @@ public class AppSearchLoggerTest { .setDocumentRetrievalLatencyMs(nativeDocumentRetrievingLatencyMillis) .build(); SearchStats.Builder qBuilder = - new SearchStats.Builder(SearchStats.VISIBILITY_SCOPE_LOCAL, "packageName") - .setDatabase("database"); + new SearchStats.Builder(SearchStats.VISIBILITY_SCOPE_LOCAL, PACKAGE_NAME) + .setDatabase(DATABASE); AppSearchLoggerHelper.copyNativeStats(nativeQueryStats, qBuilder); @@ -336,6 +347,35 @@ public class AppSearchLoggerTest { .isEqualTo(nativeTimeSinceLastOptimizeMillis); } + @Test + public void testAppSearchLoggerHelper_testCopyNativeStats_setSchema() { + ImmutableList<String> newSchemaTypeChangeList = ImmutableList.of("new1"); + ImmutableList<String> deletedSchemaTypesList = ImmutableList.of("deleted1", "deleted2"); + ImmutableList<String> compatibleTypesList = ImmutableList.of("compatible1", "compatible2"); + ImmutableList<String> indexIncompatibleTypeChangeList = ImmutableList.of("index1"); + ImmutableList<String> backwardsIncompatibleTypeChangeList = ImmutableList.of("backwards1"); + SetSchemaResultProto setSchemaResultProto = + SetSchemaResultProto.newBuilder() + .addAllNewSchemaTypes(newSchemaTypeChangeList) + .addAllDeletedSchemaTypes(deletedSchemaTypesList) + .addAllFullyCompatibleChangedSchemaTypes(compatibleTypesList) + .addAllIndexIncompatibleChangedSchemaTypes(indexIncompatibleTypeChangeList) + .addAllIncompatibleSchemaTypes(backwardsIncompatibleTypeChangeList) + .build(); + SetSchemaStats.Builder sBuilder = new SetSchemaStats.Builder(PACKAGE_NAME, DATABASE); + + AppSearchLoggerHelper.copyNativeStats(setSchemaResultProto, sBuilder); + + SetSchemaStats sStats = sBuilder.build(); + assertThat(sStats.getNewTypeCount()).isEqualTo(newSchemaTypeChangeList.size()); + assertThat(sStats.getDeletedTypeCount()).isEqualTo(deletedSchemaTypesList.size()); + assertThat(sStats.getCompatibleTypeChangeCount()).isEqualTo(compatibleTypesList.size()); + assertThat(sStats.getIndexIncompatibleTypeChangeCount()) + .isEqualTo(indexIncompatibleTypeChangeList.size()); + assertThat(sStats.getBackwardsIncompatibleTypeChangeCount()) + .isEqualTo(backwardsIncompatibleTypeChangeList.size()); + } + // // Testing actual logging // @@ -388,7 +428,8 @@ public class AppSearchLoggerTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); GenericDocument doc1 = new GenericDocument.Builder<>("namespace", "id1", "Type1").build(); GenericDocument doc2 = new GenericDocument.Builder<>("namespace", "id2", "Type1").build(); appSearchImpl.putDocument(testPackageName, testDatabase, doc1, mLogger); @@ -439,7 +480,8 @@ public class AppSearchLoggerTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); // Insert a valid doc GenericDocument doc1 = new GenericDocument.Builder<>("namespace", "id1", "Type1").build(); @@ -495,7 +537,8 @@ public class AppSearchLoggerTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); GenericDocument document = new GenericDocument.Builder<>("namespace", "id", "type") @@ -542,7 +585,8 @@ public class AppSearchLoggerTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); GenericDocument document = new GenericDocument.Builder<>("namespace", "id", "type") @@ -592,7 +636,8 @@ public class AppSearchLoggerTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); GenericDocument document1 = new GenericDocument.Builder<>("namespace", "id1", "type") .setPropertyString("subject", "testPut example1") @@ -661,7 +706,8 @@ public class AppSearchLoggerTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); SearchSpec searchSpec = new SearchSpec.Builder() @@ -701,7 +747,8 @@ public class AppSearchLoggerTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); GenericDocument document = new GenericDocument.Builder<>(testNamespace, testId, "type").build(); mAppSearchImpl.putDocument(testPackageName, testDatabase, document, /*logger=*/ null); @@ -735,7 +782,8 @@ public class AppSearchLoggerTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); GenericDocument document = new GenericDocument.Builder<>(testNamespace, testId, "type").build(); @@ -780,7 +828,8 @@ public class AppSearchLoggerTest { /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), /*schemasVisibleToPackages=*/ Collections.emptyMap(), /*forceOverride=*/ false, - /*version=*/ 0); + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); GenericDocument document1 = new GenericDocument.Builder<>(testNamespace, "id1", "type").build(); GenericDocument document2 = @@ -800,7 +849,58 @@ public class AppSearchLoggerTest { assertThat(rStats.getDatabase()).isEqualTo(testDatabase); assertThat(rStats.getStatusCode()).isEqualTo(AppSearchResult.RESULT_OK); // delete by query - assertThat(rStats.getDeleteType()).isEqualTo(DeleteStatsProto.DeleteType.Code.QUERY_VALUE); + assertThat(rStats.getDeleteType()) + .isEqualTo(DeleteStatsProto.DeleteType.Code.DEPRECATED_QUERY_VALUE); assertThat(rStats.getDeletedDocumentCount()).isEqualTo(2); } + + @Test + public void testLoggingStats_setSchema() throws Exception { + AppSearchSchema schema1 = + new AppSearchSchema.Builder("testSchema") + .addProperty( + new AppSearchSchema.StringPropertyConfig.Builder("subject") + .setCardinality( + AppSearchSchema.PropertyConfig.CARDINALITY_REQUIRED) + .setIndexingType( + AppSearchSchema.StringPropertyConfig + .INDEXING_TYPE_PREFIXES) + .setTokenizerType( + AppSearchSchema.StringPropertyConfig + .TOKENIZER_TYPE_PLAIN) + .build()) + .build(); + mAppSearchImpl.setSchema( + PACKAGE_NAME, + DATABASE, + Collections.singletonList(schema1), + /*visibilityStore=*/ null, + /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), + /*schemasVisibleToPackages=*/ Collections.emptyMap(), + /*forceOverride=*/ false, + /*version=*/ 0, + /* setSchemaStatsBuilder= */ null); + + // create a backwards incompatible schema + SetSchemaStats.Builder sStatsBuilder = new SetSchemaStats.Builder(PACKAGE_NAME, DATABASE); + AppSearchSchema schema2 = new AppSearchSchema.Builder("testSchema").build(); + mAppSearchImpl.setSchema( + PACKAGE_NAME, + DATABASE, + Collections.singletonList(schema2), + /*visibilityStore=*/ null, + /*schemasNotDisplayedBySystem=*/ Collections.emptyList(), + /*schemasVisibleToPackages=*/ Collections.emptyMap(), + /*forceOverride=*/ false, + /*version=*/ 0, + /* setSchemaStatsBuilder= */ sStatsBuilder); + + SetSchemaStats sStats = sStatsBuilder.build(); + assertThat(sStats.getPackageName()).isEqualTo(PACKAGE_NAME); + assertThat(sStats.getDatabase()).isEqualTo(DATABASE); + assertThat(sStats.getNewTypeCount()).isEqualTo(0); + assertThat(sStats.getCompatibleTypeChangeCount()).isEqualTo(0); + assertThat(sStats.getIndexIncompatibleTypeChangeCount()).isEqualTo(1); + assertThat(sStats.getBackwardsIncompatibleTypeChangeCount()).isEqualTo(1); + } } diff --git a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/stats/AppSearchStatsTest.java b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/stats/AppSearchStatsTest.java index c1dc0e447c70..81aab416a9f9 100644 --- a/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/stats/AppSearchStatsTest.java +++ b/services/tests/servicestests/src/com/android/server/appsearch/external/localstorage/stats/AppSearchStatsTest.java @@ -264,17 +264,15 @@ public class AppSearchStatsTest { .setMigratedDocumentCount(6) .setSavedDocumentCount(7) .build(); - int nativeLatencyMillis = 1; - int newTypeCount = 2; - int compatibleTypeChangeCount = 3; - int indexIncompatibleTypeChangeCount = 4; - int backwardsIncompatibleTypeChangeCount = 5; + int newTypeCount = 1; + int compatibleTypeChangeCount = 2; + int indexIncompatibleTypeChangeCount = 3; + int backwardsIncompatibleTypeChangeCount = 4; SetSchemaStats sStats = new SetSchemaStats.Builder(TEST_PACKAGE_NAME, TEST_DATA_BASE) .setStatusCode(TEST_STATUS_CODE) .setSchemaMigrationStats(schemaMigrationStats) .setTotalLatencyMillis(TEST_TOTAL_LATENCY_MILLIS) - .setNativeLatencyMillis(nativeLatencyMillis) .setNewTypeCount(newTypeCount) .setCompatibleTypeChangeCount(compatibleTypeChangeCount) .setIndexIncompatibleTypeChangeCount(indexIncompatibleTypeChangeCount) @@ -287,7 +285,6 @@ public class AppSearchStatsTest { assertThat(sStats.getStatusCode()).isEqualTo(TEST_STATUS_CODE); assertThat(sStats.getSchemaMigrationStats()).isEqualTo(schemaMigrationStats); assertThat(sStats.getTotalLatencyMillis()).isEqualTo(TEST_TOTAL_LATENCY_MILLIS); - assertThat(sStats.getNativeLatencyMillis()).isEqualTo(nativeLatencyMillis); assertThat(sStats.getNewTypeCount()).isEqualTo(newTypeCount); assertThat(sStats.getCompatibleTypeChangeCount()).isEqualTo(compatibleTypeChangeCount); assertThat(sStats.getIndexIncompatibleTypeChangeCount()) diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java index 2892bf58a7d2..b3f7587df612 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthSessionTest.java @@ -74,6 +74,7 @@ import java.util.function.Consumer; public class AuthSessionTest { private static final String TEST_PACKAGE = "test_package"; + private static final long TEST_REQUEST_ID = 22; @Mock private Context mContext; @Mock private ITrustManager mTrustManager; @@ -112,6 +113,7 @@ public class AuthSessionTest { final AuthSession session = createAuthSession(mSensors, false /* checkDevicePolicyManager */, Authenticators.BIOMETRIC_STRONG, + TEST_REQUEST_ID, 0 /* operationId */, 0 /* userId */); @@ -133,6 +135,7 @@ public class AuthSessionTest { final AuthSession session = createAuthSession(mSensors, false /* checkDevicePolicyManager */, Authenticators.BIOMETRIC_STRONG, + TEST_REQUEST_ID, operationId, userId); assertEquals(mSensors.size(), session.mPreAuthInfo.eligibleSensors.size()); @@ -153,6 +156,7 @@ public class AuthSessionTest { eq(userId), eq(mSensorReceiver), eq(TEST_PACKAGE), + eq(TEST_REQUEST_ID), eq(sensor.getCookie()), anyBoolean() /* allowBackgroundAuthentication */); } @@ -185,6 +189,33 @@ public class AuthSessionTest { } @Test + public void testCancelReducesAppetiteForCookies() throws Exception { + setupFace(0 /* id */, false /* confirmationAlwaysRequired */, + mock(IBiometricAuthenticator.class)); + setupFingerprint(1 /* id */, FingerprintSensorProperties.TYPE_UDFPS_OPTICAL); + + final AuthSession session = createAuthSession(mSensors, + false /* checkDevicePolicyManager */, + Authenticators.BIOMETRIC_STRONG, + TEST_REQUEST_ID, + 44 /* operationId */, + 2 /* userId */); + + session.goToInitialState(); + + for (BiometricSensor sensor : session.mPreAuthInfo.eligibleSensors) { + assertEquals(BiometricSensor.STATE_WAITING_FOR_COOKIE, sensor.getSensorState()); + } + + session.onCancelAuthSession(false /* force */); + + for (BiometricSensor sensor : session.mPreAuthInfo.eligibleSensors) { + session.onCookieReceived(sensor.getCookie()); + assertEquals(BiometricSensor.STATE_CANCELING, sensor.getSensorState()); + } + } + + @Test public void testMultiAuth_singleSensor_fingerprintSensorStartsAfterDialogAnimationCompletes() throws Exception { setupFingerprint(0 /* id */, FingerprintSensorProperties.TYPE_UDFPS_OPTICAL); @@ -212,6 +243,7 @@ public class AuthSessionTest { final AuthSession session = createAuthSession(mSensors, false /* checkDevicePolicyManager */, Authenticators.BIOMETRIC_STRONG, + TEST_REQUEST_ID, operationId, userId); assertEquals(mSensors.size(), session.mPreAuthInfo.eligibleSensors.size()); @@ -238,7 +270,7 @@ public class AuthSessionTest { // fingerprint sensor does not start even if all cookies are received assertEquals(STATE_AUTH_STARTED, session.getState()); verify(mStatusBarService).showAuthenticationDialog(any(), any(), any(), - anyBoolean(), anyBoolean(), anyInt(), any(), anyLong(), anyInt()); + anyBoolean(), anyBoolean(), anyInt(), anyLong(), any(), anyLong(), anyInt()); // Notify AuthSession that the UI is shown. Then, fingerprint sensor should be started. session.onDialogAnimatedIn(); @@ -277,6 +309,7 @@ public class AuthSessionTest { final AuthSession session = createAuthSession(mSensors, false /* checkDevicePolicyManager */, Authenticators.BIOMETRIC_STRONG, + TEST_REQUEST_ID, 0 /* operationId */, 0 /* userId */); @@ -285,7 +318,8 @@ public class AuthSessionTest { sessionConsumer.accept(session); - verify(faceAuthenticator).cancelAuthenticationFromService(eq(mToken), eq(TEST_PACKAGE)); + verify(faceAuthenticator).cancelAuthenticationFromService( + eq(mToken), eq(TEST_PACKAGE), eq(TEST_REQUEST_ID)); } private PreAuthInfo createPreAuthInfo(List<BiometricSensor> sensors, int userId, @@ -302,14 +336,14 @@ public class AuthSessionTest { private AuthSession createAuthSession(List<BiometricSensor> sensors, boolean checkDevicePolicyManager, @Authenticators.Types int authenticators, - long operationId, int userId) throws RemoteException { + long requestId, long operationId, int userId) throws RemoteException { final PromptInfo promptInfo = createPromptInfo(authenticators); final PreAuthInfo preAuthInfo = createPreAuthInfo(sensors, userId, promptInfo, checkDevicePolicyManager); return new AuthSession(mContext, mStatusBarService, mSysuiReceiver, mKeyStore, - mRandom, mClientDeathReceiver, preAuthInfo, mToken, operationId, userId, + mRandom, mClientDeathReceiver, preAuthInfo, mToken, requestId, operationId, userId, mSensorReceiver, mClientReceiver, TEST_PACKAGE, promptInfo, false /* debugEnabled */, mFingerprintSensorProps); } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java index 7c7afb7dde36..69d8e89ac3b3 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java @@ -85,6 +85,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; @Presubmit @SmallTest @@ -93,6 +94,7 @@ public class BiometricServiceTest { private static final String TAG = "BiometricServiceTest"; private static final String TEST_PACKAGE_NAME = "test_package"; + private static final long TEST_REQUEST_ID = 44; private static final String ERROR_HW_UNAVAILABLE = "hw_unavailable"; private static final String ERROR_NOT_RECOGNIZED = "not_recognized"; @@ -151,6 +153,7 @@ public class BiometricServiceTest { .thenReturn(mock(BiometricStrengthController.class)); when(mInjector.getTrustManager()).thenReturn(mTrustManager); when(mInjector.getDevicePolicyManager(any())).thenReturn(mDevicePolicyManager); + when(mInjector.getRequestGenerator()).thenReturn(new AtomicLong(TEST_REQUEST_ID - 1)); when(mResources.getString(R.string.biometric_error_hw_unavailable)) .thenReturn(ERROR_HW_UNAVAILABLE); @@ -215,8 +218,7 @@ public class BiometricServiceTest { mBiometricService.mCurrentAuthSession.getState()); verify(mBiometricService.mCurrentAuthSession.mPreAuthInfo.eligibleSensors.get(0).impl) - .cancelAuthenticationFromService(any(), - any()); + .cancelAuthenticationFromService(any(), any(), anyLong()); // Simulate ERROR_CANCELED received from HAL mBiometricService.mBiometricSensorReceiver.onError( @@ -272,8 +274,9 @@ public class BiometricServiceTest { eq(true) /* credentialAllowed */, anyBoolean() /* requireConfirmation */, anyInt() /* userId */, + anyLong() /* operationId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */, + eq(TEST_REQUEST_ID), eq(BIOMETRIC_MULTI_SENSOR_DEFAULT)); } @@ -357,8 +360,9 @@ public class BiometricServiceTest { eq(false) /* credentialAllowed */, eq(false) /* requireConfirmation */, anyInt() /* userId */, + anyLong() /* operationId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */, + eq(TEST_REQUEST_ID), eq(BIOMETRIC_MULTI_SENSOR_DEFAULT)); } @@ -467,6 +471,7 @@ public class BiometricServiceTest { anyInt() /* userId */, any(IBiometricSensorReceiver.class), anyString() /* opPackageName */, + eq(TEST_REQUEST_ID), cookieCaptor.capture() /* cookie */, anyBoolean() /* allowBackgroundAuthentication */); @@ -488,8 +493,9 @@ public class BiometricServiceTest { eq(false) /* credentialAllowed */, anyBoolean() /* requireConfirmation */, anyInt() /* userId */, + anyLong() /* operationId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */, + eq(TEST_REQUEST_ID), eq(BIOMETRIC_MULTI_SENSOR_DEFAULT)); // Hardware authenticated @@ -543,8 +549,9 @@ public class BiometricServiceTest { eq(true) /* credentialAllowed */, anyBoolean() /* requireConfirmation */, anyInt() /* userId */, + anyLong() /* operationId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */, + eq(TEST_REQUEST_ID), eq(BIOMETRIC_MULTI_SENSOR_DEFAULT)); } @@ -705,8 +712,9 @@ public class BiometricServiceTest { anyBoolean() /* credentialAllowed */, anyBoolean() /* requireConfirmation */, anyInt() /* userId */, + anyLong() /* operationId */, anyString(), - anyLong() /* sessionId */, + anyLong() /* requestId */, eq(BIOMETRIC_MULTI_SENSOR_DEFAULT)); } @@ -805,8 +813,9 @@ public class BiometricServiceTest { eq(true) /* credentialAllowed */, anyBoolean() /* requireConfirmation */, anyInt() /* userId */, + anyLong() /* operationId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */, + eq(TEST_REQUEST_ID), eq(BIOMETRIC_MULTI_SENSOR_DEFAULT)); } @@ -885,8 +894,9 @@ public class BiometricServiceTest { eq(true) /* credentialAllowed */, anyBoolean() /* requireConfirmation */, anyInt() /* userId */, + anyLong() /* operationId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */, + eq(TEST_REQUEST_ID), eq(BIOMETRIC_MULTI_SENSOR_DEFAULT)); } @@ -1030,8 +1040,7 @@ public class BiometricServiceTest { eq(BiometricConstants.BIOMETRIC_ERROR_USER_CANCELED), eq(0 /* vendorCode */)); verify(mBiometricService.mSensors.get(0).impl).cancelAuthenticationFromService( - any(), - any()); + any(), any(), anyLong()); assertNull(mBiometricService.mCurrentAuthSession); } @@ -1051,7 +1060,7 @@ public class BiometricServiceTest { waitForIdle(); verify(mBiometricService.mSensors.get(0).impl) - .cancelAuthenticationFromService(any(), any()); + .cancelAuthenticationFromService(any(), any(), anyLong()); } @Test @@ -1071,7 +1080,7 @@ public class BiometricServiceTest { waitForIdle(); verify(mBiometricService.mSensors.get(0).impl) - .cancelAuthenticationFromService(any(), any()); + .cancelAuthenticationFromService(any(), any(), anyLong()); } @Test @@ -1088,7 +1097,7 @@ public class BiometricServiceTest { waitForIdle(); verify(mBiometricService.mSensors.get(0).impl) - .cancelAuthenticationFromService(any(), any()); + .cancelAuthenticationFromService(any(), any(), anyLong()); verify(mReceiver1).onError( eq(BiometricAuthenticator.TYPE_FACE), eq(BiometricConstants.BIOMETRIC_ERROR_USER_CANCELED), @@ -1126,7 +1135,7 @@ public class BiometricServiceTest { false /* requireConfirmation */, null /* authenticators */); mBiometricService.mImpl.cancelAuthentication(mBiometricService.mCurrentAuthSession.mToken, - TEST_PACKAGE_NAME); + TEST_PACKAGE_NAME, TEST_REQUEST_ID); waitForIdle(); // Pretend that the HAL has responded to cancel with ERROR_CANCELED @@ -1353,8 +1362,8 @@ public class BiometricServiceTest { int authenticators = Authenticators.BIOMETRIC_STRONG; assertEquals(BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED, invokeCanAuthenticate(mBiometricService, authenticators)); - invokeAuthenticate(mBiometricService.mImpl, mReceiver1, false /* requireConfirmation */, - authenticators); + long requestId = invokeAuthenticate(mBiometricService.mImpl, mReceiver1, + false /* requireConfirmation */, authenticators); waitForIdle(); verify(mReceiver1).onError( eq(BiometricAuthenticator.TYPE_FINGERPRINT), @@ -1366,7 +1375,7 @@ public class BiometricServiceTest { authenticators = Authenticators.BIOMETRIC_WEAK; assertEquals(BiometricManager.BIOMETRIC_SUCCESS, invokeCanAuthenticate(mBiometricService, authenticators)); - invokeAuthenticateAndStart(mBiometricService.mImpl, mReceiver1, + requestId = invokeAuthenticateAndStart(mBiometricService.mImpl, mReceiver1, false /* requireConfirmation */, authenticators); waitForIdle(); @@ -1377,8 +1386,9 @@ public class BiometricServiceTest { eq(false) /* credentialAllowed */, anyBoolean() /* requireConfirmation */, anyInt() /* userId */, + anyLong() /* operationId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */, + eq(requestId), eq(BIOMETRIC_MULTI_SENSOR_DEFAULT)); // Requesting strong and credential, when credential is setup @@ -1387,7 +1397,7 @@ public class BiometricServiceTest { when(mTrustManager.isDeviceSecure(anyInt())).thenReturn(true); assertEquals(BiometricManager.BIOMETRIC_SUCCESS, invokeCanAuthenticate(mBiometricService, authenticators)); - invokeAuthenticate(mBiometricService.mImpl, mReceiver1, + requestId = invokeAuthenticate(mBiometricService.mImpl, mReceiver1, false /* requireConfirmation */, authenticators); waitForIdle(); @@ -1399,8 +1409,9 @@ public class BiometricServiceTest { eq(true) /* credentialAllowed */, anyBoolean() /* requireConfirmation */, anyInt() /* userId */, + anyLong() /* operationId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */, + eq(requestId), eq(BIOMETRIC_MULTI_SENSOR_DEFAULT)); // Un-downgrading the authenticator allows successful strong auth @@ -1414,7 +1425,7 @@ public class BiometricServiceTest { authenticators = Authenticators.BIOMETRIC_STRONG; assertEquals(BiometricManager.BIOMETRIC_SUCCESS, invokeCanAuthenticate(mBiometricService, authenticators)); - invokeAuthenticateAndStart(mBiometricService.mImpl, mReceiver1, + requestId = invokeAuthenticateAndStart(mBiometricService.mImpl, mReceiver1, false /* requireConfirmation */, authenticators); waitForIdle(); verify(mBiometricService.mStatusBarService).showAuthenticationDialog( @@ -1424,8 +1435,9 @@ public class BiometricServiceTest { eq(false) /* credentialAllowed */, anyBoolean() /* requireConfirmation */, anyInt() /* userId */, + anyLong() /* operationId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */, + eq(requestId), eq(BIOMETRIC_MULTI_SENSOR_DEFAULT)); } @@ -1617,11 +1629,12 @@ public class BiometricServiceTest { mBiometricService.mStatusBarService = mock(IStatusBarService.class); } - private void invokeAuthenticateAndStart(IBiometricService.Stub service, + private long invokeAuthenticateAndStart(IBiometricService.Stub service, IBiometricServiceReceiver receiver, boolean requireConfirmation, Integer authenticators) throws Exception { // Request auth, creates a pending session - invokeAuthenticate(service, receiver, requireConfirmation, authenticators); + final long requestId = invokeAuthenticate( + service, receiver, requireConfirmation, authenticators); waitForIdle(); startPendingAuthSession(mBiometricService); @@ -1629,6 +1642,8 @@ public class BiometricServiceTest { assertNotNull(mBiometricService.mCurrentAuthSession); assertEquals(STATE_AUTH_STARTED, mBiometricService.mCurrentAuthSession.getState()); + + return requestId; } private static void startPendingAuthSession(BiometricService service) throws Exception { @@ -1644,10 +1659,10 @@ public class BiometricServiceTest { service.mImpl.onReadyForAuthentication(cookie); } - private static void invokeAuthenticate(IBiometricService.Stub service, + private static long invokeAuthenticate(IBiometricService.Stub service, IBiometricServiceReceiver receiver, boolean requireConfirmation, Integer authenticators) throws Exception { - service.authenticate( + return service.authenticate( new Binder() /* token */, 0 /* operationId */, 0 /* userId */, @@ -1657,9 +1672,9 @@ public class BiometricServiceTest { false /* checkDevicePolicy */)); } - private static void invokeAuthenticateForWorkApp(IBiometricService.Stub service, + private static long invokeAuthenticateForWorkApp(IBiometricService.Stub service, IBiometricServiceReceiver receiver, Integer authenticators) throws Exception { - service.authenticate( + return service.authenticate( new Binder() /* token */, 0 /* operationId */, 0 /* userId */, diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java index a41f79e8f682..e3e3900c47e0 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/BiometricSchedulerTest.java @@ -40,6 +40,7 @@ import android.platform.test.annotations.Presubmit; import android.testing.TestableContext; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -193,7 +194,7 @@ public class BiometricSchedulerTest { // Request it to be canceled. The operation can be canceled immediately, and the scheduler // should go back to idle, since in this case the framework has not even requested the HAL // to authenticate yet. - mScheduler.cancelAuthenticationOrDetection(mToken); + mScheduler.cancelAuthenticationOrDetection(mToken, 1 /* requestId */); assertNull(mScheduler.mCurrentOperation); } @@ -303,7 +304,7 @@ public class BiometricSchedulerTest { mScheduler.mPendingOperations.getFirst().mState); // Request cancel before the authentication client has started - mScheduler.cancelAuthenticationOrDetection(mToken); + mScheduler.cancelAuthenticationOrDetection(mToken, 1 /* requestId */); waitForIdle(); assertEquals(Operation.STATE_WAITING_IN_QUEUE_CANCELING, mScheduler.mPendingOperations.getFirst().mState); @@ -318,6 +319,107 @@ public class BiometricSchedulerTest { } @Test + public void testCancels_whenAuthRequestIdNotSet() { + testCancelsWhenRequestId(null /* requestId */, 2, true /* started */); + } + + @Test + public void testCancels_whenAuthRequestIdNotSet_notStarted() { + testCancelsWhenRequestId(null /* requestId */, 2, false /* started */); + } + + @Test + public void testCancels_whenAuthRequestIdMatches() { + testCancelsWhenRequestId(200L, 200, true /* started */); + } + + @Test + public void testCancels_whenAuthRequestIdMatches_noStarted() { + testCancelsWhenRequestId(200L, 200, false /* started */); + } + + @Test + public void testDoesNotCancel_whenAuthRequestIdMismatched() { + testCancelsWhenRequestId(10L, 20, true /* started */); + } + + @Test + public void testDoesNotCancel_whenAuthRequestIdMismatched_notStarted() { + testCancelsWhenRequestId(10L, 20, false /* started */); + } + + private void testCancelsWhenRequestId(@Nullable Long requestId, long cancelRequestId, + boolean started) { + final boolean matches = requestId == null || requestId == cancelRequestId; + final HalClientMonitor.LazyDaemon<Object> lazyDaemon = () -> mock(Object.class); + final ClientMonitorCallbackConverter callback = mock(ClientMonitorCallbackConverter.class); + final TestAuthenticationClient client = new TestAuthenticationClient( + mContext, lazyDaemon, mToken, callback); + if (requestId != null) { + client.setRequestId(requestId); + } + + mScheduler.scheduleClientMonitor(client); + if (started) { + mScheduler.startPreparedClient(client.getCookie()); + } + waitForIdle(); + mScheduler.cancelAuthenticationOrDetection(mToken, cancelRequestId); + waitForIdle(); + + assertEquals(matches && started ? 1 : 0, client.mNumCancels); + + if (matches) { + if (started) { + assertEquals(Operation.STATE_STARTED_CANCELING, + mScheduler.mCurrentOperation.mState); + } + } else { + if (started) { + assertEquals(Operation.STATE_STARTED, + mScheduler.mCurrentOperation.mState); + } else { + assertEquals(Operation.STATE_WAITING_FOR_COOKIE, + mScheduler.mCurrentOperation.mState); + } + } + } + + @Test + public void testCancelsPending_whenAuthRequestIdsSet() { + final long requestId1 = 10; + final long requestId2 = 20; + final HalClientMonitor.LazyDaemon<Object> lazyDaemon = () -> mock(Object.class); + final ClientMonitorCallbackConverter callback = mock(ClientMonitorCallbackConverter.class); + final TestAuthenticationClient client1 = new TestAuthenticationClient( + mContext, lazyDaemon, mToken, callback); + client1.setRequestId(requestId1); + final TestAuthenticationClient client2 = new TestAuthenticationClient( + mContext, lazyDaemon, mToken, callback); + client2.setRequestId(requestId2); + + mScheduler.scheduleClientMonitor(client1); + mScheduler.scheduleClientMonitor(client2); + mScheduler.startPreparedClient(client1.getCookie()); + waitForIdle(); + mScheduler.cancelAuthenticationOrDetection(mToken, 9999); + waitForIdle(); + + assertEquals(Operation.STATE_STARTED, + mScheduler.mCurrentOperation.mState); + assertEquals(Operation.STATE_WAITING_IN_QUEUE, + mScheduler.mPendingOperations.getFirst().mState); + + mScheduler.cancelAuthenticationOrDetection(mToken, requestId2); + waitForIdle(); + + assertEquals(Operation.STATE_STARTED, + mScheduler.mCurrentOperation.mState); + assertEquals(Operation.STATE_WAITING_IN_QUEUE_CANCELING, + mScheduler.mPendingOperations.getFirst().mState); + } + + @Test public void testInterruptPrecedingClients_whenExpected() { final BaseClientMonitor interruptableMonitor = mock(BaseClientMonitor.class, withSettings().extraInterfaces(Interruptable.class)); @@ -377,12 +479,10 @@ public class BiometricSchedulerTest { @Override protected void stopHalOperation() { - } @Override protected void startHalOperation() { - } @Override @@ -397,6 +497,7 @@ public class BiometricSchedulerTest { } private static class TestAuthenticationClient extends AuthenticationClient<Object> { + int mNumCancels = 0; public TestAuthenticationClient(@NonNull Context context, @NonNull LazyDaemon<Object> lazyDaemon, @NonNull IBinder token, @@ -428,6 +529,11 @@ public class BiometricSchedulerTest { public boolean wasUserDetected() { return false; } + + public void cancel() { + mNumCancels++; + super.cancel(); + } } private static class TestClientMonitor2 extends TestClientMonitor { diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java index 1ac28abb4c2f..4564296810ff 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayModeDirectorTest.java @@ -56,7 +56,11 @@ import android.hardware.display.DisplayManagerInternal.RefreshRateLimitation; import android.hardware.display.DisplayManagerInternal.RefreshRateRange; import android.hardware.fingerprint.IUdfpsHbmListener; import android.os.Handler; +import android.os.IThermalEventListener; +import android.os.IThermalService; import android.os.Looper; +import android.os.RemoteException; +import android.os.Temperature; import android.provider.DeviceConfig; import android.provider.Settings; import android.test.mock.MockContentResolver; @@ -116,6 +120,8 @@ public class DisplayModeDirectorTest { public SensorManagerInternal mSensorManagerInternalMock; @Mock public DisplayManagerInternal mDisplayManagerInternalMock; + @Mock + public IThermalService mThermalServiceMock; @Before public void setUp() throws Exception { @@ -124,6 +130,7 @@ public class DisplayModeDirectorTest { final MockContentResolver resolver = mSettingsProviderRule.mockContentResolver(mContext); when(mContext.getContentResolver()).thenReturn(resolver); mInjector = spy(new FakesInjector()); + when(mInjector.getThermalService()).thenReturn(mThermalServiceMock); mHandler = new Handler(Looper.getMainLooper()); LocalServices.removeServiceForTest(StatusBarManagerInternal.class); @@ -1547,12 +1554,52 @@ public class DisplayModeDirectorTest { assertNull(vote); } + @Test + public void testSkinTemperature() throws RemoteException { + DisplayModeDirector director = + createDirectorFromRefreshRateArray(new float[] {60.0f, 90.0f}, 0); + director.start(createMockSensorManager()); + + ArgumentCaptor<IThermalEventListener> thermalEventListener = + ArgumentCaptor.forClass(IThermalEventListener.class); + + verify(mThermalServiceMock).registerThermalEventListenerWithType( + thermalEventListener.capture(), eq(Temperature.TYPE_SKIN)); + final IThermalEventListener listener = thermalEventListener.getValue(); + + // Verify that there is no skin temperature vote initially. + Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_SKIN_TEMPERATURE); + assertNull(vote); + + // Set the skin temperature to critical and verify that we added a vote. + listener.notifyThrottling(getSkinTemp(Temperature.THROTTLING_CRITICAL)); + vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_SKIN_TEMPERATURE); + assertVoteForRefreshRateRange(vote, 0f, 60.f); + + // Set the skin temperature to severe and verify that the vote is gone. + listener.notifyThrottling(getSkinTemp(Temperature.THROTTLING_SEVERE)); + vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_SKIN_TEMPERATURE); + assertNull(vote); + } + + private Temperature getSkinTemp(@Temperature.ThrottlingStatus int status) { + return new Temperature(30.0f, Temperature.TYPE_SKIN, "test_skin_temp", status); + } + private void assertVoteForRefreshRate(Vote vote, float refreshRate) { assertThat(vote).isNotNull(); final RefreshRateRange expectedRange = new RefreshRateRange(refreshRate, refreshRate); assertThat(vote.refreshRateRange).isEqualTo(expectedRange); } + private void assertVoteForRefreshRateRange( + Vote vote, float refreshRateLow, float refreshRateHigh) { + assertThat(vote).isNotNull(); + final RefreshRateRange expectedRange = + new RefreshRateRange(refreshRateLow, refreshRateHigh); + assertThat(vote.refreshRateRange).isEqualTo(expectedRange); + } + public static class FakeDeviceConfig extends FakeDeviceConfigInterface { @Override public String getProperty(String namespace, String name) { @@ -1748,6 +1795,11 @@ public class DisplayModeDirectorTest { return false; } + @Override + public IThermalService getThermalService() { + return null; + } + void notifyPeakRefreshRateChanged() { if (mPeakRefreshRateObserver != null) { mPeakRefreshRateObserver.dispatchChange(false /*selfChange*/, diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java index 8ca14bc0bb86..b95d56b58d06 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java @@ -173,7 +173,10 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { @Override public void onFixedRotationFinished(int displayId) {} }; - mAtm.mWindowManager.registerDisplayWindowListener(listener); + int[] displayIds = mAtm.mWindowManager.registerDisplayWindowListener(listener); + for (int i = 0; i < displayIds.length; i++) { + added.add(displayIds[i]); + } // Check that existing displays call added assertEquals(mRootWindowContainer.getChildCount(), added.size()); assertEquals(0, changed.size()); diff --git a/telephony/java/android/telephony/AvailableNetworkInfo.java b/telephony/java/android/telephony/AvailableNetworkInfo.java index a1c5bbefbbe1..ae597e02f33c 100644 --- a/telephony/java/android/telephony/AvailableNetworkInfo.java +++ b/telephony/java/android/telephony/AvailableNetworkInfo.java @@ -19,6 +19,7 @@ package android.telephony; import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; +import android.telephony.RadioAccessSpecifier; import java.util.ArrayList; import java.util.Arrays; @@ -76,13 +77,28 @@ public final class AvailableNetworkInfo implements Parcelable { * Opportunistic network service will use these bands to scan. * * When no specific bands are specified (empty array or null) CBRS band - * {@link AccessNetworkConstants.EutranBand.BAND_48} will be used for network scan. + * {@link AccessNetworkConstants.EutranBand.BAND_48 + * } will be used for network scan. * * See {@link AccessNetworkConstants} for details. + * + * @deprecated use {@link #mRadioAccessSpecifiers} instead */ + @Deprecated private ArrayList<Integer> mBands; /** + * Returns a list of {@link RadioAccessSpecifier} associated with the available network. + * Opportunistic network service will use this to determine which bands to scan for. + * + * If this entry is left empty, {@link RadioAcccessSpecifier}s with {@link AccessNetworkType}s + * of {@link AccessNetworkConstants.AccessNetworkType.EUTRAN} and {@link + * AccessNetworkConstants.AccessNetworkType.NGRAN} with bands 48 and 71 on each will be assumed + * by Opportunistic network service. + */ + private ArrayList<RadioAccessSpecifier> mRadioAccessSpecifiers; + + /** * Return subscription Id of the available network. * This value must be one of the entry retrieved from * {@link SubscriptionManager#getOpportunisticSubscriptions} @@ -129,6 +145,22 @@ public final class AvailableNetworkInfo implements Parcelable { return (List<Integer>) mBands.clone(); } + /** + * Returns a list of {@link RadioAccessSpecifier} associated with the available network. + * Opportunistic network service will use this to determine which bands to scan for. + * + * the returned value is one of {@link AccessNetworkConstants.AccessNetworkType}. When no + * specific access network type is specified, {@link RadioAccessSpecifier}s with {@link + * AccessNetworkType}s of {@link AccessNetworkConstants.AccessNetworkType.EUTRAN} and {@link + * AccessNetworkConstants.AccessNetworkType.NGRAN} with bands 48 and 71 on each will be assumed + * by Opportunistic network service. + * @return the access network type associated with the available network. + * @hide + */ + public List<RadioAccessSpecifier> getRadioAccessSpecifiers() { + return (List<RadioAccessSpecifier>) mRadioAccessSpecifiers.clone(); + } + @Override public int describeContents() { return 0; @@ -140,6 +172,7 @@ public final class AvailableNetworkInfo implements Parcelable { dest.writeInt(mPriority); dest.writeStringList(mMccMncs); dest.writeList(mBands); + dest.writeList(mRadioAccessSpecifiers); } private AvailableNetworkInfo(Parcel in) { @@ -149,14 +182,25 @@ public final class AvailableNetworkInfo implements Parcelable { in.readStringList(mMccMncs); mBands = new ArrayList<>(); in.readList(mBands, Integer.class.getClassLoader()); + mRadioAccessSpecifiers = new ArrayList<>(); + in.readList(mRadioAccessSpecifiers, RadioAccessSpecifier.class.getClassLoader()); } public AvailableNetworkInfo(int subId, int priority, @NonNull List<String> mccMncs, @NonNull List<Integer> bands) { + this(subId, priority, mccMncs, bands, + new ArrayList<RadioAccessSpecifier>()); + } + + /** @hide */ + private AvailableNetworkInfo(int subId, int priority, @NonNull List<String> mccMncs, + @NonNull List<Integer> bands, @NonNull List<RadioAccessSpecifier> + radioAccessSpecifiers) { mSubId = subId; mPriority = priority; mMccMncs = new ArrayList<String>(mccMncs); mBands = new ArrayList<Integer>(bands); + mRadioAccessSpecifiers = new ArrayList<RadioAccessSpecifier>(radioAccessSpecifiers); } @Override @@ -177,12 +221,13 @@ public final class AvailableNetworkInfo implements Parcelable { && mPriority == ani.mPriority && (((mMccMncs != null) && mMccMncs.equals(ani.mMccMncs))) - && mBands.equals(ani.mBands)); + && mBands.equals(ani.mBands)) + && mRadioAccessSpecifiers.equals(ani.getRadioAccessSpecifiers()); } @Override public int hashCode() { - return Objects.hash(mSubId, mPriority, mMccMncs, mBands); + return Objects.hash(mSubId, mPriority, mMccMncs, mBands, mRadioAccessSpecifiers); } public static final @android.annotation.NonNull Parcelable.Creator<AvailableNetworkInfo> CREATOR = @@ -204,6 +249,72 @@ public final class AvailableNetworkInfo implements Parcelable { + " mSubId: " + mSubId + " mPriority: " + mPriority + " mMccMncs: " + Arrays.toString(mMccMncs.toArray()) - + " mBands: " + Arrays.toString(mBands.toArray())); + + " mBands: " + Arrays.toString(mBands.toArray()) + + " mRadioAccessSpecifiers: " + Arrays.toString(mRadioAccessSpecifiers.toArray())); + } + + /** + * Provides a convenient way to set the fields of a {@link AvailableNetworkInfo} when + * creating a new instance. + * + * <p>The example below shows how you might create a new {@code AvailableNetworkInfo}: + * + * <pre><code> + * + * AvailableNetworkInfo aNI = new AvailableNetworkInfo.Builder() + * .setSubId(1) + * .setPriority(AvailableNetworkInfo.PRIORITY_MED) + * .build(); + * </code></pre> + * + * @hide + */ + public static final class Builder { + private int mSubId = Integer.MIN_VALUE; + private int mPriority = AvailableNetworkInfo.PRIORITY_LOW; + private ArrayList<String> mMccMncs = new ArrayList<>(); + private ArrayList<Integer> mBands = new ArrayList<>(); + private ArrayList<RadioAccessSpecifier> mRadioAccessSpecifiers = new ArrayList<>(); + + public @NonNull Builder setSubId(int subId) { + mSubId = subId; + return this; + } + + public @NonNull Builder setPriority(int priority) { + if (priority > AvailableNetworkInfo.PRIORITY_LOW + || priority < AvailableNetworkInfo.PRIORITY_HIGH) { + throw new IllegalArgumentException("A valid priority must be set"); + } + mPriority = priority; + return this; + } + + public @NonNull Builder setMccMncs(@NonNull ArrayList<String> mccMncs) { + Objects.requireNonNull(mccMncs, "A non-null ArrayList of mccmncs must be set. An empty " + + "list is still accepted. Please read documentation in " + + "AvailableNetworkService to see consequences of an empty Arraylist."); + mMccMncs = mccMncs; + return this; + } + + public @NonNull Builder setRadioAccessSpecifiers( + @NonNull ArrayList<RadioAccessSpecifier> radioAccessSpecifiers) { + Objects.requireNonNull(radioAccessSpecifiers, "A non-null ArrayList of " + + "RadioAccessSpecifiers must be set. An empty list is still accepted. Please " + + "read documentation in AvailableNetworkService to see consequences of an " + + "empty Arraylist."); + mRadioAccessSpecifiers = radioAccessSpecifiers; + return this; + } + + public @NonNull AvailableNetworkInfo build() { + if (mSubId == Integer.MIN_VALUE) { + throw new IllegalArgumentException("A valid subId must be set"); + } + + return new AvailableNetworkInfo(mSubId, mPriority, mMccMncs, mBands, + mRadioAccessSpecifiers); + } } } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 72ad23b8edb1..6a86e59da263 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -3751,6 +3751,109 @@ public class CarrierConfigManager { "opportunistic_network_max_backoff_time_long"; /** + * Controls SS-RSRP threshold in dBm at which 5G opportunistic network will be considered good + * enough for internet data. + * + * @hide + */ + public static final String KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_SS_RSRP_INT = + "opportunistic_network_entry_threshold_ss_rsrp_int"; + + /** + * Controls SS-RSRQ threshold in dB at which 5G opportunistic network will be considered good + * enough for internet data. + * + * @hide + */ + public static final String KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_SS_RSRQ_DOUBLE = + "opportunistic_network_entry_threshold_ss_rsrq_double"; + + /** + * Controls SS-RSRP threshold in dBm below which 5G opportunistic network available will not + * be considered good enough for internet data. + * + * @hide + */ + public static final String KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_SS_RSRP_INT = + "opportunistic_network_exit_threshold_ss_rsrp_int"; + + /** + * Controls SS-RSRQ threshold in dB below which 5G opportunistic network available will not + * be considered good enough for internet data. + * + * @hide + */ + public static final String KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_SS_RSRQ_DOUBLE = + "opportunistic_network_exit_threshold_ss_rsrq_double"; + + /** + * Controls back off time in milliseconds for switching back to + * 5G opportunistic subscription. This time will be added to + * {@link CarrierConfigManager#KEY_OPPORTUNISTIC_NETWORK_5G_DATA_SWITCH_HYSTERESIS_TIME_LONG} to + * determine hysteresis time if there is ping pong situation + * (determined by system app or 1st party app) between primary and 5G opportunistic + * subscription. Ping ping situation is defined in + * #KEY_OPPORTUNISTIC_NETWORK_5G_PING_PONG_TIME_LONG. + * If ping pong situation continuous #KEY_OPPORTUNISTIC_5G_NETWORK_BACKOFF_TIME_LONG + * will be added to previously determined hysteresis time. + * + * @hide + */ + public static final String KEY_OPPORTUNISTIC_NETWORK_5G_BACKOFF_TIME_LONG = + "opportunistic_network_5g_backoff_time_long"; + + /** + * Controls the max back off time in milliseconds for switching back to + * 5G opportunistic subscription. + * This time will be the max hysteresis that can be determined irrespective of there is + * continuous ping pong situation or not as described in + * #KEY_OPPORTUNISTIC_NETWORK_5G_PING_PONG_TIME_LONG and + * #KEY_OPPORTUNISTIC_NETWORK_5G_BACKOFF_TIME_LONG. + * + * @hide + */ + public static final String KEY_OPPORTUNISTIC_NETWORK_5G_MAX_BACKOFF_TIME_LONG = + "opportunistic_network_5g_max_backoff_time_long"; + + /** + * Controls the ping pong determination of 5G opportunistic network. + * If opportunistic network is determined as out of service or below + * #KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_SS_RSRP_INT or + * #KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_SS_RSRQ_INT within + * #KEY_OPPORTUNISTIC_NETWORK_5G_PING_PONG_TIME_LONG of switching to opportunistic network, + * it will be determined as ping pong situation by system app or 1st party app. + * + * @hide + */ + public static final String KEY_OPPORTUNISTIC_NETWORK_5G_PING_PONG_TIME_LONG = + "opportunistic_network_5g_ping_pong_time_long"; + + /** + * Controls hysteresis time in milliseconds for which will be waited before switching + * data to a 5G opportunistic network. + * + * @hide + */ + public static final String KEY_OPPORTUNISTIC_NETWORK_5G_DATA_SWITCH_HYSTERESIS_TIME_LONG = + "opportunistic_network_5g_data_switch_hysteresis_time_long"; + + /** + * Controls hysteresis time in milliseconds for which will be waited before switching from + * 5G opportunistic network to primary network. + * + * @hide + */ + public static final String KEY_OPPORTUNISTIC_NETWORK_5G_DATA_SWITCH_EXIT_HYSTERESIS_TIME_LONG = + "opportunistic_network_5g_data_switch_exit_hysteresis_time_long"; + /** + * Controls whether 4G opportunistic networks should be scanned for possible data switch. + * + * @hide + */ + public static final String KEY_ENABLE_4G_OPPORTUNISTIC_NETWORK_SCAN_BOOL = + "enabled_4g_opportunistic_network_scan_bool"; + + /** * Indicates zero or more emergency number prefix(es), because some carrier requires * if users dial an emergency number address with a specific prefix, the combination of the * prefix and the address is also a valid emergency number to dial. For example, an emergency @@ -5581,7 +5684,25 @@ public class CarrierConfigManager { sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_BACKOFF_TIME_LONG, 10000); /* Default value is 60 seconds. */ sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_MAX_BACKOFF_TIME_LONG, 60000); - sDefaults.putAll(ImsServiceEntitlement.getDefaults()); + /* Default value is -111 dBm. */ + sDefaults.putInt(KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_SS_RSRP_INT, -111); + /* Default value is -18.5 dB. */ + sDefaults.putDouble(KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_SS_RSRQ_DOUBLE, -18.5); + /* Default value is -120 dBm. */ + sDefaults.putInt(KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_SS_RSRP_INT, -120); + /* Default value is -18.5 dB. */ + sDefaults.putDouble(KEY_OPPORTUNISTIC_NETWORK_EXIT_THRESHOLD_SS_RSRQ_DOUBLE, -18.5); + /* Default value is 10 seconds. */ + sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_5G_BACKOFF_TIME_LONG, 10000); + /* Default value is 60 seconds. */ + sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_5G_MAX_BACKOFF_TIME_LONG, 60000); + /* Default value is 60 seconds. */ + sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_5G_PING_PONG_TIME_LONG, 60000); + /* Default value is 2 seconds. */ + sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_5G_DATA_SWITCH_HYSTERESIS_TIME_LONG, 2000); + /* Default value is 2 seconds. */ + sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_5G_DATA_SWITCH_EXIT_HYSTERESIS_TIME_LONG, 2000); + sDefaults.putBoolean(KEY_ENABLE_4G_OPPORTUNISTIC_NETWORK_SCAN_BOOL, true); sDefaults.putAll(Gps.getDefaults()); sDefaults.putIntArray(KEY_CDMA_ENHANCED_ROAMING_INDICATOR_FOR_HOME_NETWORK_INT_ARRAY, new int[] { diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 255a61266ebf..8f3172a14074 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -3483,7 +3483,8 @@ public class TelephonyManager { */ private int getLogicalSlotIndex(int physicalSlotIndex) { UiccSlotInfo[] slotInfos = getUiccSlotsInfo(); - if (slotInfos != null && physicalSlotIndex >= 0 && physicalSlotIndex < slotInfos.length) { + if (slotInfos != null && physicalSlotIndex >= 0 && physicalSlotIndex < slotInfos.length + && slotInfos[physicalSlotIndex] != null) { return slotInfos[physicalSlotIndex].getLogicalSlotIdx(); } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt index 08c9e5dc7b64..2cc19438b927 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt @@ -36,30 +36,35 @@ fun FlickerTestParameter.navBarWindowIsVisible() { } } +/** + * If [allStates] is true, checks if the stack space of all displays is fully covered + * by any visible layer, during the whole transitions + * + * Otherwise, checks if the stack space of all displays is fully covered + * by any visible layer, at the start and end of the transition + * + * @param allStates if all states should be checked, othersie, just initial and final + */ @JvmOverloads -fun FlickerTestParameter.entireScreenCovered( - beginRotation: Int, - endRotation: Int = beginRotation, - allStates: Boolean = true -) { - val startingBounds = WindowUtils.getDisplayBounds(beginRotation) - val endingBounds = WindowUtils.getDisplayBounds(endRotation) +fun FlickerTestParameter.entireScreenCovered(allStates: Boolean = true) { if (allStates) { assertLayers { - if (startingBounds == endingBounds) { - this.coversAtLeast(startingBounds) - } else { - this.coversAtLeast(startingBounds) - .then() - .coversAtLeast(endingBounds) + this.invoke("entireScreenCovered") { entry -> + entry.entry.displays.forEach { display -> + entry.visibleRegion().coversAtLeast(display.layerStackSpace) + } } } } else { assertLayersStart { - this.visibleRegion().coversAtLeast(startingBounds) + this.entry.displays.forEach { display -> + this.visibleRegion().coversAtLeast(display.layerStackSpace) + } } assertLayersEnd { - this.visibleRegion().coversAtLeast(endingBounds) + this.entry.displays.forEach { display -> + this.visibleRegion().coversAtLeast(display.layerStackSpace) + } } } } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt index f9e6babee938..1efb6daae31b 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt @@ -123,9 +123,7 @@ abstract class CloseAppTransition(protected val testSpec: FlickerTestParameter) @Presubmit @Test - open fun entireScreenCovered() { - testSpec.entireScreenCovered(testSpec.config.startRotation, Surface.ROTATION_0) - } + open fun entireScreenCovered() = testSpec.entireScreenCovered() @Presubmit @Test @@ -152,4 +150,4 @@ abstract class CloseAppTransition(protected val testSpec: FlickerTestParameter) open fun launcherLayerReplacesApp() { testSpec.replacesLayer(testApp.component, LAUNCHER_COMPONENT) } -}
\ No newline at end of file +} diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/NonResizeableAppHelper.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/NonResizeableAppHelper.kt new file mode 100644 index 000000000000..3074e28b43fa --- /dev/null +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/NonResizeableAppHelper.kt @@ -0,0 +1,32 @@ +/* + * 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.wm.flicker.helpers + +import android.app.Instrumentation +import android.content.ComponentName +import android.support.test.launcherhelper.ILauncherStrategy +import android.support.test.launcherhelper.LauncherStrategyFactory +import com.android.server.wm.flicker.testapp.ActivityOptions + +class NonResizeableAppHelper @JvmOverloads constructor( + instr: Instrumentation, + launcherName: String = ActivityOptions.NON_RESIZEABLE_ACTIVITY_LAUNCHER_NAME, + component: ComponentName = ActivityOptions.NON_RESIZEABLE_ACTIVITY_COMPONENT_NAME, + launcherStrategy: ILauncherStrategy = LauncherStrategyFactory + .getInstance(instr) + .launcherStrategy +) : StandardAppHelper(instr, launcherName, component, launcherStrategy)
\ No newline at end of file diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/TwoActivitiesAppHelper.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/TwoActivitiesAppHelper.kt new file mode 100644 index 000000000000..19fefb93b487 --- /dev/null +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/TwoActivitiesAppHelper.kt @@ -0,0 +1,50 @@ +/* + * 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.wm.flicker.helpers + +import android.app.Instrumentation +import android.content.ComponentName +import android.support.test.launcherhelper.ILauncherStrategy +import android.support.test.launcherhelper.LauncherStrategyFactory +import androidx.test.uiautomator.By +import androidx.test.uiautomator.UiDevice +import androidx.test.uiautomator.Until +import com.android.server.wm.flicker.testapp.ActivityOptions +import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper + +class TwoActivitiesAppHelper @JvmOverloads constructor( + instr: Instrumentation, + launcherName: String = ActivityOptions.BUTTON_ACTIVITY_LAUNCHER_NAME, + component: ComponentName = ActivityOptions.BUTTON_ACTIVITY_COMPONENT_NAME, + launcherStrategy: ILauncherStrategy = LauncherStrategyFactory + .getInstance(instr) + .launcherStrategy +) : StandardAppHelper(instr, launcherName, component, launcherStrategy) { + fun openSecondActivity(device: UiDevice, wmHelper: WindowManagerStateHelper) { + val button = device.wait( + Until.findObject(By.res(getPackage(), "launch_second_activity")), + FIND_TIMEOUT) + + require(button != null) { + "Button not found, this usually happens when the device " + + "was left in an unknown state (e.g. in split screen)" + } + button.click() + wmHelper.waitForAppTransitionIdle() + wmHelper.waitForFullScreenApp(component) + } +}
\ No newline at end of file diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt index 384d8e8e998d..d17e77d74c1c 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt @@ -119,7 +119,7 @@ class CloseImeAutoOpenWindowToAppTest(private val testSpec: FlickerTestParameter @Presubmit @Test - fun entireScreenCovered() = testSpec.entireScreenCovered(testSpec.config.startRotation) + fun entireScreenCovered() = testSpec.entireScreenCovered() @Presubmit @Test diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt index ade215b3022d..6f0f55aa4888 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt @@ -116,8 +116,7 @@ class CloseImeAutoOpenWindowToHomeTest(private val testSpec: FlickerTestParamete @Presubmit @Test - fun entireScreenCovered() = testSpec.entireScreenCovered(testSpec.config.startRotation, - Surface.ROTATION_0) + fun entireScreenCovered() = testSpec.entireScreenCovered() @Presubmit @Test diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt index cdfcff3d4beb..6751439709bf 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt @@ -115,7 +115,7 @@ class CloseImeWindowToAppTest(private val testSpec: FlickerTestParameter) { @Presubmit @Test - fun entireScreenCovered() = testSpec.entireScreenCovered(testSpec.config.startRotation) + fun entireScreenCovered() = testSpec.entireScreenCovered() @Presubmit @Test @@ -165,4 +165,4 @@ class CloseImeWindowToAppTest(private val testSpec: FlickerTestParameter) { .getConfigNonRotationTests(repetitions = 5) } } -}
\ No newline at end of file +} diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt index 05fc2672168e..8aaf9251018f 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt @@ -125,8 +125,7 @@ class CloseImeWindowToHomeTest(private val testSpec: FlickerTestParameter) { @Presubmit @Test - fun entireScreenCovered() = testSpec.entireScreenCovered(testSpec.config.startRotation, - Surface.ROTATION_0) + fun entireScreenCovered() = testSpec.entireScreenCovered() @Presubmit @Test diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt index f35a180e1ad6..665204bc9e1e 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt @@ -108,7 +108,7 @@ class OpenImeWindowTest(private val testSpec: FlickerTestParameter) { @Presubmit @Test - fun entireScreenCovered() = testSpec.entireScreenCovered(testSpec.config.startRotation) + fun entireScreenCovered() = testSpec.entireScreenCovered() @Presubmit @Test diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt index 3bcf793e9071..fe1b1cd4795d 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt @@ -143,8 +143,7 @@ class ReOpenImeWindowTest(private val testSpec: FlickerTestParameter) { @Presubmit @Test // During testing the launcher is always in portrait mode - fun entireScreenCovered() = testSpec.entireScreenCovered(testSpec.config.startRotation, - testSpec.config.endRotation) + fun entireScreenCovered() = testSpec.entireScreenCovered() @Presubmit @Test diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt new file mode 100644 index 000000000000..42c252e70eea --- /dev/null +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt @@ -0,0 +1,116 @@ +/* + * 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.wm.flicker.launch + +import android.app.Instrumentation +import android.platform.test.annotations.Presubmit +import androidx.test.filters.RequiresDevice +import androidx.test.platform.app.InstrumentationRegistry +import com.android.server.wm.flicker.entireScreenCovered +import com.android.server.wm.flicker.FlickerBuilderProvider +import com.android.server.wm.flicker.FlickerParametersRunnerFactory +import com.android.server.wm.flicker.FlickerTestParameter +import com.android.server.wm.flicker.FlickerTestParameterFactory +import com.android.server.wm.flicker.LAUNCHER_COMPONENT +import com.android.server.wm.flicker.repetitions +import com.android.server.wm.flicker.annotation.Group1 +import com.android.server.wm.flicker.dsl.FlickerBuilder +import com.android.server.wm.flicker.helpers.TwoActivitiesAppHelper +import com.android.server.wm.flicker.testapp.ActivityOptions +import org.junit.FixMethodOrder +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.MethodSorters +import org.junit.runners.Parameterized + +/** + * Test the back and forward transition between 2 activities. + * To run this test: `atest FlickerTests:ActivitiesTransitionTest` + */ +@RequiresDevice +@RunWith(Parameterized::class) +@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@Group1 +class ActivitiesTransitionTest(val testSpec: FlickerTestParameter) { + val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation() + private val testApp: TwoActivitiesAppHelper = TwoActivitiesAppHelper(instrumentation) + + @FlickerBuilderProvider + fun buildFlicker(): FlickerBuilder { + return FlickerBuilder(instrumentation).apply { + withTestName { testSpec.name } + repeat { testSpec.config.repetitions } + setup { + eachRun { + testApp.launchViaIntent(wmHelper) + wmHelper.waitForFullScreenApp(testApp.component) + } + } + teardown { + test { + testApp.exit() + } + } + transitions { + testApp.openSecondActivity(device, wmHelper) + device.pressBack() + wmHelper.waitForAppTransitionIdle() + wmHelper.waitForFullScreenApp(testApp.component) + } + } + } + + @Presubmit + @Test + fun finishSubActivity() { + testSpec.assertWm { + this.isAppWindowOnTop(ActivityOptions.BUTTON_ACTIVITY_COMPONENT_NAME) + .then() + .isAppWindowOnTop(ActivityOptions.SIMPLE_ACTIVITY_AUTO_FOCUS_COMPONENT_NAME) + .then() + .isAppWindowOnTop(ActivityOptions.BUTTON_ACTIVITY_COMPONENT_NAME) + } + } + + @Presubmit + @Test + fun entireScreenCovered() = testSpec.entireScreenCovered() + + @Presubmit + @Test + fun launcherWindowNotVisible() { + testSpec.assertWm { + this.isAppWindowInvisible(LAUNCHER_COMPONENT, ignoreActivity = true) + } + } + + @Presubmit + @Test + fun launcherLayerNotVisible() { + testSpec.assertLayers { this.isInvisible(LAUNCHER_COMPONENT) } + } + + companion object { + @Parameterized.Parameters(name = "{0}") + @JvmStatic + fun getParams(): Collection<FlickerTestParameter> { + return FlickerTestParameterFactory.getInstance() + .getConfigNonRotationTests(repetitions = 5) + } + } +} diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt index e6dc8523acbf..be919cd67c1e 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt @@ -16,6 +16,8 @@ package com.android.server.wm.flicker.launch +import android.platform.test.annotations.Postsubmit +import android.platform.test.annotations.Presubmit import androidx.test.filters.FlakyTest import androidx.test.filters.RequiresDevice import com.android.server.wm.flicker.FlickerParametersRunnerFactory @@ -33,8 +35,21 @@ import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** - * Test cold launch app from launcher. + * Test cold launching an app from launcher + * * To run this test: `atest FlickerTests:OpenAppColdTest` + * + * Actions: + * Make sure no apps are running on the device + * Launch an app [testApp] and wait animation to complete + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited [OpenAppTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup */ @RequiresDevice @RunWith(Parameterized::class) @@ -42,6 +57,9 @@ import org.junit.runners.Parameterized @FixMethodOrder(MethodSorters.NAME_ASCENDING) @Group1 class OpenAppColdTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSpec) { + /** + * Defines the transition used to run the test + */ override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit get() = { super.transition(this, it) @@ -62,25 +80,46 @@ class OpenAppColdTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSp } } + /** {@inheritDoc} */ @FlakyTest @Test override fun navBarLayerRotatesAndScales() { super.navBarLayerRotatesAndScales() } - @FlakyTest(bugId = 192721431) + /** {@inheritDoc} */ + @Postsubmit @Test - override fun appLayerReplacesLauncher() { - super.appLayerReplacesLauncher() - } + override fun appLayerReplacesLauncher() = super.appLayerReplacesLauncher() - @FlakyTest(bugId = 192721431) + /** {@inheritDoc} */ + @Postsubmit @Test - override fun appWindowReplacesLauncherAsTopWindow() { + override fun appWindowReplacesLauncherAsTopWindow() = super.appWindowReplacesLauncherAsTopWindow() - } + + /** {@inheritDoc} */ + @Presubmit + @Test + override fun launcherWindowBecomesInvisible() = super.launcherWindowBecomesInvisible() + + /** {@inheritDoc} */ + @Presubmit + @Test + override fun navBarLayerIsVisible() = super.navBarLayerIsVisible() + + /** {@inheritDoc} */ + @Presubmit + @Test + override fun navBarWindowIsVisible() = super.navBarWindowIsVisible() companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ @Parameterized.Parameters(name = "{0}") @JvmStatic fun getParams(): Collection<FlickerTestParameter> { diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt index 7833e2f25eec..3678f33aa46e 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt @@ -16,6 +16,7 @@ package com.android.server.wm.flicker.launch +import android.platform.test.annotations.Presubmit import androidx.test.filters.FlakyTest import androidx.test.filters.RequiresDevice import com.android.server.wm.flicker.FlickerParametersRunnerFactory @@ -33,8 +34,23 @@ import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** - * Launch an app from the recents app view (the overview) + * Test launching an app from the recents app view (the overview) + * * To run this test: `atest FlickerTests:OpenAppFromOverviewTest` + * + * Actions: + * Launch [testApp] + * Press recents + * Relaunch an app [testApp] by selecting it in the overview screen, and wait animation to + * complete (only this action is traced) + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited [OpenAppTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup */ @RequiresDevice @RunWith(Parameterized::class) @@ -42,6 +58,9 @@ import org.junit.runners.Parameterized @FixMethodOrder(MethodSorters.NAME_ASCENDING) @Group1 class OpenAppFromOverviewTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSpec) { + /** + * Defines the transition used to run the test + */ override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit get() = { super.transition(this, it) @@ -63,13 +82,38 @@ class OpenAppFromOverviewTest(testSpec: FlickerTestParameter) : OpenAppTransitio } } + /** {@inheritDoc} */ @FlakyTest @Test - override fun navBarLayerRotatesAndScales() { - super.navBarLayerRotatesAndScales() - } + override fun navBarLayerRotatesAndScales() = super.navBarLayerRotatesAndScales() + + /** {@inheritDoc} */ + @Presubmit + @Test + override fun appLayerReplacesLauncher() = super.appLayerReplacesLauncher() + + /** {@inheritDoc} */ + @Presubmit + @Test + override fun launcherWindowBecomesInvisible() = super.launcherWindowBecomesInvisible() + + /** {@inheritDoc} */ + @Presubmit + @Test + override fun navBarLayerIsVisible() = super.navBarLayerIsVisible() + + /** {@inheritDoc} */ + @Presubmit + @Test + override fun navBarWindowIsVisible() = super.navBarWindowIsVisible() companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ @Parameterized.Parameters(name = "{0}") @JvmStatic fun getParams(): Collection<FlickerTestParameter> { diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt new file mode 100644 index 000000000000..b7176122095b --- /dev/null +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt @@ -0,0 +1,244 @@ +/* + * 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.wm.flicker.launch + +import android.content.ComponentName +import android.platform.test.annotations.Postsubmit +import android.platform.test.annotations.Presubmit +import android.view.Surface +import android.view.WindowManagerPolicyConstants +import androidx.test.filters.FlakyTest +import androidx.test.filters.RequiresDevice +import com.android.server.wm.flicker.FlickerParametersRunnerFactory +import com.android.server.wm.flicker.FlickerTestParameter +import com.android.server.wm.flicker.FlickerTestParameterFactory +import com.android.server.wm.flicker.annotation.Group1 +import com.android.server.wm.flicker.helpers.NonResizeableAppHelper +import com.android.server.wm.flicker.dsl.FlickerBuilder +import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper +import com.google.common.truth.Truth +import org.junit.FixMethodOrder +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.MethodSorters +import org.junit.runners.Parameterized + +/** + * Test launching an app while the device is locked + * + * To run this test: `atest FlickerTests:OpenAppNonResizeableTest` + * + * Actions: + * Lock the device. + * Launch an app on top of the lock screen [testApp] and wait animation to complete + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited [OpenAppTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup + */ +@RequiresDevice +@RunWith(Parameterized::class) +@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@Group1 +class OpenAppNonResizeableTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSpec) { + override val testApp = NonResizeableAppHelper(instrumentation) + private val colorFadComponent = ComponentName("", "ColorFade BLAST#") + + /** + * Defines the transition used to run the test + */ + override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit + get() = { args -> + super.transition(this, args) + setup { + eachRun { + device.sleep() + wmHelper.waitFor("noAppWindowsOnTop") { + it.wmState.topVisibleAppWindow.isEmpty() + } + } + } + teardown { + eachRun { + testApp.exit(wmHelper) + } + } + transitions { + testApp.launchViaIntent(wmHelper) + wmHelper.waitForFullScreenApp(testApp.component) + } + } + + /** + * Checks that the nav bar layer starts visible, becomes invisible during unlocking animation + * and becomes visible at the end + */ + @Presubmit + @Test + fun navBarLayerVisibilityChanges() { + testSpec.assertLayers { + this.isVisible(WindowManagerStateHelper.NAV_BAR_COMPONENT) + .then() + .isInvisible(WindowManagerStateHelper.NAV_BAR_COMPONENT) + .then() + .isVisible(WindowManagerStateHelper.NAV_BAR_COMPONENT) + } + } + + /** + * Checks that the app layer doesn't exist at the start of the transition, that it is + * created (invisible) and becomes visible during the transition + */ + @Presubmit + @Test + fun appLayerBecomesVisible() { + testSpec.assertLayers { + this.notContains(testApp.component) + .then() + .isInvisible(testApp.component) + .then() + .isVisible(testApp.component) + } + } + + /** + * Checks that the app window doesn't exist at the start of the transition, that it is + * created (invisible - optional) and becomes visible during the transition + * + * The `isAppWindowInvisible` step is optional because we log once per frame, upon logging, + * the window may be visible or not depending on what was processed until that moment. + */ + @Presubmit + @Test + fun appWindowBecomesVisible() { + testSpec.assertWm { + this.notContains(testApp.component) + .then() + .isAppWindowInvisible(testApp.component, + ignoreActivity = true, isOptional = true) + .then() + .isAppWindowVisible(testApp.component, ignoreActivity = true) + } + } + + /** + * Checks if [testApp] is visible at the end of the transition + */ + @Presubmit + @Test + fun appWindowBecomesVisibleAtEnd() { + testSpec.assertWmEnd { + this.isVisible(testApp.component) + } + } + + /** + * Checks that the nav bar starts the transition visible, then becomes invisible during + * then unlocking animation and becomes visible at the end of the transition + */ + @Postsubmit + @Test + fun navBarWindowsVisibilityChanges() { + testSpec.assertWm { + this.isAboveAppWindowVisible(WindowManagerStateHelper.NAV_BAR_COMPONENT) + .then() + .isNonAppWindowInvisible(WindowManagerStateHelper.NAV_BAR_COMPONENT) + .then() + .isAboveAppWindowVisible(WindowManagerStateHelper.NAV_BAR_COMPONENT) + } + } + + /** {@inheritDoc} */ + @FlakyTest + @Test + override fun visibleWindowsShownMoreThanOneConsecutiveEntry() = + super.visibleWindowsShownMoreThanOneConsecutiveEntry() + + /** {@inheritDoc} */ + @FlakyTest + @Test + override fun visibleLayersShownMoreThanOneConsecutiveEntry() = + super.visibleLayersShownMoreThanOneConsecutiveEntry() + + /** {@inheritDoc} */ + @Postsubmit + @Test + override fun entireScreenCovered() = super.entireScreenCovered() + + /** + * Checks that the focus changes from the launcher to [testApp] + */ + @FlakyTest + @Test + override fun focusChanges() = super.focusChanges() + + /** + * Checks that the screen is locked at the start of the transition ([colorFadComponent]) + * layer is visible + */ + @Postsubmit + @Test + fun screenLockedStart() { + testSpec.assertLayersStart { + isVisible(colorFadComponent) + } + } + + /** + * This test checks if the launcher is visible at the start and the app at the end, + * it cannot use the regular assertion (check over time), because on lock screen neither + * the app not the launcher are visible, and there is no top visible window. + */ + @Postsubmit + @Test + override fun appWindowReplacesLauncherAsTopWindow() { + testSpec.assertWm { + this.invoke("noAppWindowsOnTop") { + Truth.assertWithMessage("Should not have any app window on top " + + "when the screen is locked") + .that(it.wmState.topVisibleAppWindow) + .isEmpty() + }.then() + .isAppWindowOnTop(testApp.component) + } + } + + companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ + @Parameterized.Parameters(name = "{0}") + @JvmStatic + fun getParams(): Collection<FlickerTestParameter> { + return FlickerTestParameterFactory.getInstance() + .getConfigNonRotationTests( + repetitions = 5, + supportedNavigationModes = + listOf(WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY), + supportedRotations = listOf(Surface.ROTATION_0) + ) + } + } +}
\ No newline at end of file diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt index 860a5aed13fd..14d17f82b805 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt @@ -40,12 +40,16 @@ import com.android.server.wm.flicker.statusBarLayerIsVisible import com.android.server.wm.flicker.statusBarLayerRotatesScales import com.android.server.wm.flicker.statusBarWindowIsVisible import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper.Companion.SNAPSHOT_COMPONENT +import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper.Companion.SPLASH_SCREEN_COMPONENT import org.junit.Test abstract class OpenAppTransition(protected val testSpec: FlickerTestParameter) { protected val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation() - protected val testApp: StandardAppHelper = SimpleAppHelper(instrumentation) + protected open val testApp: StandardAppHelper = SimpleAppHelper(instrumentation) + /** + * Defines the transition used to run the test + */ protected open val transition: FlickerBuilder.(Map<String, Any?>) -> Unit = { withTestName { testSpec.name } repeat { testSpec.config.repetitions } @@ -62,6 +66,10 @@ abstract class OpenAppTransition(protected val testSpec: FlickerTestParameter) { } } + /** + * Entry point for the test runner. It will use this method to initialize and cache + * flicker executions + */ @FlickerBuilderProvider fun buildFlicker(): FlickerBuilder { return FlickerBuilder(instrumentation).apply { @@ -69,42 +77,60 @@ abstract class OpenAppTransition(protected val testSpec: FlickerTestParameter) { } } - @Presubmit - @Test + /** + * Checks that the navigation bar window is visible during the whole transition + */ open fun navBarWindowIsVisible() { testSpec.navBarWindowIsVisible() } - @Presubmit - @Test + /** + * Checks that the navigation bar layer is visible during the whole transition + */ open fun navBarLayerIsVisible() { testSpec.navBarLayerIsVisible() } + /** + * Checks the position of the navigation bar at the start and end of the transition + */ @Presubmit @Test open fun navBarLayerRotatesAndScales() { testSpec.navBarLayerRotatesAndScales(Surface.ROTATION_0, testSpec.config.endRotation) } + /** + * Checks that the status bar window is visible during the whole transition + */ @Presubmit @Test open fun statusBarWindowIsVisible() { testSpec.statusBarWindowIsVisible() } + /** + * Checks that the status bar layer is visible during the whole transition + */ @Presubmit @Test open fun statusBarLayerIsVisible() { testSpec.statusBarLayerIsVisible() } + /** + * Checks the position of the status bar at the start and end of the transition + */ @Presubmit @Test open fun statusBarLayerRotatesScales() { testSpec.statusBarLayerRotatesScales(Surface.ROTATION_0, testSpec.config.endRotation) } + /** + * Checks that all windows that are visible on the trace, are visible for at least 2 + * consecutive entries. + */ @Presubmit @Test open fun visibleWindowsShownMoreThanOneConsecutiveEntry() { @@ -113,6 +139,10 @@ abstract class OpenAppTransition(protected val testSpec: FlickerTestParameter) { } } + /** + * Checks that all layers that are visible on the trace, are visible for at least 2 + * consecutive entries. + */ @Presubmit @Test open fun visibleLayersShownMoreThanOneConsecutiveEntry() { @@ -121,13 +151,16 @@ abstract class OpenAppTransition(protected val testSpec: FlickerTestParameter) { } } + /** + * Checks that all parts of the screen are covered during the transition + */ @Presubmit @Test - // During testing the launcher is always in portrait mode - open fun entireScreenCovered() { - testSpec.entireScreenCovered(Surface.ROTATION_0, testSpec.config.endRotation) - } + open fun entireScreenCovered() = testSpec.entireScreenCovered() + /** + * Checks that the focus changes from the launcher to [testApp] + */ @Presubmit @Test open fun focusChanges() { @@ -136,12 +169,19 @@ abstract class OpenAppTransition(protected val testSpec: FlickerTestParameter) { } } - @Presubmit - @Test + /** + * Checks that [LAUNCHER_COMPONENT] layer is visible at the start of the transition, and + * is replaced by [testApp], which remains visible until the end + */ open fun appLayerReplacesLauncher() { testSpec.replacesLayer(LAUNCHER_COMPONENT, testApp.component) } + /** + * Checks that [LAUNCHER_COMPONENT] window is visible at the start of the transition, and + * is replaced by a snapshot or splash screen (optional), and finally, is replaced by + * [testApp], which remains visible until the end + */ @Presubmit @Test open fun appWindowReplacesLauncherAsTopWindow() { @@ -150,12 +190,16 @@ abstract class OpenAppTransition(protected val testSpec: FlickerTestParameter) { .then() .isAppWindowOnTop(SNAPSHOT_COMPONENT, isOptional = true) .then() + .isAppWindowOnTop(SPLASH_SCREEN_COMPONENT, isOptional = true) + .then() .isAppWindowOnTop(testApp.component) } } - @Presubmit - @Test + /** + * Checks that [LAUNCHER_COMPONENT] window is visible at the start, and + * becomes invisible during the transition + */ open fun launcherWindowBecomesInvisible() { testSpec.assertWm { this.isAppWindowVisible(LAUNCHER_COMPONENT) diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt index b509c61d2aba..5edee0cf0ca0 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt @@ -16,6 +16,7 @@ package com.android.server.wm.flicker.launch +import android.platform.test.annotations.Presubmit import androidx.test.filters.FlakyTest import androidx.test.filters.RequiresDevice import com.android.server.wm.flicker.FlickerParametersRunnerFactory @@ -32,8 +33,22 @@ import org.junit.runners.MethodSorters import org.junit.runners.Parameterized /** - * Test warm launch app. + * Test warm launching an app from launcher + * * To run this test: `atest FlickerTests:OpenAppWarmTest` + * + * Actions: + * Launch [testApp] + * Press home + * Relaunch an app [testApp] and wait animation to complete (only this action is traced) + * + * Notes: + * 1. Some default assertions (e.g., nav bar, status bar and screen covered) + * are inherited [OpenAppTransition] + * 2. Part of the test setup occurs automatically via + * [com.android.server.wm.flicker.TransitionRunnerWithRules], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup */ @RequiresDevice @RunWith(Parameterized::class) @@ -41,6 +56,9 @@ import org.junit.runners.Parameterized @FixMethodOrder(MethodSorters.NAME_ASCENDING) @Group1 class OpenAppWarmTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSpec) { + /** + * Defines the transition used to run the test + */ override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit get() = { super.transition(this, it) @@ -65,11 +83,38 @@ class OpenAppWarmTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSp } } + /** {@inheritDoc} */ @FlakyTest @Test override fun navBarLayerRotatesAndScales() = super.navBarLayerRotatesAndScales() + /** {@inheritDoc} */ + @Presubmit + @Test + override fun appLayerReplacesLauncher() = super.appLayerReplacesLauncher() + + /** {@inheritDoc} */ + @Presubmit + @Test + override fun launcherWindowBecomesInvisible() = super.launcherWindowBecomesInvisible() + + /** {@inheritDoc} */ + @Presubmit + @Test + override fun navBarLayerIsVisible() = super.navBarLayerIsVisible() + + /** {@inheritDoc} */ + @Presubmit + @Test + override fun navBarWindowIsVisible() = super.navBarWindowIsVisible() + companion object { + /** + * Creates the test configurations. + * + * See [FlickerTestParameterFactory.getConfigNonRotationTests] for configuring + * repetitions, screen orientation and navigation modes. + */ @Parameterized.Parameters(name = "{0}") @JvmStatic fun getParams(): Collection<FlickerTestParameter> { diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt new file mode 100644 index 000000000000..035aac1c5e86 --- /dev/null +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchBetweenTwoAppsBackTest.kt @@ -0,0 +1,331 @@ +/* + * 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.wm.flicker.quickswitch + +import android.app.Instrumentation +import android.platform.test.annotations.Postsubmit +import android.platform.test.annotations.RequiresDevice +import android.view.Surface +import android.view.WindowManagerPolicyConstants +import androidx.test.platform.app.InstrumentationRegistry +import com.android.server.wm.flicker.FlickerBuilderProvider +import com.android.server.wm.flicker.FlickerParametersRunnerFactory +import com.android.server.wm.flicker.FlickerTestParameter +import com.android.server.wm.flicker.FlickerTestParameterFactory +import com.android.server.wm.flicker.LAUNCHER_COMPONENT +import com.android.server.wm.flicker.annotation.Group1 +import com.android.server.wm.flicker.dsl.FlickerBuilder +import com.android.server.wm.flicker.helpers.NonResizeableAppHelper +import com.android.server.wm.flicker.helpers.SimpleAppHelper +import com.android.server.wm.flicker.helpers.WindowUtils +import com.android.server.wm.flicker.helpers.isRotated +import com.android.server.wm.flicker.navBarLayerIsVisible +import com.android.server.wm.flicker.navBarLayerRotatesAndScales +import com.android.server.wm.flicker.navBarWindowIsVisible +import com.android.server.wm.flicker.startRotation +import com.android.server.wm.flicker.statusBarLayerIsVisible +import com.android.server.wm.flicker.statusBarWindowIsVisible +import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper.Companion.SNAPSHOT_COMPONENT +import org.junit.FixMethodOrder +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.MethodSorters +import org.junit.runners.Parameterized + +/** + * Test quick switching back to previous app from last opened app + * + * To run this test: `atest FlickerTests:QuickSwitchBetweenTwoAppsBackTest` + * + * Actions: + * Launch an app [testApp1] + * Launch another app [testApp2] + * Swipe right from the bottom of the screen to quick switch back to the first app [testApp1] + * + */ +@RequiresDevice +@RunWith(Parameterized::class) +@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@Group1 +class QuickSwitchBetweenTwoAppsBackTest(private val testSpec: FlickerTestParameter) { + private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation() + + private val testApp1 = SimpleAppHelper(instrumentation) + private val testApp2 = NonResizeableAppHelper(instrumentation) + + private val startDisplayBounds = WindowUtils.getDisplayBounds(testSpec.config.startRotation) + + @FlickerBuilderProvider + fun buildFlicker(): FlickerBuilder { + return FlickerBuilder(instrumentation).apply { + setup { + eachRun { + testApp1.launchViaIntent(wmHelper) + wmHelper.waitForFullScreenApp(testApp1.component) + + testApp2.launchViaIntent(wmHelper) + wmHelper.waitForFullScreenApp(testApp2.component) + } + } + transitions { + // Swipe right from bottom to quick switch back + // NOTE: We don't perform an edge-to-edge swipe but instead only swipe in the middle + // as to not accidentally trigger a swipe back or forward action which would result + // in the same behavior but not testing quick swap. + device.swipe( + startDisplayBounds.bounds.right / 3, + startDisplayBounds.bounds.bottom, + 2 * startDisplayBounds.bounds.right / 3, + startDisplayBounds.bounds.bottom, + if (testSpec.config.startRotation.isRotated()) 75 else 30 + ) + + wmHelper.waitForFullScreenApp(testApp1.component) + wmHelper.waitForAppTransitionIdle() + } + + teardown { + test { + testApp1.exit() + testApp2.exit() + } + } + } + } + + /** + * Checks that the transition starts with [testApp2]'s windows filling/covering exactly the + * entirety of the display. + */ + @Postsubmit + @Test + fun startsWithApp2WindowsCoverFullScreen() { + testSpec.assertWmStart { + this.frameRegion(testApp2.component).coversExactly(startDisplayBounds) + } + } + + /** + * Checks that the transition starts with [testApp2]'s layers filling/covering exactly the + * entirety of the display. + */ + @Postsubmit + @Test + fun startsWithApp2LayersCoverFullScreen() { + testSpec.assertLayersStart { + this.visibleRegion(testApp2.component).coversExactly(startDisplayBounds) + } + } + + /** + * Checks that the transition starts with [testApp2] being the top window. + */ + @Postsubmit + @Test + fun startsWithApp2WindowBeingOnTop() { + testSpec.assertWmStart { + this.isAppWindowOnTop(testApp2.component) + } + } + + /** + * Checks that [testApp1] windows fill the entire screen (i.e. is "fullscreen") at the end of the + * transition once we have fully quick switched from [testApp2] back to the [testApp1]. + */ + @Postsubmit + @Test + fun endsWithApp1WindowsCoveringFullScreen() { + testSpec.assertWmEnd { + this.frameRegion(testApp1.component).coversExactly(startDisplayBounds) + } + } + + /** + * Checks that [testApp1] layers fill the entire screen (i.e. is "fullscreen") at the end of the + * transition once we have fully quick switched from [testApp2] back to the [testApp1]. + */ + @Postsubmit + @Test + fun endsWithApp1LayersCoveringFullScreen() { + testSpec.assertLayersEnd { + this.visibleRegion(testApp1.component).coversExactly(startDisplayBounds) + } + } + + /** + * Checks that [testApp1] is the top window at the end of the transition once we have fully quick + * switched from [testApp2] back to the [testApp1]. + */ + @Postsubmit + @Test + fun endsWithApp1BeingOnTop() { + testSpec.assertWmEnd { + this.isAppWindowOnTop(testApp1.component) + } + } + + /** + * Checks that [testApp1]'s window starts off invisible and becomes visible at some point before + * the end of the transition and then stays visible until the end of the transition. + */ + @Postsubmit + @Test + fun app1WindowBecomesAndStaysVisible() { + testSpec.assertWm { + this.isAppWindowInvisible(testApp1.component) + .then() + .isAppWindowVisible(SNAPSHOT_COMPONENT, isOptional = true) + .then() + .isAppWindowVisible(testApp1.component, ignoreActivity = true) + } + } + + /** + * Checks that [testApp1]'s layer starts off invisible and becomes visible at some point before + * the end of the transition and then stays visible until the end of the transition. + */ + @Postsubmit + @Test + fun app1LayerBecomesAndStaysVisible() { + testSpec.assertLayers { + this.isInvisible(testApp1.component) + .then() + .isVisible(testApp1.component) + } + } + + /** + * Checks that [testApp2]'s window starts off visible and becomes invisible at some point before + * the end of the transition and then stays invisible until the end of the transition. + */ + @Postsubmit + @Test + fun app2WindowBecomesAndStaysInvisible() { + testSpec.assertWm { + this.isAppWindowVisible(testApp2.component, ignoreActivity = true) + .then() + .isAppWindowInvisible(testApp2.component) + } + } + + /** + * Checks that [testApp2]'s layer starts off visible and becomes invisible at some point before + * the end of the transition and then stays invisible until the end of the transition. + */ + @Postsubmit + @Test + fun app2LayerBecomesAndStaysInvisible() { + testSpec.assertLayers { + this.isVisible(testApp2.component) + .then() + .isInvisible(testApp2.component) + } + } + + /** + * Checks that [testApp2]'s window is visible at least until [testApp1]'s window is visible. + * Ensures that at any point, either [testApp1] or [testApp2]'s windows are at least partially + * visible. + */ + @Postsubmit + @Test + fun app1WindowIsVisibleOnceApp2WindowIsInvisible() { + testSpec.assertWm { + this.isAppWindowVisible(testApp2.component) + .then() + // TODO: Do we actually want to test this? Seems too implementation specific... + .isAppWindowVisible(LAUNCHER_COMPONENT, isOptional = true) + .then() + .isAppWindowVisible(SNAPSHOT_COMPONENT, isOptional = true) + .then() + .isAppWindowVisible(testApp1.component) + } + } + + /** + * Checks that [testApp2]'s layer is visible at least until [testApp1]'s window is visible. + * Ensures that at any point, either [testApp1] or [testApp2]'s windows are at least partially + * visible. + */ + @Postsubmit + @Test + fun app1LayerIsVisibleOnceApp2LayerIsInvisible() { + testSpec.assertLayers { + this.isVisible(testApp2.component) + .then() + .isVisible(LAUNCHER_COMPONENT, isOptional = true) + .then() + .isVisible(SNAPSHOT_COMPONENT, isOptional = true) + .then() + .isVisible(testApp1.component) + } + } + + /** + * Checks that the navbar window is visible throughout the entire transition. + */ + @Postsubmit + @Test + fun navBarWindowIsAlwaysVisible() = testSpec.navBarWindowIsVisible() + + /** + * Checks that the navbar layer is visible throughout the entire transition. + */ + @Postsubmit + @Test + fun navBarLayerAlwaysIsVisible() = testSpec.navBarLayerIsVisible() + + /** + * Checks that the navbar is always in the right position and covers the expected region. + * + * NOTE: This doesn't check that the navbar is visible or not. + */ + @Postsubmit + @Test + fun navbarIsAlwaysInRightPosition() = + testSpec.navBarLayerRotatesAndScales(testSpec.config.startRotation) + + /** + * Checks that the status bar window is visible throughout the entire transition. + */ + @Postsubmit + @Test + fun statusBarWindowIsAlwaysVisible() = testSpec.statusBarWindowIsVisible() + + /** + * Checks that the status bar layer is visible throughout the entire transition. + */ + @Postsubmit + @Test + fun statusBarLayerIsAlwaysVisible() = testSpec.statusBarLayerIsVisible() + + companion object { + @Parameterized.Parameters(name = "{0}") + @JvmStatic + fun getParams(): Collection<FlickerTestParameter> { + return FlickerTestParameterFactory.getInstance() + .getConfigNonRotationTests( + repetitions = 5, + supportedNavigationModes = listOf( + WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY + ), + supportedRotations = listOf(Surface.ROTATION_0, Surface.ROTATION_90) + ) + } + } +}
\ No newline at end of file diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt new file mode 100644 index 000000000000..ca8f8af2df94 --- /dev/null +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/quickswitch/QuickSwitchFromLauncherTest.kt @@ -0,0 +1,347 @@ +/* + * 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.wm.flicker.quickswitch + +import android.app.Instrumentation +import android.platform.test.annotations.Presubmit +import android.platform.test.annotations.RequiresDevice +import android.view.Surface +import android.view.WindowManagerPolicyConstants +import androidx.test.platform.app.InstrumentationRegistry +import com.android.server.wm.flicker.FlickerBuilderProvider +import com.android.server.wm.flicker.FlickerParametersRunnerFactory +import com.android.server.wm.flicker.FlickerTestParameter +import com.android.server.wm.flicker.FlickerTestParameterFactory +import com.android.server.wm.flicker.LAUNCHER_COMPONENT +import com.android.server.wm.flicker.annotation.Group1 +import com.android.server.wm.flicker.dsl.FlickerBuilder +import com.android.server.wm.flicker.entireScreenCovered +import com.android.server.wm.flicker.helpers.SimpleAppHelper +import com.android.server.wm.flicker.helpers.WindowUtils +import com.android.server.wm.flicker.navBarLayerIsVisible +import com.android.server.wm.flicker.navBarLayerRotatesAndScales +import com.android.server.wm.flicker.navBarWindowIsVisible +import com.android.server.wm.flicker.startRotation +import com.android.server.wm.flicker.statusBarLayerIsVisible +import com.android.server.wm.flicker.statusBarWindowIsVisible +import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper.Companion.SNAPSHOT_COMPONENT +import org.junit.FixMethodOrder +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.MethodSorters +import org.junit.runners.Parameterized + +/** + * Test quick switching to last opened app from launcher + * + * To run this test: `atest FlickerTests:QuickSwitchFromLauncherTest` + * + * Actions: + * Launch an app + * Navigate home to show launcher + * Swipe right from the bottom of the screen to quick switch back to the app + * + */ +@RequiresDevice +@RunWith(Parameterized::class) +@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +@Group1 +class QuickSwitchFromLauncherTest(private val testSpec: FlickerTestParameter) { + private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation() + private val testApp = SimpleAppHelper(instrumentation) + private val startDisplayBounds = WindowUtils.getDisplayBounds(testSpec.config.startRotation) + + @FlickerBuilderProvider + fun buildFlicker(): FlickerBuilder { + return FlickerBuilder(instrumentation).apply { + setup { + eachRun { + testApp.launchViaIntent(wmHelper) + device.pressHome() + wmHelper.waitForHomeActivityVisible() + wmHelper.waitForWindowSurfaceDisappeared(testApp.component) + } + } + transitions { + // Swipe right from bottom to quick switch back + // NOTE: We don't perform an edge-to-edge swipe but instead only swipe in the middle + // as to not accidentally trigger a swipe back or forward action which would result + // in the same behavior but not testing quick swap. + device.swipe( + startDisplayBounds.bounds.right / 3, + startDisplayBounds.bounds.bottom, + 2 * startDisplayBounds.bounds.right / 3, + startDisplayBounds.bounds.bottom, + 50 + ) + + wmHelper.waitForFullScreenApp(testApp.component) + wmHelper.waitForAppTransitionIdle() + } + + teardown { + eachRun { + testApp.exit() + } + } + } + } + + /** + * Checks that [testApp] windows fill the entire screen (i.e. is "fullscreen") at the end of the + * transition once we have fully quick switched from the launcher back to the [testApp]. + */ + @Presubmit + @Test + fun endsWithAppWindowsCoveringFullScreen() { + testSpec.assertWmEnd { + this.frameRegion(testApp.component).coversExactly(startDisplayBounds) + } + } + + /** + * Checks that [testApp] layers fill the entire screen (i.e. is "fullscreen") at the end of the + * transition once we have fully quick switched from the launcher back to the [testApp]. + */ + @Presubmit + @Test + fun endsWithAppLayersCoveringFullScreen() { + testSpec.assertLayersEnd { + this.visibleRegion(testApp.component).coversExactly(startDisplayBounds) + } + } + + /** + * Checks that [testApp] is the top window at the end of the transition once we have fully quick + * switched from the launcher back to the [testApp]. + */ + @Presubmit + @Test + fun endsWithAppBeingOnTop() { + testSpec.assertWmEnd { + this.isAppWindowOnTop(testApp.component) + } + } + + /** + * Checks that the transition starts with the home activity being tagged as visible. + */ + @Presubmit + @Test + fun startsWithHomeActivityFlaggedVisible() { + testSpec.assertWmStart { + this.isHomeActivityVisible(true) + } + } + + /** + * Checks that the transition starts with the launcher windows filling/covering exactly the + * entirety of the display. + */ + @Presubmit + @Test + fun startsWithLauncherWindowsCoverFullScreen() { + testSpec.assertWmStart { + this.frameRegion(LAUNCHER_COMPONENT).coversExactly(startDisplayBounds) + } + } + + /** + * Checks that the transition starts with the launcher layers filling/covering exactly the + * entirety of the display. + */ + @Presubmit + @Test + fun startsWithLauncherLayersCoverFullScreen() { + testSpec.assertLayersStart { + this.visibleRegion(LAUNCHER_COMPONENT).coversExactly(startDisplayBounds) + } + } + + /** + * Checks that the transition starts with the launcher being the top window. + */ + @Presubmit + @Test + fun startsWithLauncherBeingOnTop() { + testSpec.assertWmStart { + this.isAppWindowOnTop(LAUNCHER_COMPONENT) + } + } + + /** + * Checks that the transition ends with the home activity being flagged as not visible. By this + * point we should have quick switched away from the launcher back to the [testApp]. + */ + @Presubmit + @Test + fun endsWithHomeActivityFlaggedInvisible() { + testSpec.assertWmEnd { + this.isHomeActivityVisible(false) + } + } + + /** + * Checks that [testApp]'s window starts off invisible and becomes visible at some point before + * the end of the transition and then stays visible until the end of the transition. + */ + @Presubmit + @Test + fun appWindowBecomesAndStaysVisible() { + testSpec.assertWm { + this.isAppWindowInvisible(testApp.component, ignoreActivity = true) + .then() + .isAppWindowVisible(testApp.component, ignoreActivity = true) + } + } + + /** + * Checks that [testApp]'s layer starts off invisible and becomes visible at some point before + * the end of the transition and then stays visible until the end of the transition. + */ + @Presubmit + @Test + fun appLayerBecomesAndStaysVisible() { + testSpec.assertLayers { + this.isInvisible(testApp.component) + .then() + .isVisible(testApp.component) + } + } + + /** + * Checks that the launcher window starts off visible and becomes invisible at some point before + * the end of the transition and then stays invisible until the end of the transition. + */ + @Presubmit + @Test + fun launcherWindowBecomesAndStaysInvisible() { + testSpec.assertWm { + this.isAppWindowVisible(LAUNCHER_COMPONENT) + .then() + .isAppWindowInvisible(LAUNCHER_COMPONENT) + } + } + + /** + * Checks that the launcher layer starts off visible and becomes invisible at some point before + * the end of the transition and then stays invisible until the end of the transition. + */ + @Presubmit + @Test + fun launcherLayerBecomesAndStaysInvisible() { + testSpec.assertLayers { + this.isVisible(LAUNCHER_COMPONENT) + .then() + .isInvisible(LAUNCHER_COMPONENT) + } + } + + /** + * Checks that the launcher window is visible at least until the app window is visible. Ensures + * that at any point, either the launcher or [testApp] windows are at least partially visible. + */ + @Presubmit + @Test + fun appWindowIsVisibleOnceLauncherWindowIsInvisible() { + testSpec.assertWm { + this.isAppWindowVisible(LAUNCHER_COMPONENT) + .then() + .isAppWindowVisible(SNAPSHOT_COMPONENT) + .then() + .isAppWindowVisible(testApp.component) + } + } + + /** + * Checks that the launcher layer is visible at least until the app layer is visible. Ensures + * that at any point, either the launcher or [testApp] layers are at least partially visible. + */ + @Presubmit + @Test + fun appLayerIsVisibleOnceLauncherLayerIsInvisible() { + testSpec.assertLayers { + this.isVisible(LAUNCHER_COMPONENT) + .then() + .isVisible(SNAPSHOT_COMPONENT) + .then() + .isVisible(testApp.component) + } + } + + /** + * Checks that the navbar window is visible throughout the entire transition. + */ + @Presubmit + @Test + fun navBarWindowIsAlwaysVisible() = testSpec.navBarWindowIsVisible() + + /** + * Checks that the navbar layer is visible throughout the entire transition. + */ + @Presubmit + @Test + fun navBarLayerAlwaysIsVisible() = testSpec.navBarLayerIsVisible() + + /** + * Checks that the navbar is always in the right position and covers the expected region. + * + * NOTE: This doesn't check that the navbar is visible or not. + */ + @Presubmit + @Test + fun navbarIsAlwaysInRightPosition() = + testSpec.navBarLayerRotatesAndScales(testSpec.config.startRotation) + + /** + * Checks that the status bar window is visible throughout the entire transition. + */ + @Presubmit + @Test + fun statusBarWindowIsAlwaysVisible() = testSpec.statusBarWindowIsVisible() + + /** + * Checks that the status bar layer is visible throughout the entire transition. + */ + @Presubmit + @Test + fun statusBarLayerIsAlwaysVisible() = testSpec.statusBarLayerIsVisible() + + /** + * Checks that the screen is always fully covered by visible layers throughout the transition. + */ + @Presubmit + @Test + fun screenIsAlwaysFilled() = testSpec.entireScreenCovered() + + companion object { + @Parameterized.Parameters(name = "{0}") + @JvmStatic + fun getParams(): Collection<FlickerTestParameter> { + return FlickerTestParameterFactory.getInstance() + .getConfigNonRotationTests( + repetitions = 5, + supportedNavigationModes = listOf( + WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY + ), + // TODO: Test with 90 rotation + supportedRotations = listOf(Surface.ROTATION_0) + ) + } + } +}
\ No newline at end of file diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt index 73986b6def8f..d57c6698e35c 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt @@ -16,7 +16,6 @@ package com.android.server.wm.flicker.rotation -import android.platform.test.annotations.Postsubmit import android.platform.test.annotations.Presubmit import androidx.test.filters.FlakyTest import androidx.test.filters.RequiresDevice @@ -85,7 +84,7 @@ class ChangeAppRotationTest( testSpec.statusBarWindowIsVisible() } - @Postsubmit + @Presubmit @Test fun statusBarLayerIsVisible() { testSpec.statusBarLayerIsVisible() @@ -98,30 +97,12 @@ class ChangeAppRotationTest( testSpec.config.startRotation, testSpec.config.endRotation) } - @Presubmit - @Test - override fun navBarWindowIsVisible() { - super.navBarWindowIsVisible() - } - - @Postsubmit - @Test - override fun navBarLayerIsVisible() { - super.navBarLayerIsVisible() - } - @FlakyTest @Test override fun navBarLayerRotatesAndScales() { super.navBarLayerRotatesAndScales() } - @Postsubmit - @Test - override fun visibleLayersShownMoreThanOneConsecutiveEntry() { - super.visibleLayersShownMoreThanOneConsecutiveEntry() - } - companion object { @Parameterized.Parameters(name = "{0}") @JvmStatic diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/RotationTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/RotationTransition.kt index 2b0b3c23a0b2..612ff9d3a153 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/RotationTransition.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/RotationTransition.kt @@ -25,7 +25,6 @@ import com.android.server.wm.flicker.FlickerTestParameter import com.android.server.wm.flicker.dsl.FlickerBuilder import com.android.server.wm.flicker.endRotation import com.android.server.wm.flicker.helpers.StandardAppHelper -import com.android.server.wm.flicker.helpers.WindowUtils import com.android.server.wm.flicker.helpers.setRotation import com.android.server.wm.flicker.navBarLayerIsVisible import com.android.server.wm.flicker.navBarLayerRotatesAndScales @@ -39,8 +38,6 @@ abstract class RotationTransition(protected val testSpec: FlickerTestParameter) protected abstract val testApp: StandardAppHelper protected val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation() - protected val startingPos get() = WindowUtils.getDisplayBounds(testSpec.config.startRotation) - protected val endingPos get() = WindowUtils.getDisplayBounds(testSpec.config.endRotation) protected open val transition: FlickerBuilder.(Map<String, Any?>) -> Unit = { setup { @@ -107,10 +104,7 @@ abstract class RotationTransition(protected val testSpec: FlickerTestParameter) @Presubmit @Test - open fun entireScreenCovered() { - testSpec.entireScreenCovered(testSpec.config.startRotation, - testSpec.config.endRotation, allStates = false) - } + open fun entireScreenCovered() = testSpec.entireScreenCovered() @Presubmit @Test @@ -124,7 +118,9 @@ abstract class RotationTransition(protected val testSpec: FlickerTestParameter) @Test open fun appLayerRotates_StartingPos() { testSpec.assertLayersStart { - this.visibleRegion(testApp.component).coversExactly(startingPos) + this.entry.displays.map { display -> + this.visibleRegion(testApp.component).coversExactly(display.layerStackSpace) + } } } @@ -132,7 +128,9 @@ abstract class RotationTransition(protected val testSpec: FlickerTestParameter) @Test open fun appLayerRotates_EndingPos() { testSpec.assertLayersEnd { - this.visibleRegion(testApp.component).coversExactly(endingPos) + this.entry.displays.map { display -> + this.visibleRegion(testApp.component).coversExactly(display.layerStackSpace) + } } } }
\ No newline at end of file diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt index b97b97768362..48efe73312c3 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt @@ -16,7 +16,6 @@ package com.android.server.wm.flicker.rotation -import android.platform.test.annotations.Postsubmit import android.platform.test.annotations.Presubmit import android.view.WindowManager import androidx.test.filters.FlakyTest @@ -99,13 +98,15 @@ class SeamlessAppRotationTest( } } - @Postsubmit + @Presubmit @Test fun appLayerRotates() { testSpec.assertLayers { - this.coversExactly(startingPos, testApp.component) - .then() - .coversExactly(endingPos, testApp.component) + this.invoke("entireScreenCovered") { entry -> + entry.entry.displays.map { display -> + entry.visibleRegion(testApp.component).coversExactly(display.layerStackSpace) + } + } } } @@ -125,24 +126,6 @@ class SeamlessAppRotationTest( } } - @Presubmit - @Test - override fun visibleLayersShownMoreThanOneConsecutiveEntry() { - super.visibleLayersShownMoreThanOneConsecutiveEntry() - } - - @Postsubmit - @Test - override fun navBarWindowIsVisible() { - super.navBarWindowIsVisible() - } - - @Postsubmit - @Test - override fun navBarLayerIsVisible() { - super.navBarLayerIsVisible() - } - @FlakyTest @Test override fun navBarLayerRotatesAndScales() = super.navBarLayerRotatesAndScales() diff --git a/tests/FlickerTests/test-apps/flickerapp/AndroidManifest.xml b/tests/FlickerTests/test-apps/flickerapp/AndroidManifest.xml index 1599ed4b280f..3b9f33aaded1 100644 --- a/tests/FlickerTests/test-apps/flickerapp/AndroidManifest.xml +++ b/tests/FlickerTests/test-apps/flickerapp/AndroidManifest.xml @@ -59,5 +59,26 @@ <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> + <activity android:name=".NonResizeableActivity" + android:resizeableActivity="false" + android:taskAffinity="com.android.server.wm.flicker.testapp.NonResizeableActivity" + android:label="NonResizeableApp" + android:exported="true" + android:showOnLockScreen="true"> + <intent-filter> + <action android:name="android.intent.action.MAIN"/> + <category android:name="android.intent.category.LAUNCHER"/> + </intent-filter> + </activity> + <activity android:name=".ButtonActivity" + android:taskAffinity="com.android.server.wm.flicker.testapp.ButtonActivity" + android:configChanges="orientation|screenSize" + android:label="ButtonActivity" + android:exported="true"> + <intent-filter> + <action android:name="android.intent.action.MAIN"/> + <category android:name="android.intent.category.LAUNCHER"/> + </intent-filter> + </activity> </application> </manifest> diff --git a/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_button.xml b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_button.xml new file mode 100644 index 000000000000..fe7bced690f9 --- /dev/null +++ b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_button.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright 2018 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@android:color/holo_orange_light"> + <Button + android:id="@+id/launch_second_activity" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Second activity" /> +</LinearLayout> diff --git a/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_non_resizeable.xml b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_non_resizeable.xml new file mode 100644 index 000000000000..6d5a9dd29248 --- /dev/null +++ b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_non_resizeable.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + 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. +--> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:background="@android:color/holo_orange_light"> + + <TextView + android:id="@+id/NonResizeableTest" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:gravity="center_vertical|center_horizontal" + android:text="NonResizeableActivity" + android:textAppearance="?android:attr/textAppearanceLarge"/> + +</LinearLayout>
\ No newline at end of file diff --git a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityOptions.java b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityOptions.java index 0ccc49897202..224d2ac38a11 100644 --- a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityOptions.java +++ b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityOptions.java @@ -41,4 +41,14 @@ public class ActivityOptions { public static final ComponentName SIMPLE_ACTIVITY_AUTO_FOCUS_COMPONENT_NAME = new ComponentName(FLICKER_APP_PACKAGE, FLICKER_APP_PACKAGE + ".SimpleActivity"); + + public static final String NON_RESIZEABLE_ACTIVITY_LAUNCHER_NAME = "NonResizeableApp"; + public static final ComponentName NON_RESIZEABLE_ACTIVITY_COMPONENT_NAME = + new ComponentName(FLICKER_APP_PACKAGE, + FLICKER_APP_PACKAGE + ".NonResizeableActivity"); + + public static final String BUTTON_ACTIVITY_LAUNCHER_NAME = "ButtonApp"; + public static final ComponentName BUTTON_ACTIVITY_COMPONENT_NAME = + new ComponentName(FLICKER_APP_PACKAGE, + FLICKER_APP_PACKAGE + ".ButtonActivity"); } diff --git a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ButtonActivity.java b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ButtonActivity.java new file mode 100644 index 000000000000..b42ac2a6fd97 --- /dev/null +++ b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ButtonActivity.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.wm.flicker.testapp; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.view.WindowManager; +import android.widget.Button; + +public class ButtonActivity extends Activity { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + WindowManager.LayoutParams p = getWindow().getAttributes(); + p.layoutInDisplayCutoutMode = WindowManager.LayoutParams + .LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; + getWindow().setAttributes(p); + setContentView(R.layout.activity_button); + + Button button = findViewById(R.id.launch_second_activity); + button.setOnClickListener(v -> { + Intent intent = new Intent(ButtonActivity.this, SimpleActivity.class); + startActivity(intent); + }); + } +} diff --git a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/NonResizeableActivity.java b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/NonResizeableActivity.java new file mode 100644 index 000000000000..61019d8b3716 --- /dev/null +++ b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/NonResizeableActivity.java @@ -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. + */ + +package com.android.server.wm.flicker.testapp; + +import android.app.Activity; +import android.app.KeyguardManager; +import android.os.Bundle; + +public class NonResizeableActivity extends Activity { + + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + setContentView(R.layout.activity_non_resizeable); + + setShowWhenLocked(true); + setTurnScreenOn(true); + KeyguardManager keyguardManager = getSystemService(KeyguardManager.class); + if (keyguardManager != null) { + keyguardManager.requestDismissKeyguard(this, null); + } + } +} |