Merge "Build tethering against the module SDK" into rvc-dev
diff --git a/Android.bp b/Android.bp
index ce2729d..14bd6d8 100644
--- a/Android.bp
+++ b/Android.bp
@@ -239,6 +239,7 @@
":framework-sax-sources",
":framework-telecomm-sources",
":framework-telephony-common-sources",
+ ":framework-telephony-sources",
":framework-wifi-annotations",
":framework-wifi-non-updatable-sources",
":PacProcessor-aidl-sources",
@@ -285,7 +286,6 @@
":framework-permission-sources",
":framework-sdkextensions-sources",
":framework-statsd-sources",
- ":framework-telephony-sources",
":framework-tethering-srcs",
":framework-wifi-updatable-sources",
":updatable-media-srcs",
@@ -300,7 +300,6 @@
"framework-permission-stubs-module_libs_api",
"framework-sdkextensions-stubs-module_libs_api",
"framework-statsd-stubs-module_libs_api",
- "framework-telephony-stubs", // TODO: Update to module_libs_api when there is one.
"framework-tethering-stubs-module_libs_api",
"framework-wifi-stubs-module_libs_api",
],
@@ -523,9 +522,8 @@
defaults: ["framework-aidl-export-defaults"],
installable: false, // this lib is a build-only library
static_libs: [
+ "app-compat-annotations",
"framework-minus-apex",
- // TODO (b/147688669) should be removed
- "framework-telephony",
"framework-updatable-stubs-module_libs_api",
],
sdk_version: "core_platform",
@@ -565,7 +563,6 @@
installable: false,
plugins: [
- "unsupportedappusage-annotation-processor",
"compat-changeid-annotation-processor",
],
static_libs: [
@@ -1327,8 +1324,8 @@
java_library {
name: "framework-telephony",
srcs: [
- ":framework-telephony-sources",
- ":framework-telephony-shared-srcs",
+ //":framework-telephony-sources",
+ //":framework-telephony-shared-srcs",
],
// TODO: change to framework-system-stub to build against system APIs.
libs: [
diff --git a/Android.mk b/Android.mk
index beb09b9..aea0c95 100644
--- a/Android.mk
+++ b/Android.mk
@@ -77,12 +77,6 @@
# Run this for checkbuild
checkbuild: doc-comment-check-docs
-# ==== hiddenapi lists =======================================
-ifneq ($(UNSAFE_DISABLE_HIDDENAPI_FLAGS),true)
-$(call dist-for-goals,droidcore,$(INTERNAL_PLATFORM_HIDDENAPI_FLAGS))
-$(call dist-for-goals,droidcore,$(INTERNAL_PLATFORM_HIDDENAPI_GREYLIST_METADATA))
-endif # UNSAFE_DISABLE_HIDDENAPI_FLAGS
-
# Include subdirectory makefiles
# ============================================================
diff --git a/apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java b/apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java
index c339351..cb87c6c 100644
--- a/apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java
+++ b/apex/blobstore/framework/java/android/app/blob/BlobStoreManager.java
@@ -25,6 +25,7 @@
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.content.Context;
+import android.os.LimitExceededException;
import android.os.ParcelFileDescriptor;
import android.os.ParcelableException;
import android.os.RemoteCallback;
@@ -167,6 +168,12 @@
* finalized (either committed or abandoned) within a reasonable period of
* time, typically about a week.
*
+ * <p> If an app is planning to acquire a lease on this data (using
+ * {@link #acquireLease(BlobHandle, int)} or one of it's other variants) after committing
+ * this data (using {@link Session#commit(Executor, Consumer)}), it is recommended that
+ * the app checks the remaining quota for acquiring a lease first using
+ * {@link #getRemainingLeaseQuotaBytes()} and can skip contributing this data if needed.
+ *
* @param blobHandle the {@link BlobHandle} identifier for which a new session
* needs to be created.
* @return positive, non-zero unique id that represents the created session.
@@ -294,8 +301,11 @@
* @throws IllegalArgumentException when {@code blobHandle} is invalid or
* if the {@code leaseExpiryTimeMillis} is greater than the
* {@link BlobHandle#getExpiryTimeMillis()}.
- * @throws IllegalStateException when a lease could not be acquired, such as when the
- * caller is trying to acquire too many leases.
+ * @throws LimitExceededException when a lease could not be acquired, such as when the
+ * caller is trying to acquire leases on too much data. Apps
+ * can avoid this by checking the remaining quota using
+ * {@link #getRemainingLeaseQuotaBytes()} before trying to
+ * acquire a lease.
*
* @see {@link #acquireLease(BlobHandle, int)}
* @see {@link #acquireLease(BlobHandle, CharSequence)}
@@ -307,6 +317,7 @@
mContext.getOpPackageName());
} catch (ParcelableException e) {
e.maybeRethrow(IOException.class);
+ e.maybeRethrow(LimitExceededException.class);
throw new RuntimeException(e);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -350,8 +361,11 @@
* @throws IllegalArgumentException when {@code blobHandle} is invalid or
* if the {@code leaseExpiryTimeMillis} is greater than the
* {@link BlobHandle#getExpiryTimeMillis()}.
- * @throws IllegalStateException when a lease could not be acquired, such as when the
- * caller is trying to acquire too many leases.
+ * @throws LimitExceededException when a lease could not be acquired, such as when the
+ * caller is trying to acquire leases on too much data. Apps
+ * can avoid this by checking the remaining quota using
+ * {@link #getRemainingLeaseQuotaBytes()} before trying to
+ * acquire a lease.
*
* @see {@link #acquireLease(BlobHandle, int, long)}
* @see {@link #acquireLease(BlobHandle, CharSequence)}
@@ -363,6 +377,7 @@
mContext.getOpPackageName());
} catch (ParcelableException e) {
e.maybeRethrow(IOException.class);
+ e.maybeRethrow(LimitExceededException.class);
throw new RuntimeException(e);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -399,8 +414,11 @@
* @throws SecurityException when the blob represented by the {@code blobHandle} does not
* exist or the caller does not have access to it.
* @throws IllegalArgumentException when {@code blobHandle} is invalid.
- * @throws IllegalStateException when a lease could not be acquired, such as when the
- * caller is trying to acquire too many leases.
+ * @throws LimitExceededException when a lease could not be acquired, such as when the
+ * caller is trying to acquire leases on too much data. Apps
+ * can avoid this by checking the remaining quota using
+ * {@link #getRemainingLeaseQuotaBytes()} before trying to
+ * acquire a lease.
*
* @see {@link #acquireLease(BlobHandle, int, long)}
* @see {@link #acquireLease(BlobHandle, CharSequence, long)}
@@ -443,8 +461,11 @@
* @throws SecurityException when the blob represented by the {@code blobHandle} does not
* exist or the caller does not have access to it.
* @throws IllegalArgumentException when {@code blobHandle} is invalid.
- * @throws IllegalStateException when a lease could not be acquired, such as when the
- * caller is trying to acquire too many leases.
+ * @throws LimitExceededException when a lease could not be acquired, such as when the
+ * caller is trying to acquire leases on too much data. Apps
+ * can avoid this by checking the remaining quota using
+ * {@link #getRemainingLeaseQuotaBytes()} before trying to
+ * acquire a lease.
*
* @see {@link #acquireLease(BlobHandle, int)}
* @see {@link #acquireLease(BlobHandle, CharSequence, long)}
@@ -478,6 +499,24 @@
}
/**
+ * Return the remaining quota size for acquiring a lease (in bytes) which indicates the
+ * remaining amount of data that an app can acquire a lease on before the System starts
+ * rejecting lease requests.
+ *
+ * If an app wants to acquire a lease on a blob but the remaining quota size is not sufficient,
+ * then it can try releasing leases on any older blobs which are not needed anymore.
+ *
+ * @return the remaining quota size for acquiring a lease.
+ */
+ public @IntRange(from = 0) long getRemainingLeaseQuotaBytes() {
+ try {
+ return mService.getRemainingLeaseQuotaBytes(mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Wait until any pending tasks (like persisting data to disk) have finished.
*
* @hide
diff --git a/apex/blobstore/framework/java/android/app/blob/IBlobStoreManager.aidl b/apex/blobstore/framework/java/android/app/blob/IBlobStoreManager.aidl
index 20c15ab..39a9fb4 100644
--- a/apex/blobstore/framework/java/android/app/blob/IBlobStoreManager.aidl
+++ b/apex/blobstore/framework/java/android/app/blob/IBlobStoreManager.aidl
@@ -31,6 +31,7 @@
void acquireLease(in BlobHandle handle, int descriptionResId, in CharSequence description,
long leaseTimeoutMillis, in String packageName);
void releaseLease(in BlobHandle handle, in String packageName);
+ long getRemainingLeaseQuotaBytes(String packageName);
void waitForIdle(in RemoteCallback callback);
diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
index 15c069f..65ccb99 100644
--- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
+++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
@@ -62,7 +62,9 @@
import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
+import android.os.LimitExceededException;
import android.os.ParcelFileDescriptor;
+import android.os.ParcelableException;
import android.os.Process;
import android.os.RemoteCallback;
import android.os.SystemClock;
@@ -394,9 +396,9 @@
throw new IllegalArgumentException(
"Lease expiry cannot be later than blobs expiry time");
}
- if (getTotalUsageBytesLocked(callingUid, callingPackage)
- + blobMetadata.getSize() > BlobStoreConfig.getAppDataBytesLimit()) {
- throw new IllegalStateException("Total amount of data with an active lease"
+ if (blobMetadata.getSize()
+ > getRemainingLeaseQuotaBytesInternal(callingUid, callingPackage)) {
+ throw new LimitExceededException("Total amount of data with an active lease"
+ " is exceeding the max limit");
}
blobMetadata.addLeasee(callingPackage, callingUid,
@@ -445,6 +447,14 @@
}
}
+ private long getRemainingLeaseQuotaBytesInternal(int callingUid, String callingPackage) {
+ synchronized (mBlobsLock) {
+ final long remainingQuota = BlobStoreConfig.getAppDataBytesLimit()
+ - getTotalUsageBytesLocked(callingUid, callingPackage);
+ return remainingQuota > 0 ? remainingQuota : 0;
+ }
+ }
+
private List<BlobInfo> queryBlobsForUserInternal(int userId) {
final ArrayList<BlobInfo> blobInfos = new ArrayList<>();
synchronized (mBlobsLock) {
@@ -1302,6 +1312,8 @@
leaseExpiryTimeMillis, callingUid, packageName);
} catch (Resources.NotFoundException e) {
throw new IllegalArgumentException(e);
+ } catch (LimitExceededException e) {
+ throw new ParcelableException(e);
}
}
@@ -1324,6 +1336,14 @@
}
@Override
+ public long getRemainingLeaseQuotaBytes(@NonNull String packageName) {
+ final int callingUid = Binder.getCallingUid();
+ verifyCallingPackage(callingUid, packageName);
+
+ return getRemainingLeaseQuotaBytesInternal(callingUid, packageName);
+ }
+
+ @Override
public void waitForIdle(@NonNull RemoteCallback remoteCallback) {
Objects.requireNonNull(remoteCallback, "remoteCallback must not be null");
diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
index e14ca99..b6f85b2 100644
--- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
+++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java
@@ -23,6 +23,8 @@
import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED;
import static android.app.usage.UsageStatsManager.REASON_MAIN_TIMEOUT;
import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE;
+import static android.app.usage.UsageStatsManager.REASON_SUB_DEFAULT_APP_UPDATE;
+import static android.app.usage.UsageStatsManager.REASON_SUB_FORCED_SYSTEM_FLAG_BUGGY;
import static android.app.usage.UsageStatsManager.REASON_SUB_MASK;
import static android.app.usage.UsageStatsManager.REASON_SUB_PREDICTED_RESTORED;
import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_ACTIVE_TIMEOUT;
@@ -73,7 +75,6 @@
import android.content.pm.ParceledListSlice;
import android.database.ContentObserver;
import android.hardware.display.DisplayManager;
-import android.net.ConnectivityManager;
import android.net.NetworkScoreManager;
import android.os.BatteryManager;
import android.os.BatteryStats;
@@ -304,10 +305,7 @@
private final AppStandbyHandler mHandler;
private final Context mContext;
- // TODO: Provide a mechanism to set an external bucketing service
-
private AppWidgetManager mAppWidgetManager;
- private ConnectivityManager mConnectivityManager;
private PackageManager mPackageManager;
Injector mInjector;
@@ -411,7 +409,6 @@
settingsObserver.updateSettings();
mAppWidgetManager = mContext.getSystemService(AppWidgetManager.class);
- mConnectivityManager = mContext.getSystemService(ConnectivityManager.class);
mInjector.registerDisplayListener(mDisplayListener, mHandler);
synchronized (mAppIdleLock) {
@@ -1519,6 +1516,38 @@
}
}
+ /**
+ * Remove an app from the {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_RESTRICTED}
+ * bucket if it was forced into the bucket by the system because it was buggy.
+ */
+ @VisibleForTesting
+ void maybeUnrestrictBuggyApp(String packageName, int userId) {
+ synchronized (mAppIdleLock) {
+ final long elapsedRealtime = mInjector.elapsedRealtime();
+ final AppIdleHistory.AppUsageHistory app =
+ mAppIdleHistory.getAppUsageHistory(packageName, userId, elapsedRealtime);
+ if (app.currentBucket != STANDBY_BUCKET_RESTRICTED
+ || (app.bucketingReason & REASON_MAIN_MASK) != REASON_MAIN_FORCED_BY_SYSTEM) {
+ return;
+ }
+
+ final int newBucket;
+ final int newReason;
+ if ((app.bucketingReason & REASON_SUB_MASK) == REASON_SUB_FORCED_SYSTEM_FLAG_BUGGY) {
+ // If bugginess was the only reason the app should be restricted, then lift it out.
+ newBucket = STANDBY_BUCKET_RARE;
+ newReason = REASON_MAIN_DEFAULT | REASON_SUB_DEFAULT_APP_UPDATE;
+ } else {
+ // There's another reason the app was restricted. Remove the buggy bit and call
+ // it a day.
+ newBucket = STANDBY_BUCKET_RESTRICTED;
+ newReason = app.bucketingReason & ~REASON_SUB_FORCED_SYSTEM_FLAG_BUGGY;
+ }
+ mAppIdleHistory.setAppStandbyBucket(
+ packageName, userId, elapsedRealtime, newBucket, newReason);
+ }
+ }
+
private class PackageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
@@ -1528,10 +1557,14 @@
clearCarrierPrivilegedApps();
}
if ((Intent.ACTION_PACKAGE_REMOVED.equals(action) ||
- Intent.ACTION_PACKAGE_ADDED.equals(action))
- && !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
- clearAppIdleForPackage(intent.getData().getSchemeSpecificPart(),
- getSendingUserId());
+ Intent.ACTION_PACKAGE_ADDED.equals(action))) {
+ final String pkgName = intent.getData().getSchemeSpecificPart();
+ final int userId = getSendingUserId();
+ if (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
+ maybeUnrestrictBuggyApp(pkgName, userId);
+ } else {
+ clearAppIdleForPackage(pkgName, userId);
+ }
}
}
}
diff --git a/apex/media/framework/TEST_MAPPING b/apex/media/framework/TEST_MAPPING
new file mode 100644
index 0000000..ec2d2e2
--- /dev/null
+++ b/apex/media/framework/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsMediaParserTestCases"
+ }
+ ]
+}
diff --git a/apex/media/framework/api/current.txt b/apex/media/framework/api/current.txt
index 2b7dcd33..839fb51 100644
--- a/apex/media/framework/api/current.txt
+++ b/apex/media/framework/api/current.txt
@@ -52,6 +52,20 @@
field public static final String PARAMETER_TS_IGNORE_AVC_STREAM = "android.media.mediaparser.ts.ignoreAvcStream";
field public static final String PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM = "android.media.mediaparser.ts.ignoreSpliceInfoStream";
field public static final String PARAMETER_TS_MODE = "android.media.mediaparser.ts.mode";
+ field public static final String PARSER_NAME_AC3 = "android.media.mediaparser.Ac3Parser";
+ field public static final String PARSER_NAME_AC4 = "android.media.mediaparser.Ac4Parser";
+ field public static final String PARSER_NAME_ADTS = "android.media.mediaparser.AdtsParser";
+ field public static final String PARSER_NAME_AMR = "android.media.mediaparser.AmrParser";
+ field public static final String PARSER_NAME_FLAC = "android.media.mediaparser.FlacParser";
+ field public static final String PARSER_NAME_FLV = "android.media.mediaparser.FlvParser";
+ field public static final String PARSER_NAME_FMP4 = "android.media.mediaparser.FragmentedMp4Parser";
+ field public static final String PARSER_NAME_MATROSKA = "android.media.mediaparser.MatroskaParser";
+ field public static final String PARSER_NAME_MP3 = "android.media.mediaparser.Mp3Parser";
+ field public static final String PARSER_NAME_MP4 = "android.media.mediaparser.Mp4Parser";
+ field public static final String PARSER_NAME_OGG = "android.media.mediaparser.OggParser";
+ field public static final String PARSER_NAME_PS = "android.media.mediaparser.PsParser";
+ field public static final String PARSER_NAME_TS = "android.media.mediaparser.TsParser";
+ field public static final String PARSER_NAME_WAV = "android.media.mediaparser.WavParser";
}
public static interface MediaParser.InputReader {
diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java
index bb3f4e9..02c55b7 100644
--- a/apex/media/framework/java/android/media/MediaParser.java
+++ b/apex/media/framework/java/android/media/MediaParser.java
@@ -18,6 +18,7 @@
import android.annotation.CheckResult;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.StringDef;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Pair;
@@ -56,6 +57,8 @@
import java.io.EOFException;
import java.io.IOException;
import java.io.InterruptedIOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.HashMap;
@@ -440,7 +443,71 @@
}
}
- // Public constants.
+ // Parser implementation names.
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @StringDef(
+ prefix = {"PARSER_NAME_"},
+ value = {
+ PARSER_NAME_MATROSKA,
+ PARSER_NAME_FMP4,
+ PARSER_NAME_MP4,
+ PARSER_NAME_MP3,
+ PARSER_NAME_ADTS,
+ PARSER_NAME_AC3,
+ PARSER_NAME_TS,
+ PARSER_NAME_FLV,
+ PARSER_NAME_OGG,
+ PARSER_NAME_PS,
+ PARSER_NAME_WAV,
+ PARSER_NAME_AMR,
+ PARSER_NAME_AC4,
+ PARSER_NAME_FLAC
+ })
+ public @interface ParserName {}
+
+ public static final String PARSER_NAME_MATROSKA = "android.media.mediaparser.MatroskaParser";
+ public static final String PARSER_NAME_FMP4 = "android.media.mediaparser.FragmentedMp4Parser";
+ public static final String PARSER_NAME_MP4 = "android.media.mediaparser.Mp4Parser";
+ public static final String PARSER_NAME_MP3 = "android.media.mediaparser.Mp3Parser";
+ public static final String PARSER_NAME_ADTS = "android.media.mediaparser.AdtsParser";
+ public static final String PARSER_NAME_AC3 = "android.media.mediaparser.Ac3Parser";
+ public static final String PARSER_NAME_TS = "android.media.mediaparser.TsParser";
+ public static final String PARSER_NAME_FLV = "android.media.mediaparser.FlvParser";
+ public static final String PARSER_NAME_OGG = "android.media.mediaparser.OggParser";
+ public static final String PARSER_NAME_PS = "android.media.mediaparser.PsParser";
+ public static final String PARSER_NAME_WAV = "android.media.mediaparser.WavParser";
+ public static final String PARSER_NAME_AMR = "android.media.mediaparser.AmrParser";
+ public static final String PARSER_NAME_AC4 = "android.media.mediaparser.Ac4Parser";
+ public static final String PARSER_NAME_FLAC = "android.media.mediaparser.FlacParser";
+
+ // MediaParser parameters.
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @StringDef(
+ prefix = {"PARAMETER_"},
+ value = {
+ PARAMETER_ADTS_ENABLE_CBR_SEEKING,
+ PARAMETER_AMR_ENABLE_CBR_SEEKING,
+ PARAMETER_FLAC_DISABLE_ID3,
+ PARAMETER_MP4_IGNORE_EDIT_LISTS,
+ PARAMETER_MP4_IGNORE_TFDT_BOX,
+ PARAMETER_MP4_TREAT_VIDEO_FRAMES_AS_KEYFRAMES,
+ PARAMETER_MATROSKA_DISABLE_CUES_SEEKING,
+ PARAMETER_MP3_DISABLE_ID3,
+ PARAMETER_MP3_ENABLE_CBR_SEEKING,
+ PARAMETER_MP3_ENABLE_INDEX_SEEKING,
+ PARAMETER_TS_MODE,
+ PARAMETER_TS_ALLOW_NON_IDR_AVC_KEYFRAMES,
+ PARAMETER_TS_IGNORE_AAC_STREAM,
+ PARAMETER_TS_IGNORE_AVC_STREAM,
+ PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM,
+ PARAMETER_TS_DETECT_ACCESS_UNITS,
+ PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS
+ })
+ public @interface ParameterName {}
/**
* Sets whether constant bitrate seeking should be enabled for ADTS parsing. {@code boolean}
@@ -589,7 +656,7 @@
*/
@NonNull
public static MediaParser createByName(
- @NonNull String name, @NonNull OutputConsumer outputConsumer) {
+ @NonNull @ParserName String name, @NonNull OutputConsumer outputConsumer) {
String[] nameAsArray = new String[] {name};
assertValidNames(nameAsArray);
return new MediaParser(outputConsumer, /* sniff= */ false, name);
@@ -607,7 +674,7 @@
*/
@NonNull
public static MediaParser create(
- @NonNull OutputConsumer outputConsumer, @NonNull String... parserNames) {
+ @NonNull OutputConsumer outputConsumer, @NonNull @ParserName String... parserNames) {
assertValidNames(parserNames);
if (parserNames.length == 0) {
parserNames = EXTRACTOR_FACTORIES_BY_NAME.keySet().toArray(new String[0]);
@@ -624,6 +691,7 @@
* <p>TODO: List which properties are taken into account. E.g. MimeType.
*/
@NonNull
+ @ParserName
public static List<String> getParserNames(@NonNull MediaFormat mediaFormat) {
throw new UnsupportedOperationException();
}
@@ -658,7 +726,8 @@
* @throws IllegalStateException If called after calling {@link #advance} on the same instance.
*/
@NonNull
- public MediaParser setParameter(@NonNull String parameterName, @NonNull Object value) {
+ public MediaParser setParameter(
+ @NonNull @ParameterName String parameterName, @NonNull Object value) {
if (mExtractor != null) {
throw new IllegalStateException(
"setParameters() must be called before the first advance() call.");
@@ -686,7 +755,7 @@
* constants.
* @return Whether the given {@code parameterName} is supported.
*/
- public boolean supportsParameter(@NonNull String parameterName) {
+ public boolean supportsParameter(@NonNull @ParameterName String parameterName) {
return EXPECTED_TYPE_BY_PARAMETER_NAME.containsKey(parameterName);
}
@@ -702,6 +771,7 @@
* implementation has not yet been selected.
*/
@Nullable
+ @ParserName
public String getParserName() {
return mExtractorName;
}
@@ -1165,20 +1235,20 @@
LinkedHashMap<String, ExtractorFactory> extractorFactoriesByName = new LinkedHashMap<>();
// Parsers are ordered to match ExoPlayer's DefaultExtractorsFactory extractor ordering,
// which in turn aims to minimize the chances of incorrect extractor selections.
- extractorFactoriesByName.put("exo.MatroskaParser", MatroskaExtractor::new);
- extractorFactoriesByName.put("exo.FragmentedMp4Parser", FragmentedMp4Extractor::new);
- extractorFactoriesByName.put("exo.Mp4Parser", Mp4Extractor::new);
- extractorFactoriesByName.put("exo.Mp3Parser", Mp3Extractor::new);
- extractorFactoriesByName.put("exo.AdtsParser", AdtsExtractor::new);
- extractorFactoriesByName.put("exo.Ac3Parser", Ac3Extractor::new);
- extractorFactoriesByName.put("exo.TsParser", TsExtractor::new);
- extractorFactoriesByName.put("exo.FlvParser", FlvExtractor::new);
- extractorFactoriesByName.put("exo.OggParser", OggExtractor::new);
- extractorFactoriesByName.put("exo.PsParser", PsExtractor::new);
- extractorFactoriesByName.put("exo.WavParser", WavExtractor::new);
- extractorFactoriesByName.put("exo.AmrParser", AmrExtractor::new);
- extractorFactoriesByName.put("exo.Ac4Parser", Ac4Extractor::new);
- extractorFactoriesByName.put("exo.FlacParser", FlacExtractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_MATROSKA, MatroskaExtractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_FMP4, FragmentedMp4Extractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_MP4, Mp4Extractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_MP3, Mp3Extractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_ADTS, AdtsExtractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_AC3, Ac3Extractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_TS, TsExtractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_FLV, FlvExtractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_OGG, OggExtractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_PS, PsExtractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_WAV, WavExtractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_AMR, AmrExtractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_AC4, Ac4Extractor::new);
+ extractorFactoriesByName.put(PARSER_NAME_FLAC, FlacExtractor::new);
EXTRACTOR_FACTORIES_BY_NAME = Collections.unmodifiableMap(extractorFactoriesByName);
HashMap<String, Class> expectedTypeByParameterName = new HashMap<>();
diff --git a/apex/statsd/aidl/android/os/IStatsd.aidl b/apex/statsd/aidl/android/os/IStatsd.aidl
index 445ae1d..d5b5949 100644
--- a/apex/statsd/aidl/android/os/IStatsd.aidl
+++ b/apex/statsd/aidl/android/os/IStatsd.aidl
@@ -196,7 +196,7 @@
*
* Enforces the REGISTER_STATS_PULL_ATOM permission.
*/
- oneway void registerNativePullAtomCallback(int atomTag, long coolDownNs, long timeoutNs,
+ oneway void registerNativePullAtomCallback(int atomTag, long coolDownMillis, long timeoutMillis,
in int[] additiveFields, IPullAtomCallback pullerCallback);
/**
diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
index c4f1531..aad5112 100644
--- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
+++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java
@@ -38,6 +38,7 @@
import android.os.IStatsd;
import android.os.Looper;
import android.os.ParcelFileDescriptor;
+import android.os.PowerManager;
import android.os.RemoteException;
import android.os.StatsFrameworkInitializer;
import android.os.SystemClock;
@@ -99,9 +100,9 @@
private static IStatsd sStatsd;
private static final Object sStatsdLock = new Object();
- private final OnAlarmListener mAnomalyAlarmListener = new AnomalyAlarmListener();
- private final OnAlarmListener mPullingAlarmListener = new PullingAlarmListener();
- private final OnAlarmListener mPeriodicAlarmListener = new PeriodicAlarmListener();
+ private final OnAlarmListener mAnomalyAlarmListener;
+ private final OnAlarmListener mPullingAlarmListener;
+ private final OnAlarmListener mPeriodicAlarmListener;
private StatsManagerService mStatsManagerService;
@@ -120,6 +121,9 @@
handlerThread.start();
mHandler = new CompanionHandler(handlerThread.getLooper());
+ mAnomalyAlarmListener = new AnomalyAlarmListener(context);
+ mPullingAlarmListener = new PullingAlarmListener(context);
+ mPeriodicAlarmListener = new PeriodicAlarmListener(context);
}
private final static int[] toIntArray(List<Integer> list) {
@@ -232,6 +236,31 @@
});
}
+ private static class WakelockThread extends Thread {
+ private final PowerManager.WakeLock mWl;
+ private final Runnable mRunnable;
+
+ WakelockThread(Context context, String wakelockName, Runnable runnable) {
+ PowerManager powerManager = (PowerManager)
+ context.getSystemService(Context.POWER_SERVICE);
+ mWl = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakelockName);
+ mRunnable = runnable;
+ }
+ @Override
+ public void run() {
+ try {
+ mRunnable.run();
+ } finally {
+ mWl.release();
+ }
+ }
+ @Override
+ public void start() {
+ mWl.acquire();
+ super.start();
+ }
+ }
+
private final static class AppUpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
@@ -307,6 +336,12 @@
}
public static final class AnomalyAlarmListener implements OnAlarmListener {
+ private final Context mContext;
+
+ AnomalyAlarmListener(Context context) {
+ mContext = context;
+ }
+
@Override
public void onAlarm() {
if (DEBUG) {
@@ -318,17 +353,30 @@
Log.w(TAG, "Could not access statsd to inform it of anomaly alarm firing");
return;
}
- try {
- // Two-way call to statsd to retain AlarmManager wakelock
- statsd.informAnomalyAlarmFired();
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to inform statsd of anomaly alarm firing", e);
- }
- // AlarmManager releases its own wakelock here.
+
+ // Wakelock needs to be retained while calling statsd.
+ Thread thread = new WakelockThread(mContext,
+ AnomalyAlarmListener.class.getCanonicalName(), new Runnable() {
+ @Override
+ public void run() {
+ try {
+ statsd.informAnomalyAlarmFired();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to inform statsd of anomaly alarm firing", e);
+ }
+ }
+ });
+ thread.start();
}
}
public final static class PullingAlarmListener implements OnAlarmListener {
+ private final Context mContext;
+
+ PullingAlarmListener(Context context) {
+ mContext = context;
+ }
+
@Override
public void onAlarm() {
if (DEBUG) {
@@ -339,16 +387,30 @@
Log.w(TAG, "Could not access statsd to inform it of pulling alarm firing.");
return;
}
- try {
- // Two-way call to statsd to retain AlarmManager wakelock
- statsd.informPollAlarmFired();
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to inform statsd of pulling alarm firing.", e);
- }
+
+ // Wakelock needs to be retained while calling statsd.
+ Thread thread = new WakelockThread(mContext,
+ PullingAlarmListener.class.getCanonicalName(), new Runnable() {
+ @Override
+ public void run() {
+ try {
+ statsd.informPollAlarmFired();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to inform statsd of pulling alarm firing.", e);
+ }
+ }
+ });
+ thread.start();
}
}
public final static class PeriodicAlarmListener implements OnAlarmListener {
+ private final Context mContext;
+
+ PeriodicAlarmListener(Context context) {
+ mContext = context;
+ }
+
@Override
public void onAlarm() {
if (DEBUG) {
@@ -359,13 +421,20 @@
Log.w(TAG, "Could not access statsd to inform it of periodic alarm firing.");
return;
}
- try {
- // Two-way call to statsd to retain AlarmManager wakelock
- statsd.informAlarmForSubscriberTriggeringFired();
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to inform statsd of periodic alarm firing.", e);
- }
- // AlarmManager releases its own wakelock here.
+
+ // Wakelock needs to be retained while calling statsd.
+ Thread thread = new WakelockThread(mContext,
+ PeriodicAlarmListener.class.getCanonicalName(), new Runnable() {
+ @Override
+ public void run() {
+ try {
+ statsd.informAlarmForSubscriberTriggeringFired();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to inform statsd of periodic alarm firing.", e);
+ }
+ }
+ });
+ thread.start();
}
}
diff --git a/apex/statsd/tests/libstatspull/jni/stats_pull_helper.cpp b/apex/statsd/tests/libstatspull/jni/stats_pull_helper.cpp
index 9e5aa95..166592d 100644
--- a/apex/statsd/tests/libstatspull/jni/stats_pull_helper.cpp
+++ b/apex/statsd/tests/libstatspull/jni/stats_pull_helper.cpp
@@ -44,30 +44,27 @@
return sPullReturnVal;
}
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_android_internal_os_statsd_libstats_LibStatsPullTests_registerStatsPuller(
- JNIEnv* /*env*/, jobject /* this */, jint atomTag, jlong timeoutNs, jlong coolDownNs,
- jint pullRetVal, jlong latencyMillis, int atomsPerPull)
-{
+extern "C" JNIEXPORT void JNICALL
+Java_com_android_internal_os_statsd_libstats_LibStatsPullTests_setStatsPuller(
+ JNIEnv* /*env*/, jobject /* this */, jint atomTag, jlong timeoutMillis,
+ jlong coolDownMillis, jint pullRetVal, jlong latencyMillis, int atomsPerPull) {
sAtomTag = atomTag;
sPullReturnVal = pullRetVal;
sLatencyMillis = latencyMillis;
sAtomsPerPull = atomsPerPull;
sNumPulls = 0;
AStatsManager_PullAtomMetadata* metadata = AStatsManager_PullAtomMetadata_obtain();
- AStatsManager_PullAtomMetadata_setCoolDownNs(metadata, coolDownNs);
- AStatsManager_PullAtomMetadata_setTimeoutNs(metadata, timeoutNs);
+ AStatsManager_PullAtomMetadata_setCoolDownMillis(metadata, coolDownMillis);
+ AStatsManager_PullAtomMetadata_setTimeoutMillis(metadata, timeoutMillis);
- AStatsManager_registerPullAtomCallback(sAtomTag, &pullAtomCallback, metadata, nullptr);
+ AStatsManager_setPullAtomCallback(sAtomTag, metadata, &pullAtomCallback, nullptr);
AStatsManager_PullAtomMetadata_release(metadata);
}
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_android_internal_os_statsd_libstats_LibStatsPullTests_unregisterStatsPuller(
- JNIEnv* /*env*/, jobject /* this */, jint /*atomTag*/)
-{
- AStatsManager_unregisterPullAtomCallback(sAtomTag);
+extern "C" JNIEXPORT void JNICALL
+Java_com_android_internal_os_statsd_libstats_LibStatsPullTests_clearStatsPuller(JNIEnv* /*env*/,
+ jobject /* this */,
+ jint /*atomTag*/) {
+ AStatsManager_clearPullAtomCallback(sAtomTag);
}
} // namespace
diff --git a/apex/statsd/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java b/apex/statsd/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java
index d4e51e0..3f199e8 100644
--- a/apex/statsd/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java
+++ b/apex/statsd/tests/libstatspull/src/com/android/internal/os/statsd/libstats/LibStatsPullTests.java
@@ -58,8 +58,8 @@
private static int sPullReturnValue;
private static long sConfigId;
private static long sPullLatencyMillis;
- private static long sPullTimeoutNs;
- private static long sCoolDownNs;
+ private static long sPullTimeoutMillis;
+ private static long sCoolDownMillis;
private static int sAtomsPerPull;
static {
@@ -75,8 +75,8 @@
assertThat(InstrumentationRegistry.getInstrumentation()).isNotNull();
sPullReturnValue = StatsManager.PULL_SUCCESS;
sPullLatencyMillis = 0;
- sPullTimeoutNs = 10_000_000_000L;
- sCoolDownNs = 1_000_000_000L;
+ sPullTimeoutMillis = 10_000L;
+ sCoolDownMillis = 1_000L;
sAtomsPerPull = 1;
}
@@ -85,7 +85,7 @@
*/
@After
public void tearDown() throws Exception {
- unregisterStatsPuller(PULL_ATOM_TAG);
+ clearStatsPuller(PULL_ATOM_TAG);
StatsManager statsManager = (StatsManager) mContext.getSystemService(
Context.STATS_MANAGER);
statsManager.removeConfig(sConfigId);
@@ -102,14 +102,14 @@
createAndAddConfigToStatsd(statsManager);
// Add the puller.
- registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+ setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
sPullLatencyMillis, sAtomsPerPull);
Thread.sleep(SHORT_SLEEP_MILLIS);
StatsLog.logStart(APP_BREADCRUMB_LABEL);
// Let the current bucket finish.
Thread.sleep(LONG_SLEEP_MILLIS);
List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
- unregisterStatsPuller(PULL_ATOM_TAG);
+ clearStatsPuller(PULL_ATOM_TAG);
assertThat(data.size()).isEqualTo(1);
TestAtoms.PullCallbackAtomWrapper atomWrapper = null;
try {
@@ -135,14 +135,14 @@
createAndAddConfigToStatsd(statsManager);
sPullReturnValue = StatsManager.PULL_SKIP;
// Add the puller.
- registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+ setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
sPullLatencyMillis, sAtomsPerPull);
Thread.sleep(SHORT_SLEEP_MILLIS);
StatsLog.logStart(APP_BREADCRUMB_LABEL);
// Let the current bucket finish.
Thread.sleep(LONG_SLEEP_MILLIS);
List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
- unregisterStatsPuller(PULL_ATOM_TAG);
+ clearStatsPuller(PULL_ATOM_TAG);
assertThat(data.size()).isEqualTo(0);
}
@@ -157,17 +157,17 @@
// The puller will sleep for 1.5 sec.
sPullLatencyMillis = 1_500;
// 1 second timeout
- sPullTimeoutNs = 1_000_000_000;
+ sPullTimeoutMillis = 1_000;
// Add the puller.
- registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+ setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
sPullLatencyMillis, sAtomsPerPull);
Thread.sleep(SHORT_SLEEP_MILLIS);
StatsLog.logStart(APP_BREADCRUMB_LABEL);
// Let the current bucket finish and the pull timeout.
Thread.sleep(sPullLatencyMillis * 2);
List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
- unregisterStatsPuller(PULL_ATOM_TAG);
+ clearStatsPuller(PULL_ATOM_TAG);
assertThat(data.size()).isEqualTo(0);
}
@@ -181,9 +181,9 @@
createAndAddConfigToStatsd(statsManager);
// Set the cooldown to 10 seconds
- sCoolDownNs = 10_000_000_000L;
+ sCoolDownMillis = 10_000L;
// Add the puller.
- registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+ setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
sPullLatencyMillis, sAtomsPerPull);
Thread.sleep(SHORT_SLEEP_MILLIS);
@@ -192,7 +192,7 @@
StatsLog.logStart(APP_BREADCRUMB_LABEL);
Thread.sleep(LONG_SLEEP_MILLIS);
List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
- unregisterStatsPuller(PULL_ATOM_TAG);
+ clearStatsPuller(PULL_ATOM_TAG);
assertThat(data.size()).isEqualTo(2);
for (int i = 0; i < data.size(); i++) {
TestAtoms.PullCallbackAtomWrapper atomWrapper = null;
@@ -221,7 +221,7 @@
createAndAddConfigToStatsd(statsManager);
sAtomsPerPull = 1000;
// Add the puller.
- registerStatsPuller(PULL_ATOM_TAG, sPullTimeoutNs, sCoolDownNs, sPullReturnValue,
+ setStatsPuller(PULL_ATOM_TAG, sPullTimeoutMillis, sCoolDownMillis, sPullReturnValue,
sPullLatencyMillis, sAtomsPerPull);
Thread.sleep(SHORT_SLEEP_MILLIS);
@@ -229,7 +229,7 @@
// Let the current bucket finish.
Thread.sleep(LONG_SLEEP_MILLIS);
List<Atom> data = StatsConfigUtils.getGaugeMetricDataList(statsManager, sConfigId);
- unregisterStatsPuller(PULL_ATOM_TAG);
+ clearStatsPuller(PULL_ATOM_TAG);
assertThat(data.size()).isEqualTo(sAtomsPerPull);
for (int i = 0; i < data.size(); i++) {
@@ -276,9 +276,9 @@
assertThat(StatsConfigUtils.verifyValidConfigExists(statsManager, sConfigId)).isTrue();
}
- private native void registerStatsPuller(int atomTag, long timeoutNs, long coolDownNs,
+ private native void setStatsPuller(int atomTag, long timeoutMillis, long coolDownMillis,
int pullReturnVal, long latencyMillis, int atomPerPull);
- private native void unregisterStatsPuller(int atomTag);
+ private native void clearStatsPuller(int atomTag);
}
diff --git a/api/current.txt b/api/current.txt
index 04b8e4e..eb8ee3c 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -278,6 +278,7 @@
field public static final int activityCloseExitAnimation = 16842939; // 0x10100bb
field public static final int activityOpenEnterAnimation = 16842936; // 0x10100b8
field public static final int activityOpenExitAnimation = 16842937; // 0x10100b9
+ field public static final int actor = 16844313; // 0x1010619
field public static final int addPrintersActivity = 16843750; // 0x10103e6
field public static final int addStatesFromChildren = 16842992; // 0x10100f0
field public static final int adjustViewBounds = 16843038; // 0x101011e
@@ -5668,13 +5669,13 @@
public static final class Notification.BubbleMetadata implements android.os.Parcelable {
method public int describeContents();
method public boolean getAutoExpandBubble();
- method @Nullable public android.graphics.drawable.Icon getBubbleIcon();
- method @Nullable public android.app.PendingIntent getBubbleIntent();
+ method @Deprecated @Nullable public android.graphics.drawable.Icon getBubbleIcon();
+ method @Deprecated @Nullable public android.app.PendingIntent getBubbleIntent();
method @Nullable public android.app.PendingIntent getDeleteIntent();
method @Dimension(unit=android.annotation.Dimension.DP) public int getDesiredHeight();
method @DimenRes public int getDesiredHeightResId();
- method @Deprecated @NonNull public android.graphics.drawable.Icon getIcon();
- method @Deprecated @NonNull public android.app.PendingIntent getIntent();
+ method @Nullable public android.graphics.drawable.Icon getIcon();
+ method @Nullable public android.app.PendingIntent getIntent();
method @Nullable public String getShortcutId();
method public boolean isNotificationSuppressed();
method public void writeToParcel(android.os.Parcel, int);
@@ -5682,16 +5683,18 @@
}
public static final class Notification.BubbleMetadata.Builder {
- ctor public Notification.BubbleMetadata.Builder();
+ ctor @Deprecated public Notification.BubbleMetadata.Builder();
+ ctor public Notification.BubbleMetadata.Builder(@NonNull String);
+ ctor public Notification.BubbleMetadata.Builder(@NonNull android.app.PendingIntent, @NonNull android.graphics.drawable.Icon);
method @NonNull public android.app.Notification.BubbleMetadata build();
- method @NonNull public android.app.Notification.BubbleMetadata.Builder createIntentBubble(@NonNull android.app.PendingIntent, @NonNull android.graphics.drawable.Icon);
- method @NonNull public android.app.Notification.BubbleMetadata.Builder createShortcutBubble(@NonNull String);
+ method @Deprecated @NonNull public android.app.Notification.BubbleMetadata.Builder createIntentBubble(@NonNull android.app.PendingIntent, @NonNull android.graphics.drawable.Icon);
+ method @Deprecated @NonNull public android.app.Notification.BubbleMetadata.Builder createShortcutBubble(@NonNull String);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setAutoExpandBubble(boolean);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setDeleteIntent(@Nullable android.app.PendingIntent);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=android.annotation.Dimension.DP) int);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
- method @Deprecated @NonNull public android.app.Notification.BubbleMetadata.Builder setIcon(@NonNull android.graphics.drawable.Icon);
- method @Deprecated @NonNull public android.app.Notification.BubbleMetadata.Builder setIntent(@NonNull android.app.PendingIntent);
+ method @NonNull public android.app.Notification.BubbleMetadata.Builder setIcon(@NonNull android.graphics.drawable.Icon);
+ method @NonNull public android.app.Notification.BubbleMetadata.Builder setIntent(@NonNull android.app.PendingIntent);
method @NonNull public android.app.Notification.BubbleMetadata.Builder setSuppressNotification(boolean);
}
@@ -6841,7 +6844,7 @@
ctor public DevicePolicyKeyguardService();
method @Nullable public void dismiss();
method @Nullable public final android.os.IBinder onBind(@Nullable android.content.Intent);
- method @Nullable public android.view.SurfaceControlViewHost.SurfacePackage onSurfaceReady(@Nullable android.os.IBinder);
+ method @Nullable public android.view.SurfaceControlViewHost.SurfacePackage onCreateKeyguardSurface(@NonNull android.os.IBinder);
}
public class DevicePolicyManager {
@@ -7602,6 +7605,7 @@
method public void acquireLease(@NonNull android.app.blob.BlobHandle, @IdRes int) throws java.io.IOException;
method public void acquireLease(@NonNull android.app.blob.BlobHandle, @NonNull CharSequence) throws java.io.IOException;
method @IntRange(from=1) public long createSession(@NonNull android.app.blob.BlobHandle) throws java.io.IOException;
+ method @IntRange(from=0) public long getRemainingLeaseQuotaBytes();
method @NonNull public android.os.ParcelFileDescriptor openBlob(@NonNull android.app.blob.BlobHandle) throws java.io.IOException;
method @NonNull public android.app.blob.BlobStoreManager.Session openSession(@IntRange(from=1) long) throws java.io.IOException;
method public void releaseLease(@NonNull android.app.blob.BlobHandle) throws java.io.IOException;
@@ -11968,7 +11972,6 @@
method @CheckResult public abstract int checkSignatures(@NonNull String, @NonNull String);
method @CheckResult public abstract int checkSignatures(int, int);
method public abstract void clearInstantAppCookie();
- method public void clearMimeGroup(@NonNull String);
method @Deprecated public abstract void clearPackagePreferredActivities(@NonNull String);
method public abstract String[] currentToCanonicalPackageNames(@NonNull String[]);
method public abstract void extendVerificationTimeout(int, int, long);
@@ -12004,7 +12007,7 @@
method @NonNull public abstract android.content.pm.InstrumentationInfo getInstrumentationInfo(@NonNull android.content.ComponentName, int) throws android.content.pm.PackageManager.NameNotFoundException;
method @Nullable public abstract android.content.Intent getLaunchIntentForPackage(@NonNull String);
method @Nullable public abstract android.content.Intent getLeanbackLaunchIntentForPackage(@NonNull String);
- method @Nullable public java.util.Set<java.lang.String> getMimeGroup(@NonNull String);
+ method @NonNull public java.util.Set<java.lang.String> getMimeGroup(@NonNull String);
method @NonNull public android.content.pm.ModuleInfo getModuleInfo(@NonNull String, int) throws android.content.pm.PackageManager.NameNotFoundException;
method @Nullable public abstract String getNameForUid(int);
method @Nullable public android.content.pm.PackageInfo getPackageArchiveInfo(@NonNull String, int);
@@ -12870,14 +12873,7 @@
package android.content.res.loader {
public interface AssetsProvider {
- method @Nullable public default java.io.InputStream loadAsset(@NonNull String, int) throws java.io.IOException;
- method @Nullable public default android.os.ParcelFileDescriptor loadAssetParcelFd(@NonNull String) throws java.io.IOException;
- }
-
- public class DirectoryAssetsProvider implements android.content.res.loader.AssetsProvider {
- ctor public DirectoryAssetsProvider(@NonNull java.io.File);
- method @Nullable public java.io.File findFile(@NonNull String);
- method @NonNull public java.io.File getDirectory();
+ method @Nullable public default android.content.res.AssetFileDescriptor loadAssetFd(@NonNull String, int);
}
public class ResourcesLoader {
@@ -12892,14 +12888,11 @@
public class ResourcesProvider implements java.lang.AutoCloseable java.io.Closeable {
method public void close();
method @NonNull public static android.content.res.loader.ResourcesProvider empty(@NonNull android.content.res.loader.AssetsProvider);
- method @Nullable public android.content.res.loader.AssetsProvider getAssetsProvider();
method @NonNull public static android.content.res.loader.ResourcesProvider loadFromApk(@NonNull android.os.ParcelFileDescriptor) throws java.io.IOException;
method @NonNull public static android.content.res.loader.ResourcesProvider loadFromApk(@NonNull android.os.ParcelFileDescriptor, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException;
- method @NonNull public static android.content.res.loader.ResourcesProvider loadFromApk(@NonNull android.os.SharedMemory) throws java.io.IOException;
- method @NonNull public static android.content.res.loader.ResourcesProvider loadFromApk(@NonNull android.os.SharedMemory, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException;
+ method @NonNull public static android.content.res.loader.ResourcesProvider loadFromDirectory(@NonNull String, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException;
method @NonNull public static android.content.res.loader.ResourcesProvider loadFromSplit(@NonNull android.content.Context, @NonNull String) throws java.io.IOException;
method @NonNull public static android.content.res.loader.ResourcesProvider loadFromTable(@NonNull android.os.ParcelFileDescriptor, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException;
- method @NonNull public static android.content.res.loader.ResourcesProvider loadFromTable(@NonNull android.os.SharedMemory, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException;
}
}
@@ -17238,8 +17231,8 @@
field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.util.Rational> CONTROL_AE_COMPENSATION_STEP;
field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<java.lang.Boolean> CONTROL_AE_LOCK_AVAILABLE;
field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AF_AVAILABLE_MODES;
- field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.Capability[]> CONTROL_AVAILABLE_BOKEH_CAPABILITIES;
field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_EFFECTS;
+ field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<android.hardware.camera2.params.Capability[]> CONTROL_AVAILABLE_EXTENDED_SCENE_MODE_CAPABILITIES;
field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_MODES;
field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_SCENE_MODES;
field @NonNull public static final android.hardware.camera2.CameraCharacteristics.Key<int[]> CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES;
@@ -17460,9 +17453,6 @@
field public static final int CONTROL_AWB_STATE_INACTIVE = 0; // 0x0
field public static final int CONTROL_AWB_STATE_LOCKED = 3; // 0x3
field public static final int CONTROL_AWB_STATE_SEARCHING = 1; // 0x1
- field public static final int CONTROL_BOKEH_MODE_CONTINUOUS = 2; // 0x2
- field public static final int CONTROL_BOKEH_MODE_OFF = 0; // 0x0
- field public static final int CONTROL_BOKEH_MODE_STILL_CAPTURE = 1; // 0x1
field public static final int CONTROL_CAPTURE_INTENT_CUSTOM = 0; // 0x0
field public static final int CONTROL_CAPTURE_INTENT_MANUAL = 6; // 0x6
field public static final int CONTROL_CAPTURE_INTENT_MOTION_TRACKING = 7; // 0x7
@@ -17480,9 +17470,13 @@
field public static final int CONTROL_EFFECT_MODE_SEPIA = 4; // 0x4
field public static final int CONTROL_EFFECT_MODE_SOLARIZE = 3; // 0x3
field public static final int CONTROL_EFFECT_MODE_WHITEBOARD = 6; // 0x6
+ field public static final int CONTROL_EXTENDED_SCENE_MODE_BOKEH_CONTINUOUS = 2; // 0x2
+ field public static final int CONTROL_EXTENDED_SCENE_MODE_BOKEH_STILL_CAPTURE = 1; // 0x1
+ field public static final int CONTROL_EXTENDED_SCENE_MODE_DISABLED = 0; // 0x0
field public static final int CONTROL_MODE_AUTO = 1; // 0x1
field public static final int CONTROL_MODE_OFF = 0; // 0x0
field public static final int CONTROL_MODE_OFF_KEEP_STATE = 3; // 0x3
+ field public static final int CONTROL_MODE_USE_EXTENDED_SCENE_MODE = 4; // 0x4
field public static final int CONTROL_MODE_USE_SCENE_MODE = 2; // 0x2
field public static final int CONTROL_SCENE_MODE_ACTION = 2; // 0x2
field public static final int CONTROL_SCENE_MODE_BARCODE = 16; // 0x10
@@ -17674,10 +17668,10 @@
field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_AWB_LOCK;
field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_AWB_MODE;
field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS;
- field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_BOKEH_MODE;
field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_CAPTURE_INTENT;
field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_EFFECT_MODE;
field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Boolean> CONTROL_ENABLE_ZSL;
+ field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_EXTENDED_SCENE_MODE;
field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_MODE;
field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST;
field @NonNull public static final android.hardware.camera2.CaptureRequest.Key<java.lang.Integer> CONTROL_SCENE_MODE;
@@ -17761,10 +17755,10 @@
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AWB_MODE;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.MeteringRectangle[]> CONTROL_AWB_REGIONS;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_AWB_STATE;
- field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_BOKEH_MODE;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_CAPTURE_INTENT;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_EFFECT_MODE;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> CONTROL_ENABLE_ZSL;
+ field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_EXTENDED_SCENE_MODE;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_MODE;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_POST_RAW_SENSITIVITY_BOOST;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> CONTROL_SCENE_MODE;
@@ -24663,7 +24657,6 @@
field public static final int ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR = 2; // 0x2
field public static final int ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER = 1; // 0x1
field public static final int ENCAPSULATION_MODE_ELEMENTARY_STREAM = 1; // 0x1
- field public static final int ENCAPSULATION_MODE_HANDLE = 2; // 0x2
field public static final int ENCAPSULATION_MODE_NONE = 0; // 0x0
field public static final int ERROR = -1; // 0xffffffff
field public static final int ERROR_BAD_VALUE = -2; // 0xfffffffe
@@ -24696,7 +24689,6 @@
method @NonNull public android.media.AudioTrack.Builder setPerformanceMode(int);
method @NonNull public android.media.AudioTrack.Builder setSessionId(@IntRange(from=1) int) throws java.lang.IllegalArgumentException;
method @NonNull public android.media.AudioTrack.Builder setTransferMode(int) throws java.lang.IllegalArgumentException;
- method @NonNull public android.media.AudioTrack.Builder setTunerConfiguration(@NonNull android.media.AudioTrack.TunerConfiguration);
}
public static final class AudioTrack.MetricsConstants {
@@ -24728,18 +24720,6 @@
method public void onTearDown(@NonNull android.media.AudioTrack);
}
- public static class AudioTrack.TunerConfiguration {
- method public int getContentId();
- method public int getSyncId();
- }
-
- public static class AudioTrack.TunerConfiguration.Builder {
- ctor public AudioTrack.TunerConfiguration.Builder();
- method @NonNull public android.media.AudioTrack.TunerConfiguration build();
- method @NonNull public android.media.AudioTrack.TunerConfiguration.Builder setContentId(@IntRange(from=1) int);
- method @NonNull public android.media.AudioTrack.TunerConfiguration.Builder setSyncId(@IntRange(from=1) int);
- }
-
public class CamcorderProfile {
method public static android.media.CamcorderProfile get(int);
method public static android.media.CamcorderProfile get(int, int);
@@ -26443,6 +26423,20 @@
field public static final String PARAMETER_TS_IGNORE_AVC_STREAM = "android.media.mediaparser.ts.ignoreAvcStream";
field public static final String PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM = "android.media.mediaparser.ts.ignoreSpliceInfoStream";
field public static final String PARAMETER_TS_MODE = "android.media.mediaparser.ts.mode";
+ field public static final String PARSER_NAME_AC3 = "android.media.mediaparser.Ac3Parser";
+ field public static final String PARSER_NAME_AC4 = "android.media.mediaparser.Ac4Parser";
+ field public static final String PARSER_NAME_ADTS = "android.media.mediaparser.AdtsParser";
+ field public static final String PARSER_NAME_AMR = "android.media.mediaparser.AmrParser";
+ field public static final String PARSER_NAME_FLAC = "android.media.mediaparser.FlacParser";
+ field public static final String PARSER_NAME_FLV = "android.media.mediaparser.FlvParser";
+ field public static final String PARSER_NAME_FMP4 = "android.media.mediaparser.FragmentedMp4Parser";
+ field public static final String PARSER_NAME_MATROSKA = "android.media.mediaparser.MatroskaParser";
+ field public static final String PARSER_NAME_MP3 = "android.media.mediaparser.Mp3Parser";
+ field public static final String PARSER_NAME_MP4 = "android.media.mediaparser.Mp4Parser";
+ field public static final String PARSER_NAME_OGG = "android.media.mediaparser.OggParser";
+ field public static final String PARSER_NAME_PS = "android.media.mediaparser.PsParser";
+ field public static final String PARSER_NAME_TS = "android.media.mediaparser.TsParser";
+ field public static final String PARSER_NAME_WAV = "android.media.mediaparser.WavParser";
}
public static interface MediaParser.InputReader {
@@ -26878,9 +26872,11 @@
field public static final int CONNECTION_STATE_CONNECTING = 1; // 0x1
field public static final int CONNECTION_STATE_DISCONNECTED = 0; // 0x0
field @NonNull public static final android.os.Parcelable.Creator<android.media.MediaRoute2Info> CREATOR;
- field public static final String FEATURE_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
- field public static final String FEATURE_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
- field public static final String FEATURE_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
+ field public static final String FEATURE_LIVE_AUDIO = "android.media.route.feature.LIVE_AUDIO";
+ field public static final String FEATURE_LIVE_VIDEO = "android.media.route.feature.LIVE_VIDEO";
+ field public static final String FEATURE_REMOTE_AUDIO_PLAYBACK = "android.media.route.feature.REMOTE_AUDIO_PLAYBACK";
+ field public static final String FEATURE_REMOTE_PLAYBACK = "android.media.route.feature.REMOTE_PLAYBACK";
+ field public static final String FEATURE_REMOTE_VIDEO_PLAYBACK = "android.media.route.feature.REMOTE_VIDEO_PLAYBACK";
field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
}
@@ -27102,9 +27098,9 @@
public abstract static class MediaRouter2.TransferCallback {
ctor public MediaRouter2.TransferCallback();
- method public void onStopped(@NonNull android.media.MediaRouter2.RoutingController);
- method public void onTransferFailed(@NonNull android.media.MediaRoute2Info);
- method public void onTransferred(@NonNull android.media.MediaRouter2.RoutingController, @NonNull android.media.MediaRouter2.RoutingController);
+ method public void onStop(@NonNull android.media.MediaRouter2.RoutingController);
+ method public void onTransfer(@NonNull android.media.MediaRouter2.RoutingController, @NonNull android.media.MediaRouter2.RoutingController);
+ method public void onTransferFailure(@NonNull android.media.MediaRoute2Info);
}
public class MediaScannerConnection implements android.content.ServiceConnection {
@@ -31104,7 +31100,7 @@
field public static final int EASY_CONNECT_EVENT_FAILURE_TIMEOUT = -6; // 0xfffffffa
}
- public class ScanResult implements android.os.Parcelable {
+ public final class ScanResult implements android.os.Parcelable {
ctor public ScanResult(@NonNull android.net.wifi.ScanResult);
ctor public ScanResult();
method public int describeContents();
@@ -36322,6 +36318,11 @@
method public android.os.IBinder asBinder();
}
+ public class LimitExceededException extends java.lang.IllegalStateException {
+ ctor public LimitExceededException();
+ ctor public LimitExceededException(@NonNull String);
+ }
+
public final class LocaleList implements android.os.Parcelable {
ctor public LocaleList(@NonNull java.util.Locale...);
method public int describeContents();
@@ -47005,7 +47006,6 @@
method public abstract int getAsuLevel();
method public abstract int getDbm();
method @IntRange(from=android.telephony.CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, to=android.telephony.CellSignalStrength.SIGNAL_STRENGTH_GREAT) public abstract int getLevel();
- method public static final int getNumSignalStrengthLevels();
method public abstract int hashCode();
field public static final int SIGNAL_STRENGTH_GOOD = 3; // 0x3
field public static final int SIGNAL_STRENGTH_GREAT = 4; // 0x4
@@ -47586,12 +47586,6 @@
field public static final int SCAN_TYPE_PERIODIC = 1; // 0x1
}
- public final class PhoneCapability implements android.os.Parcelable {
- method public int describeContents();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PhoneCapability> CREATOR;
- }
-
public class PhoneNumberFormattingTextWatcher implements android.text.TextWatcher {
ctor public PhoneNumberFormattingTextWatcher();
ctor public PhoneNumberFormattingTextWatcher(String);
@@ -47796,7 +47790,7 @@
method @Deprecated public void sendMultimediaMessage(android.content.Context, android.net.Uri, String, android.os.Bundle, android.app.PendingIntent);
method public void sendMultipartTextMessage(String, String, java.util.ArrayList<java.lang.String>, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>);
method public void sendMultipartTextMessage(@NonNull String, @Nullable String, @NonNull java.util.List<java.lang.String>, @Nullable java.util.List<android.app.PendingIntent>, @Nullable java.util.List<android.app.PendingIntent>, long);
- method public void sendMultipartTextMessage(@NonNull String, @Nullable String, @NonNull java.util.List<java.lang.String>, @Nullable java.util.List<android.app.PendingIntent>, @Nullable java.util.List<android.app.PendingIntent>, @NonNull String);
+ method public void sendMultipartTextMessage(@NonNull String, @Nullable String, @NonNull java.util.List<java.lang.String>, @Nullable java.util.List<android.app.PendingIntent>, @Nullable java.util.List<android.app.PendingIntent>, @NonNull String, @Nullable String);
method public void sendTextMessage(String, String, String, android.app.PendingIntent, android.app.PendingIntent);
method public void sendTextMessage(@NonNull String, @Nullable String, @NonNull String, @Nullable android.app.PendingIntent, @Nullable android.app.PendingIntent, long);
method @RequiresPermission(allOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.SEND_SMS}) public void sendTextMessageWithoutPersisting(String, String, String, android.app.PendingIntent, android.app.PendingIntent);
@@ -47932,7 +47926,6 @@
method public byte[] getPdu();
method public int getProtocolIdentifier();
method public String getPseudoSubject();
- method @Nullable public String getRecipientAddress();
method public String getServiceCenterAddress();
method public int getStatus();
method public int getStatusOnIcc();
@@ -48088,6 +48081,7 @@
method public android.telephony.SubscriptionPlan build();
method public static android.telephony.SubscriptionPlan.Builder createNonrecurring(java.time.ZonedDateTime, java.time.ZonedDateTime);
method public static android.telephony.SubscriptionPlan.Builder createRecurring(java.time.ZonedDateTime, java.time.Period);
+ method @NonNull public android.telephony.SubscriptionPlan.Builder resetNetworkTypes();
method public android.telephony.SubscriptionPlan.Builder setDataLimit(long, int);
method public android.telephony.SubscriptionPlan.Builder setDataUsage(long, long);
method @NonNull public android.telephony.SubscriptionPlan.Builder setNetworkTypes(@NonNull int[]);
@@ -48115,7 +48109,6 @@
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean doesSwitchMultiSimConfigTriggerReboot();
method public int getActiveModemCount();
method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public java.util.List<android.telephony.CellInfo> getAllCellInfo();
- method @NonNull public static int[] getAllNetworkTypes();
method public int getCallState();
method public int getCardIdForDefaultEuicc();
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) @WorkerThread public android.os.PersistableBundle getCarrierConfig();
diff --git a/api/module-lib-current.txt b/api/module-lib-current.txt
index cfb9b83..a1d9967 100644
--- a/api/module-lib-current.txt
+++ b/api/module-lib-current.txt
@@ -120,16 +120,16 @@
}
public static class TetheringManager.TetheringRequest {
- }
-
- public static class TetheringManager.TetheringRequest.Builder {
- ctor public TetheringManager.TetheringRequest.Builder(int);
- method @NonNull public android.net.TetheringManager.TetheringRequest build();
method @Nullable public android.net.LinkAddress getClientStaticIpv4Address();
method @Nullable public android.net.LinkAddress getLocalIpv4Address();
method public boolean getShouldShowEntitlementUi();
method public int getTetheringType();
method public boolean isExemptFromEntitlementCheck();
+ }
+
+ public static class TetheringManager.TetheringRequest.Builder {
+ ctor public TetheringManager.TetheringRequest.Builder(int);
+ method @NonNull public android.net.TetheringManager.TetheringRequest build();
method @NonNull @RequiresPermission("android.permission.TETHER_PRIVILEGED") public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean);
method @NonNull @RequiresPermission("android.permission.TETHER_PRIVILEGED") public android.net.TetheringManager.TetheringRequest.Builder setShouldShowEntitlementUi(boolean);
method @NonNull @RequiresPermission("android.permission.TETHER_PRIVILEGED") public android.net.TetheringManager.TetheringRequest.Builder setStaticIpv4Addresses(@NonNull android.net.LinkAddress, @NonNull android.net.LinkAddress);
diff --git a/api/system-current.txt b/api/system-current.txt
index 72a9a9d..369012c 100755
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -10,7 +10,6 @@
field @Deprecated public static final String ACCESS_FM_RADIO = "android.permission.ACCESS_FM_RADIO";
field public static final String ACCESS_INSTANT_APPS = "android.permission.ACCESS_INSTANT_APPS";
field public static final String ACCESS_LOCUS_ID_USAGE_STATS = "android.permission.ACCESS_LOCUS_ID_USAGE_STATS";
- field public static final String ACCESS_MESSAGES_ON_ICC = "android.permission.ACCESS_MESSAGES_ON_ICC";
field public static final String ACCESS_MOCK_LOCATION = "android.permission.ACCESS_MOCK_LOCATION";
field public static final String ACCESS_MTP = "android.permission.ACCESS_MTP";
field public static final String ACCESS_NETWORK_CONDITIONS = "android.permission.ACCESS_NETWORK_CONDITIONS";
@@ -342,12 +341,10 @@
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidImportance(int);
method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void killProcessesWhenImperceptible(@NonNull int[], @NonNull String);
method @RequiresPermission(android.Manifest.permission.KILL_UID) public void killUid(int, String);
- method public void registerHomeVisibilityObserver(@NonNull android.app.HomeVisibilityObserver);
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
method public void setDeviceLocales(@NonNull android.os.LocaleList);
method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public static void setPersistentVrThread(int);
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean switchUser(@NonNull android.os.UserHandle);
- method public void unregisterHomeVisibilityObserver(@NonNull android.app.HomeVisibilityObserver);
}
public static interface ActivityManager.OnUidImportanceListener {
@@ -600,11 +597,6 @@
field public static final String ACTION_DOWNLOAD_COMPLETED = "android.intent.action.DOWNLOAD_COMPLETED";
}
- public abstract class HomeVisibilityObserver {
- ctor public HomeVisibilityObserver();
- method public abstract void onHomeVisibilityChanged(boolean);
- }
-
public abstract class InstantAppResolverService extends android.app.Service {
ctor public InstantAppResolverService();
method public final void attachBaseContext(android.content.Context);
@@ -869,12 +861,11 @@
method @Nullable public android.content.ComponentName getProfileOwner() throws java.lang.IllegalArgumentException;
method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getProfileOwnerNameAsUser(int) throws java.lang.IllegalArgumentException;
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public int getUserProvisioningState();
- method public boolean hasDeviceIdentifierAccess(@NonNull String, int, int);
method public boolean isDeviceManaged();
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isDeviceProvisioned();
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isDeviceProvisioningConfigApplied();
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isManagedKiosk();
- method public boolean isSecondaryLockscreenEnabled(int);
+ method public boolean isSecondaryLockscreenEnabled(@NonNull android.os.UserHandle);
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isUnattendedManagedKiosk();
method @RequiresPermission("android.permission.NOTIFY_PENDING_SYSTEM_UPDATE") public void notifyPendingSystemUpdate(long);
method @RequiresPermission("android.permission.NOTIFY_PENDING_SYSTEM_UPDATE") public void notifyPendingSystemUpdate(long, boolean);
@@ -1460,16 +1451,8 @@
package android.bluetooth {
public final class BluetoothA2dp implements android.bluetooth.BluetoothProfile {
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public void disableOptionalCodecs(@NonNull android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public void enableOptionalCodecs(@NonNull android.bluetooth.BluetoothDevice);
- method @Nullable @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothDevice getActiveDevice();
- method @Nullable @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothCodecStatus getCodecStatus(@NonNull android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public int isOptionalCodecsEnabled(@NonNull android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public int isOptionalCodecsSupported(@NonNull android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public void setCodecConfigPreference(@NonNull android.bluetooth.BluetoothDevice, @NonNull android.bluetooth.BluetoothCodecConfig);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public void setOptionalCodecsEnabled(@NonNull android.bluetooth.BluetoothDevice, int);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
field public static final int OPTIONAL_CODECS_NOT_SUPPORTED = 0; // 0x0
field public static final int OPTIONAL_CODECS_PREF_DISABLED = 0; // 0x0
field public static final int OPTIONAL_CODECS_PREF_ENABLED = 1; // 0x1
@@ -1480,28 +1463,23 @@
public final class BluetoothA2dpSink implements android.bluetooth.BluetoothProfile {
method public void finalize();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@Nullable android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean isAudioPlaying(@Nullable android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@Nullable android.bluetooth.BluetoothDevice, int);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean isAudioPlaying(@NonNull android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
field @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.a2dp-sink.profile.action.CONNECTION_STATE_CHANGED";
}
public final class BluetoothAdapter {
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean addOnMetadataChangedListener(@NonNull android.bluetooth.BluetoothDevice, @NonNull java.util.concurrent.Executor, @NonNull android.bluetooth.BluetoothAdapter.OnMetadataChangedListener);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean connectAllEnabledProfiles(@NonNull android.bluetooth.BluetoothDevice);
method public boolean disableBLE();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean disconnectAllEnabledProfiles(@NonNull android.bluetooth.BluetoothDevice);
method public boolean enableBLE();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean enableNoAutoConnect();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean factoryReset();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public long getDiscoveryEndMillis();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public long getDiscoveryEndMillis();
method public boolean isBleScanAlwaysAvailable();
method public boolean isLeEnabled();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean removeActiveDevice(int);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean removeOnMetadataChangedListener(@NonNull android.bluetooth.BluetoothDevice, @NonNull android.bluetooth.BluetoothAdapter.OnMetadataChangedListener);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setActiveDevice(@NonNull android.bluetooth.BluetoothDevice, int);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setScanMode(int, long);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setScanMode(int);
field public static final String ACTION_BLE_STATE_CHANGED = "android.bluetooth.adapter.action.BLE_STATE_CHANGED";
field public static final String ACTION_REQUEST_BLE_SCAN_ALWAYS_AVAILABLE = "android.bluetooth.adapter.action.REQUEST_BLE_SCAN_ALWAYS_AVAILABLE";
field public static final int ACTIVE_DEVICE_ALL = 2; // 0x2
@@ -1513,70 +1491,17 @@
method public void onMetadataChanged(@NonNull android.bluetooth.BluetoothDevice, int, @Nullable byte[]);
}
- public final class BluetoothCodecConfig implements android.os.Parcelable {
- ctor public BluetoothCodecConfig(int, int, int, int, int, long, long, long, long);
- ctor public BluetoothCodecConfig(int);
- method public int getBitsPerSample();
- method @NonNull public String getCodecName();
- method public int getCodecPriority();
- method public long getCodecSpecific1();
- method public int getCodecType();
- method public int getSampleRate();
- method public boolean isMandatoryCodec();
- field public static final int BITS_PER_SAMPLE_16 = 1; // 0x1
- field public static final int BITS_PER_SAMPLE_24 = 2; // 0x2
- field public static final int BITS_PER_SAMPLE_32 = 4; // 0x4
- field public static final int BITS_PER_SAMPLE_NONE = 0; // 0x0
- field public static final int CHANNEL_MODE_MONO = 1; // 0x1
- field public static final int CHANNEL_MODE_NONE = 0; // 0x0
- field public static final int CHANNEL_MODE_STEREO = 2; // 0x2
- field public static final int CODEC_PRIORITY_DEFAULT = 0; // 0x0
- field public static final int CODEC_PRIORITY_DISABLED = -1; // 0xffffffff
- field public static final int CODEC_PRIORITY_HIGHEST = 1000000; // 0xf4240
- field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothCodecConfig> CREATOR;
- field public static final int SAMPLE_RATE_176400 = 16; // 0x10
- field public static final int SAMPLE_RATE_192000 = 32; // 0x20
- field public static final int SAMPLE_RATE_44100 = 1; // 0x1
- field public static final int SAMPLE_RATE_48000 = 2; // 0x2
- field public static final int SAMPLE_RATE_88200 = 4; // 0x4
- field public static final int SAMPLE_RATE_96000 = 8; // 0x8
- field public static final int SAMPLE_RATE_NONE = 0; // 0x0
- field public static final int SOURCE_CODEC_TYPE_AAC = 1; // 0x1
- field public static final int SOURCE_CODEC_TYPE_APTX = 2; // 0x2
- field public static final int SOURCE_CODEC_TYPE_APTX_HD = 3; // 0x3
- field public static final int SOURCE_CODEC_TYPE_INVALID = 1000000; // 0xf4240
- field public static final int SOURCE_CODEC_TYPE_LDAC = 4; // 0x4
- field public static final int SOURCE_CODEC_TYPE_MAX = 5; // 0x5
- field public static final int SOURCE_CODEC_TYPE_SBC = 0; // 0x0
- }
-
- public final class BluetoothCodecStatus implements android.os.Parcelable {
- ctor public BluetoothCodecStatus(@Nullable android.bluetooth.BluetoothCodecConfig, @Nullable android.bluetooth.BluetoothCodecConfig[], @Nullable android.bluetooth.BluetoothCodecConfig[]);
- method @Nullable public android.bluetooth.BluetoothCodecConfig getCodecConfig();
- method @Nullable public android.bluetooth.BluetoothCodecConfig[] getCodecsLocalCapabilities();
- method @Nullable public android.bluetooth.BluetoothCodecConfig[] getCodecsSelectableCapabilities();
- field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothCodecStatus> CREATOR;
- field public static final String EXTRA_CODEC_STATUS = "android.bluetooth.extra.CODEC_STATUS";
- }
-
public final class BluetoothDevice implements android.os.Parcelable {
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean cancelBondProcess();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean cancelPairing();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getBatteryLevel();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getMessageAccessPermission();
method @Nullable @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public byte[] getMetadata(int);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getPhonebookAccessPermission();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getSimAccessPermission();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean isBondingInitiatedLocally();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getSimAccessPermission();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isConnected();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isEncrypted();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean isInSilenceMode();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean removeBond();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setAlias(@NonNull String);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setMessageAccessPermission(int);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setMetadata(int, @NonNull byte[]);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setPhonebookAccessPermission(int);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setPin(@NonNull String);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setSilenceMode(boolean);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setSimAccessPermission(int);
field public static final int ACCESS_ALLOWED = 1; // 0x1
@@ -1606,17 +1531,15 @@
public final class BluetoothHeadset implements android.bluetooth.BluetoothProfile {
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean connect(android.bluetooth.BluetoothDevice);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean disconnect(android.bluetooth.BluetoothDevice);
- method @Nullable @RequiresPermission(android.Manifest.permission.BLUETOOTH) public android.bluetooth.BluetoothDevice getActiveDevice();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
method @Deprecated @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setPriority(android.bluetooth.BluetoothDevice, int);
}
public final class BluetoothHearingAid implements android.bluetooth.BluetoothProfile {
- method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH) public java.util.List<android.bluetooth.BluetoothDevice> getActiveDevices();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public long getHiSyncId(@Nullable android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public long getHiSyncId(@NonNull android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
}
public final class BluetoothHidDevice implements android.bluetooth.BluetoothProfile {
@@ -1625,9 +1548,9 @@
public final class BluetoothHidHost implements android.bluetooth.BluetoothProfile {
method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.input.profile.action.CONNECTION_STATE_CHANGED";
}
@@ -1635,19 +1558,17 @@
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public void close();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) protected void finalize();
method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getConnectionPolicy(@Nullable android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setConnectionPolicy(@Nullable android.bluetooth.BluetoothDevice, int);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.map.profile.action.CONNECTION_STATE_CHANGED";
}
- public final class BluetoothPan implements java.lang.AutoCloseable android.bluetooth.BluetoothProfile {
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public void close();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) protected void finalize();
- method @NonNull public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getConnectionState(@Nullable android.bluetooth.BluetoothDevice);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isTetheringOn();
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public void setBluetoothTethering(boolean);
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
+ public final class BluetoothPan implements android.bluetooth.BluetoothProfile {
+ method @NonNull @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean isTetheringOn();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public void setBluetoothTethering(boolean);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED";
field public static final String EXTRA_LOCAL_ROLE = "android.bluetooth.pan.extra.LOCAL_ROLE";
field public static final int LOCAL_NAP_ROLE = 1; // 0x1
@@ -1658,7 +1579,7 @@
}
public class BluetoothPbap implements android.bluetooth.BluetoothProfile {
- method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionState(@Nullable android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public int getConnectionState(@NonNull android.bluetooth.BluetoothDevice);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull android.bluetooth.BluetoothDevice, int);
field @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED";
}
@@ -1774,6 +1695,7 @@
}
public abstract class ContentResolver {
+ method public int checkUriPermission(@NonNull android.net.Uri, int, int);
method @NonNull public static android.net.Uri decodeFromFile(@NonNull java.io.File);
method @NonNull public static java.io.File encodeToFile(@NonNull android.net.Uri);
method @Nullable @RequiresPermission("android.permission.CACHE_CONTENT") public android.os.Bundle getCache(@NonNull android.net.Uri);
@@ -1802,7 +1724,6 @@
field public static final String EUICC_CARD_SERVICE = "euicc_card";
field public static final String HDMI_CONTROL_SERVICE = "hdmi_control";
field public static final String NETD_SERVICE = "netd";
- field public static final String NETWORK_POLICY_SERVICE = "netpolicy";
field public static final String NETWORK_SCORE_SERVICE = "network_score";
field public static final String OEM_LOCK_SERVICE = "oem_lock";
field public static final String PERMISSION_SERVICE = "permission";
@@ -1813,7 +1734,6 @@
field public static final String STATUS_BAR_SERVICE = "statusbar";
field public static final String SYSTEM_CONFIG_SERVICE = "system_config";
field public static final String SYSTEM_UPDATE_SERVICE = "system_update";
- field public static final String TELEPHONY_REGISTRY_SERVICE = "telephony_registry";
field public static final String TETHERING_SERVICE = "tethering";
field public static final String VR_SERVICE = "vrmanager";
field public static final String WIFI_NL80211_SERVICE = "wifinl80211";
@@ -4344,6 +4264,26 @@
method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getClientUid();
}
+ public class AudioTrack implements android.media.AudioRouting android.media.VolumeAutomation {
+ field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int ENCAPSULATION_MODE_HANDLE = 2; // 0x2
+ }
+
+ public static class AudioTrack.Builder {
+ method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioTrack.Builder setTunerConfiguration(@NonNull android.media.AudioTrack.TunerConfiguration);
+ }
+
+ public static class AudioTrack.TunerConfiguration {
+ method @IntRange(from=1) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getContentId();
+ method @IntRange(from=1) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getSyncId();
+ }
+
+ public static class AudioTrack.TunerConfiguration.Builder {
+ ctor public AudioTrack.TunerConfiguration.Builder();
+ method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioTrack.TunerConfiguration build();
+ method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioTrack.TunerConfiguration.Builder setContentId(@IntRange(from=1) int);
+ method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioTrack.TunerConfiguration.Builder setSyncId(@IntRange(from=1) int);
+ }
+
public class HwAudioSource {
method public boolean isPlaying();
method public void start();
@@ -6586,16 +6526,16 @@
}
public static class TetheringManager.TetheringRequest {
- }
-
- public static class TetheringManager.TetheringRequest.Builder {
- ctor public TetheringManager.TetheringRequest.Builder(int);
- method @NonNull public android.net.TetheringManager.TetheringRequest build();
method @Nullable public android.net.LinkAddress getClientStaticIpv4Address();
method @Nullable public android.net.LinkAddress getLocalIpv4Address();
method public boolean getShouldShowEntitlementUi();
method public int getTetheringType();
method public boolean isExemptFromEntitlementCheck();
+ }
+
+ public static class TetheringManager.TetheringRequest.Builder {
+ ctor public TetheringManager.TetheringRequest.Builder(int);
+ method @NonNull public android.net.TetheringManager.TetheringRequest build();
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean);
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setShouldShowEntitlementUi(boolean);
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setStaticIpv4Addresses(@NonNull android.net.LinkAddress, @NonNull android.net.LinkAddress);
@@ -7069,7 +7009,7 @@
field @Deprecated public byte id;
}
- public class ScanResult implements android.os.Parcelable {
+ public final class ScanResult implements android.os.Parcelable {
field public static final int CIPHER_CCMP = 3; // 0x3
field public static final int CIPHER_GCMP_256 = 4; // 0x4
field public static final int CIPHER_NONE = 0; // 0x0
@@ -8173,7 +8113,7 @@
field public static final String ACTION_UPDATE_CARRIER_PROVISIONING_URLS = "android.intent.action.UPDATE_CARRIER_PROVISIONING_URLS";
field public static final String ACTION_UPDATE_CONVERSATION_ACTIONS = "android.intent.action.UPDATE_CONVERSATION_ACTIONS";
field public static final String ACTION_UPDATE_CT_LOGS = "android.intent.action.UPDATE_CT_LOGS";
- field @RequiresPermission("android.permission.UPDATE_CONFIG") public static final String ACTION_UPDATE_EMERGENCY_NUMBER_DB = "android.os.action.UPDATE_EMERGENCY_NUMBER_DB";
+ field public static final String ACTION_UPDATE_EMERGENCY_NUMBER_DB = "android.os.action.UPDATE_EMERGENCY_NUMBER_DB";
field public static final String ACTION_UPDATE_INTENT_FIREWALL = "android.intent.action.UPDATE_INTENT_FIREWALL";
field public static final String ACTION_UPDATE_LANG_ID = "android.intent.action.UPDATE_LANG_ID";
field public static final String ACTION_UPDATE_NETWORK_WATCHLIST = "android.intent.action.UPDATE_NETWORK_WATCHLIST";
@@ -8535,31 +8475,6 @@
field public static final int STATUS_WAITING_REBOOT = 5; // 0x5
}
- public class TelephonyServiceManager {
- method @NonNull public android.os.TelephonyServiceManager.ServiceRegisterer getCarrierConfigServiceRegisterer();
- method @NonNull public android.os.TelephonyServiceManager.ServiceRegisterer getEuiccCardControllerServiceRegisterer();
- method @NonNull public android.os.TelephonyServiceManager.ServiceRegisterer getEuiccControllerService();
- method @NonNull public android.os.TelephonyServiceManager.ServiceRegisterer getIccPhoneBookServiceRegisterer();
- method @NonNull public android.os.TelephonyServiceManager.ServiceRegisterer getOpportunisticNetworkServiceRegisterer();
- method @NonNull public android.os.TelephonyServiceManager.ServiceRegisterer getPhoneSubServiceRegisterer();
- method @NonNull public android.os.TelephonyServiceManager.ServiceRegisterer getSmsServiceRegisterer();
- method @NonNull public android.os.TelephonyServiceManager.ServiceRegisterer getSubscriptionServiceRegisterer();
- method @NonNull public android.os.TelephonyServiceManager.ServiceRegisterer getTelephonyImsServiceRegisterer();
- method @NonNull public android.os.TelephonyServiceManager.ServiceRegisterer getTelephonyRcsMessageServiceRegisterer();
- method @NonNull public android.os.TelephonyServiceManager.ServiceRegisterer getTelephonyServiceRegisterer();
- }
-
- public static class TelephonyServiceManager.ServiceNotFoundException extends java.lang.Exception {
- ctor public TelephonyServiceManager.ServiceNotFoundException(@NonNull String);
- }
-
- public static final class TelephonyServiceManager.ServiceRegisterer {
- method @Nullable public android.os.IBinder get();
- method @NonNull public android.os.IBinder getOrThrow() throws android.os.TelephonyServiceManager.ServiceNotFoundException;
- method public void register(@NonNull android.os.IBinder);
- method @Nullable public android.os.IBinder tryGet();
- }
-
public class UpdateEngine {
ctor public UpdateEngine();
method @NonNull @WorkerThread public android.os.UpdateEngine.AllocateSpaceResult allocateSpace(@NonNull String, @NonNull String[]);
@@ -8897,6 +8812,7 @@
}
public final class PermissionManager {
+ method public int checkDeviceIdentifierAccess(@Nullable String, @Nullable String, @Nullable String, int, int);
method @NonNull @RequiresPermission(android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY) public java.util.Set<java.lang.String> getAutoRevokeExemptionGrantedPackages();
method @NonNull @RequiresPermission(android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY) public java.util.Set<java.lang.String> getAutoRevokeExemptionRequestedPackages();
method @IntRange(from=0) @RequiresPermission(anyOf={android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public int getRuntimePermissionsVersion();
@@ -9651,6 +9567,7 @@
method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
method @Nullable public android.os.Bundle onGetInlineSuggestionsRendererInfo();
method @Nullable public android.view.View onRenderSuggestion(@NonNull android.service.autofill.InlinePresentation, int, int);
+ method public final void startIntentSender(@NonNull android.content.IntentSender);
field public static final String SERVICE_INTERFACE = "android.service.autofill.InlineSuggestionRenderService";
}
@@ -10165,6 +10082,7 @@
method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent);
method public abstract void onEndSession(@NonNull String) throws java.io.IOException;
method public abstract void onStartSession(@NonNull String, int, @NonNull android.os.ParcelFileDescriptor, @NonNull java.io.File, @NonNull java.io.File) throws java.io.IOException;
+ method public abstract void onVolumeStateChanged(@NonNull android.os.storage.StorageVolume) throws java.io.IOException;
field public static final int FLAG_SESSION_ATTRIBUTE_INDEXABLE = 2; // 0x2
field public static final int FLAG_SESSION_TYPE_FUSE = 1; // 0x1
field public static final String SERVICE_INTERFACE = "android.service.storage.ExternalStorageService";
@@ -10567,9 +10485,6 @@
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall();
method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isRinging();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserSelectedOutgoingPhoneAccount(@Nullable android.telecom.PhoneAccountHandle);
- field public static final int CALL_SOURCE_EMERGENCY_DIALPAD = 1; // 0x1
- field public static final int CALL_SOURCE_EMERGENCY_SHORTCUT = 2; // 0x2
- field public static final int CALL_SOURCE_UNSPECIFIED = 0; // 0x0
field public static final String EXTRA_CALL_BACK_INTENT = "android.telecom.extra.CALL_BACK_INTENT";
field public static final String EXTRA_CLEAR_MISSED_CALLS_INTENT = "android.telecom.extra.CLEAR_MISSED_CALLS_INTENT";
field public static final String EXTRA_CONNECTION_SERVICE = "android.telecom.extra.CONNECTION_SERVICE";
@@ -10878,30 +10793,6 @@
field public static final String MBMS_STREAMING_SERVICE_ACTION = "android.telephony.action.EmbmsStreaming";
}
- public final class ModemActivityInfo implements android.os.Parcelable {
- ctor public ModemActivityInfo(long, int, int, @NonNull int[], int);
- method public int describeContents();
- method public int getIdleTimeMillis();
- method public int getReceiveTimeMillis();
- method public int getSleepTimeMillis();
- method public long getTimestamp();
- method @NonNull public java.util.List<android.telephony.ModemActivityInfo.TransmitPower> getTransmitPowerInfo();
- method public boolean isValid();
- method public void writeToParcel(android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ModemActivityInfo> CREATOR;
- field public static final int TX_POWER_LEVELS = 5; // 0x5
- field public static final int TX_POWER_LEVEL_0 = 0; // 0x0
- field public static final int TX_POWER_LEVEL_1 = 1; // 0x1
- field public static final int TX_POWER_LEVEL_2 = 2; // 0x2
- field public static final int TX_POWER_LEVEL_3 = 3; // 0x3
- field public static final int TX_POWER_LEVEL_4 = 4; // 0x4
- }
-
- public class ModemActivityInfo.TransmitPower {
- method @NonNull public android.util.Range<java.lang.Integer> getPowerRangeInDbm();
- method public int getTimeInMillis();
- }
-
public final class NetworkRegistrationInfo implements android.os.Parcelable {
method @Nullable public android.telephony.DataSpecificRegistrationInfo getDataSpecificInfo();
method public int getRegistrationState();
@@ -11126,21 +11017,15 @@
}
public class ServiceState implements android.os.Parcelable {
- method public void fillInNotifierBundle(@NonNull android.os.Bundle);
method @Nullable public android.telephony.NetworkRegistrationInfo getNetworkRegistrationInfo(int, int);
method @NonNull public java.util.List<android.telephony.NetworkRegistrationInfo> getNetworkRegistrationInfoListForDomain(int);
method @NonNull public java.util.List<android.telephony.NetworkRegistrationInfo> getNetworkRegistrationInfoListForTransportType(int);
- method @NonNull public static android.telephony.ServiceState newFromBundle(@NonNull android.os.Bundle);
field public static final int ROAMING_TYPE_DOMESTIC = 2; // 0x2
field public static final int ROAMING_TYPE_INTERNATIONAL = 3; // 0x3
field public static final int ROAMING_TYPE_NOT_ROAMING = 0; // 0x0
field public static final int ROAMING_TYPE_UNKNOWN = 1; // 0x1
}
- public class SignalStrength implements android.os.Parcelable {
- ctor public SignalStrength(@NonNull android.telephony.SignalStrength);
- }
-
public final class SmsCbCmasInfo implements android.os.Parcelable {
ctor public SmsCbCmasInfo(int, int, int, int, int, int);
method public int describeContents();
@@ -11265,11 +11150,8 @@
}
public final class SmsManager {
- method @RequiresPermission(android.Manifest.permission.ACCESS_MESSAGES_ON_ICC) public boolean copyMessageToIcc(@Nullable byte[], @NonNull byte[], int);
- method @RequiresPermission(android.Manifest.permission.ACCESS_MESSAGES_ON_ICC) public boolean deleteMessageFromIcc(int);
method public boolean disableCellBroadcastRange(int, int, int);
method public boolean enableCellBroadcastRange(int, int, int);
- method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_MESSAGES_ON_ICC) public java.util.List<android.telephony.SmsMessage> getMessagesFromIcc();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getPremiumSmsConsent(@NonNull String);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSmsCapacityOnIcc();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void sendMultipartTextMessageWithoutPersisting(String, String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>);
@@ -11331,11 +11213,6 @@
method @Deprecated public static android.telephony.SubscriptionPlan.Builder createRecurringWeekly(java.time.ZonedDateTime);
}
- public class TelephonyFrameworkInitializer {
- method public static void registerServiceWrappers();
- method public static void setTelephonyServiceManager(@NonNull android.os.TelephonyServiceManager);
- }
-
public final class TelephonyHistogram implements android.os.Parcelable {
ctor public TelephonyHistogram(int, int, int);
ctor public TelephonyHistogram(android.telephony.TelephonyHistogram);
@@ -11420,8 +11297,8 @@
method public boolean isDataConnectivityPossible();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isDataEnabledForApn(int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isEmergencyAssistanceEnabled();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean isIccLockEnabled();
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isIdle();
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isInEmergencySmsMode();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isLteCdmaEvdoGsmWcdmaEnabled();
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isOffhook();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isOpportunisticNetworkEnabled();
@@ -11437,7 +11314,6 @@
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean rebootRadio();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void reportDefaultNetworkStatus(boolean);
method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.MODIFY_PHONE_STATE}) public void requestCellInfoUpdate(@NonNull android.os.WorkSource, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback);
- method public void requestModemActivityInfo(@NonNull android.os.ResultReceiver);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void requestNumberVerification(@NonNull android.telephony.PhoneNumberRange, long, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.NumberVerificationCallback);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void resetAllCarrierActions();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void resetCarrierKeysForImsiEncryption();
@@ -11474,11 +11350,6 @@
method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void updateOtaEmergencyNumberDbFilePath(@NonNull android.os.ParcelFileDescriptor);
method public void updateServiceLocation();
field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final String ACTION_ANOMALY_REPORTED = "android.telephony.action.ANOMALY_REPORTED";
- field public static final String ACTION_CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE = "com.android.internal.telephony.CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE";
- field public static final String ACTION_CARRIER_SIGNAL_PCO_VALUE = "com.android.internal.telephony.CARRIER_SIGNAL_PCO_VALUE";
- field public static final String ACTION_CARRIER_SIGNAL_REDIRECTED = "com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED";
- field public static final String ACTION_CARRIER_SIGNAL_REQUEST_NETWORK_FAILED = "com.android.internal.telephony.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED";
- field public static final String ACTION_CARRIER_SIGNAL_RESET = "com.android.internal.telephony.CARRIER_SIGNAL_RESET";
field public static final String ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED";
field public static final String ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED";
field public static final String ACTION_EMERGENCY_ASSISTANCE = "android.telephony.action.EMERGENCY_ASSISTANCE";
@@ -11495,34 +11366,14 @@
field public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; // 0xffffffff
field public static final String EXTRA_ANOMALY_DESCRIPTION = "android.telephony.extra.ANOMALY_DESCRIPTION";
field public static final String EXTRA_ANOMALY_ID = "android.telephony.extra.ANOMALY_ID";
- field @Deprecated public static final String EXTRA_APN_PROTOCOL = "apnProto";
- field public static final String EXTRA_APN_PROTOCOL_INT = "apnProtoInt";
- field @Deprecated public static final String EXTRA_APN_TYPE = "apnType";
- field public static final String EXTRA_APN_TYPE_INT = "apnTypeInt";
- field public static final String EXTRA_DEFAULT_NETWORK_AVAILABLE = "defaultNetworkAvailable";
- field public static final String EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE = "android.telephony.extra.DEFAULT_SUBSCRIPTION_SELECT_TYPE";
- field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_ALL = 4; // 0x4
- field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA = 1; // 0x1
- field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_NONE = 0; // 0x0
- field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_SMS = 3; // 0x3
- field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_VOICE = 2; // 0x2
- field public static final String EXTRA_ERROR_CODE = "errorCode";
- field public static final String EXTRA_PCO_ID = "pcoId";
- field public static final String EXTRA_PCO_VALUE = "pcoValue";
field public static final String EXTRA_PHONE_IN_ECM_STATE = "android.telephony.extra.PHONE_IN_ECM_STATE";
field public static final String EXTRA_PHONE_IN_EMERGENCY_CALL = "android.telephony.extra.PHONE_IN_EMERGENCY_CALL";
- field public static final String EXTRA_REDIRECTION_URL = "redirectionUrl";
- field public static final String EXTRA_SIM_COMBINATION_NAMES = "android.telephony.extra.SIM_COMBINATION_NAMES";
- field public static final String EXTRA_SIM_COMBINATION_WARNING_TYPE = "android.telephony.extra.SIM_COMBINATION_WARNING_TYPE";
- field public static final int EXTRA_SIM_COMBINATION_WARNING_TYPE_DUAL_CDMA = 1; // 0x1
- field public static final int EXTRA_SIM_COMBINATION_WARNING_TYPE_NONE = 0; // 0x0
field public static final String EXTRA_SIM_STATE = "android.telephony.extra.SIM_STATE";
field public static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL";
field public static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING";
field public static final int INVALID_EMERGENCY_NUMBER_DB_VERSION = -1; // 0xffffffff
field public static final int KEY_TYPE_EPDG = 1; // 0x1
field public static final int KEY_TYPE_WLAN = 2; // 0x2
- field public static final String MODEM_ACTIVITY_RESULT_KEY = "controller_activity";
field public static final long NETWORK_TYPE_BITMASK_1xRTT = 64L; // 0x40L
field public static final long NETWORK_TYPE_BITMASK_CDMA = 8L; // 0x8L
field public static final long NETWORK_TYPE_BITMASK_EDGE = 2L; // 0x2L
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 23e2499..3acc225 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -136,7 +136,7 @@
field public boolean truncated;
}
- public class ScanResult implements android.os.Parcelable {
+ public final class ScanResult implements android.os.Parcelable {
field public boolean untrusted;
}
diff --git a/api/test-current.txt b/api/test-current.txt
index 89394b3..38cf6a1 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -974,6 +974,7 @@
field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption";
field public static final int FLAG_PERMISSION_APPLY_RESTRICTION = 16384; // 0x4000
field public static final int FLAG_PERMISSION_GRANTED_BY_ROLE = 32768; // 0x8000
+ field public static final int FLAG_PERMISSION_ONE_TIME = 65536; // 0x10000
field public static final int FLAG_PERMISSION_POLICY_FIXED = 4; // 0x4
field public static final int FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT = 2048; // 0x800
field public static final int FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT = 4096; // 0x1000
@@ -1986,16 +1987,16 @@
}
public static class TetheringManager.TetheringRequest {
- }
-
- public static class TetheringManager.TetheringRequest.Builder {
- ctor public TetheringManager.TetheringRequest.Builder(int);
- method @NonNull public android.net.TetheringManager.TetheringRequest build();
method @Nullable public android.net.LinkAddress getClientStaticIpv4Address();
method @Nullable public android.net.LinkAddress getLocalIpv4Address();
method public boolean getShouldShowEntitlementUi();
method public int getTetheringType();
method public boolean isExemptFromEntitlementCheck();
+ }
+
+ public static class TetheringManager.TetheringRequest.Builder {
+ ctor public TetheringManager.TetheringRequest.Builder(int);
+ method @NonNull public android.net.TetheringManager.TetheringRequest build();
method @NonNull @RequiresPermission("android.permission.TETHER_PRIVILEGED") public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean);
method @NonNull @RequiresPermission("android.permission.TETHER_PRIVILEGED") public android.net.TetheringManager.TetheringRequest.Builder setShouldShowEntitlementUi(boolean);
method @NonNull @RequiresPermission("android.permission.TETHER_PRIVILEGED") public android.net.TetheringManager.TetheringRequest.Builder setStaticIpv4Addresses(@NonNull android.net.LinkAddress, @NonNull android.net.LinkAddress);
@@ -3020,6 +3021,7 @@
field public static final String DOZE_ALWAYS_ON = "doze_always_on";
field @Deprecated public static final String ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES = "enabled_notification_policy_access_packages";
field public static final String ENABLED_VR_LISTENERS = "enabled_vr_listeners";
+ field public static final String IMMERSIVE_MODE_CONFIRMATIONS = "immersive_mode_confirmations";
field public static final String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis";
field public static final String LOCATION_ACCESS_CHECK_INTERVAL_MILLIS = "location_access_check_interval_millis";
field public static final String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS = "lock_screen_allow_private_notifications";
@@ -3192,6 +3194,7 @@
method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
method @Nullable public android.os.Bundle onGetInlineSuggestionsRendererInfo();
method @Nullable public android.view.View onRenderSuggestion(@NonNull android.service.autofill.InlinePresentation, int, int);
+ method public final void startIntentSender(@NonNull android.content.IntentSender);
field public static final String SERVICE_INTERFACE = "android.service.autofill.InlineSuggestionRenderService";
}
@@ -3799,43 +3802,6 @@
field public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1; // 0xffffffff
}
- public class TelephonyRegistryManager {
- method public void addOnOpportunisticSubscriptionsChangedListener(@NonNull android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener, @NonNull java.util.concurrent.Executor);
- method public void addOnSubscriptionsChangedListener(@NonNull android.telephony.SubscriptionManager.OnSubscriptionsChangedListener, @NonNull java.util.concurrent.Executor);
- method public void listenForSubscriber(int, @NonNull String, @NonNull String, @NonNull android.telephony.PhoneStateListener, int, boolean);
- method public void notifyActiveDataSubIdChanged(int);
- method public void notifyBarringInfoChanged(int, int, @NonNull android.telephony.BarringInfo);
- method public void notifyCallForwardingChanged(int, boolean);
- method public void notifyCallQualityChanged(int, int, @NonNull android.telephony.CallQuality, int);
- method public void notifyCallStateChanged(int, int, int, @Nullable String);
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyCallStateChangedForAllSubscriptions(int, @Nullable String);
- method public void notifyCarrierNetworkChange(boolean);
- method public void notifyCellInfoChanged(int, @NonNull java.util.List<android.telephony.CellInfo>);
- method public void notifyCellLocation(int, @NonNull android.telephony.CellIdentity);
- method public void notifyDataActivationStateChanged(int, int, int);
- method public void notifyDataActivityChanged(int, int);
- method public void notifyDataConnectionForSubscriber(int, int, int, @Nullable android.telephony.PreciseDataConnectionState);
- method public void notifyDisconnectCause(int, int, int, int);
- method public void notifyDisplayInfoChanged(int, int, @NonNull android.telephony.TelephonyDisplayInfo);
- method public void notifyEmergencyNumberList(int, int);
- method public void notifyImsDisconnectCause(int, @NonNull android.telephony.ims.ImsReasonInfo);
- method public void notifyMessageWaitingChanged(int, int, boolean);
- method public void notifyOutgoingEmergencyCall(int, int, @NonNull android.telephony.emergency.EmergencyNumber);
- method public void notifyOutgoingEmergencySms(int, int, @NonNull android.telephony.emergency.EmergencyNumber);
- method public void notifyPhoneCapabilityChanged(@NonNull android.telephony.PhoneCapability);
- method public void notifyPreciseCallState(int, int, int, int, int);
- method public void notifyPreciseDataConnectionFailed(int, int, int, @Nullable String, int);
- method public void notifyRadioPowerStateChanged(int, int, int);
- method public void notifyRegistrationFailed(int, int, @NonNull android.telephony.CellIdentity, @NonNull String, int, int, int);
- method public void notifyServiceStateChanged(int, int, @NonNull android.telephony.ServiceState);
- method public void notifySignalStrengthChanged(int, int, @NonNull android.telephony.SignalStrength);
- method public void notifySrvccStateChanged(int, int);
- method public void notifyUserMobileDataStateChanged(int, int, boolean);
- method public void notifyVoiceActivationStateChanged(int, int, int);
- method public void removeOnOpportunisticSubscriptionsChangedListener(@NonNull android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener);
- method public void removeOnSubscriptionsChangedListener(@NonNull android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
- }
-
}
package android.telephony.emergency {
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index 7ad9826..812d10b 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -1209,9 +1209,10 @@
return Status::ok();
}
-Status StatsService::registerNativePullAtomCallback(int32_t atomTag, int64_t coolDownNs,
- int64_t timeoutNs, const std::vector<int32_t>& additiveFields,
- const shared_ptr<IPullAtomCallback>& pullerCallback) {
+Status StatsService::registerNativePullAtomCallback(
+ int32_t atomTag, int64_t coolDownMillis, int64_t timeoutMillis,
+ const std::vector<int32_t>& additiveFields,
+ const shared_ptr<IPullAtomCallback>& pullerCallback) {
if (!checkPermission(kPermissionRegisterPullAtom)) {
return exception(
EX_SECURITY,
@@ -1220,7 +1221,8 @@
}
VLOG("StatsService::registerNativePullAtomCallback called.");
int32_t uid = AIBinder_getCallingUid();
- mPullerManager->RegisterPullAtomCallback(uid, atomTag, coolDownNs, timeoutNs, additiveFields,
+ mPullerManager->RegisterPullAtomCallback(uid, atomTag, MillisToNano(coolDownMillis),
+ MillisToNano(timeoutMillis), additiveFields,
pullerCallback);
return Status::ok();
}
diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h
index c256e1f..114c84f 100644
--- a/cmds/statsd/src/StatsService.h
+++ b/cmds/statsd/src/StatsService.h
@@ -175,8 +175,9 @@
/**
* Binder call to register a callback function for a pulled atom.
*/
- virtual Status registerNativePullAtomCallback(int32_t atomTag, int64_t coolDownNs,
- int64_t timeoutNs, const std::vector<int32_t>& additiveFields,
+ virtual Status registerNativePullAtomCallback(
+ int32_t atomTag, int64_t coolDownMillis, int64_t timeoutMillis,
+ const std::vector<int32_t>& additiveFields,
const shared_ptr<IPullAtomCallback>& pullerCallback) override;
/**
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index f0a5b51..f9711c3 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -3020,7 +3020,7 @@
optional string process_name = 3;
// The pid if available. -1 means not available.
- optional sint32 pid = 4;
+ optional int32 pid = 4;
optional string package_name = 5;
@@ -3056,7 +3056,7 @@
optional string process_name = 3;
// The pid if available. -1 means not available.
- optional sint32 pid = 4;
+ optional int32 pid = 4;
optional android.server.ErrorSource error_source = 5;
}
diff --git a/cmds/statsd/src/shell/ShellSubscriber.cpp b/cmds/statsd/src/shell/ShellSubscriber.cpp
index a861a3b..6fa1654 100644
--- a/cmds/statsd/src/shell/ShellSubscriber.cpp
+++ b/cmds/statsd/src/shell/ShellSubscriber.cpp
@@ -18,6 +18,7 @@
#include "ShellSubscriber.h"
+#include <android-base/file.h>
#include "matchers/matcher_util.h"
#include "stats_log_util.h"
@@ -30,154 +31,129 @@
const static int FIELD_ID_ATOM = 1;
void ShellSubscriber::startNewSubscription(int in, int out, int timeoutSec) {
- VLOG("start new shell subscription");
- int64_t subscriberId = getElapsedRealtimeNs();
+ int myToken = claimToken();
+ mSubscriptionShouldEnd.notify_one();
- {
- std::lock_guard<std::mutex> lock(mMutex);
- if (mSubscriberId> 0) {
- VLOG("Only one shell subscriber is allowed.");
- return;
- }
- mSubscriberId = subscriberId;
- mInput = in;
- mOutput = out;
+ shared_ptr<SubscriptionInfo> mySubscriptionInfo = make_shared<SubscriptionInfo>(in, out);
+ if (!readConfig(mySubscriptionInfo)) {
+ return;
}
- bool success = readConfig();
- if (!success) {
- std::lock_guard<std::mutex> lock(mMutex);
- cleanUpLocked();
+ // critical-section
+ std::unique_lock<std::mutex> lock(mMutex);
+ if (myToken < mToken) {
+ // Some other subscription has already come in. Stop.
+ return;
+ }
+ mSubscriptionInfo = mySubscriptionInfo;
+
+ if (mySubscriptionInfo->mPulledInfo.size() > 0 && mySubscriptionInfo->mPullIntervalMin > 0) {
+ // This thread terminates after it detects that mToken has changed.
+ std::thread puller([this, myToken] { startPull(myToken); });
+ puller.detach();
}
- VLOG("Wait for client to exit or timeout (%d sec)", timeoutSec);
- std::unique_lock<std::mutex> lk(mMutex);
-
- // Note that the following is blocking, and it's intended as we cannot return until the shell
- // cmd exits or we time out.
+ // Block until subscription has ended.
if (timeoutSec > 0) {
- mShellDied.wait_for(lk, timeoutSec * 1s,
- [this, subscriberId] { return mSubscriberId != subscriberId; });
+ mSubscriptionShouldEnd.wait_for(
+ lock, timeoutSec * 1s, [this, myToken, &mySubscriptionInfo] {
+ return mToken != myToken || !mySubscriptionInfo->mClientAlive;
+ });
} else {
- mShellDied.wait(lk, [this, subscriberId] { return mSubscriberId != subscriberId; });
+ mSubscriptionShouldEnd.wait(lock, [this, myToken, &mySubscriptionInfo] {
+ return mToken != myToken || !mySubscriptionInfo->mClientAlive;
+ });
+ }
+
+ if (mSubscriptionInfo == mySubscriptionInfo) {
+ mSubscriptionInfo = nullptr;
}
}
+// Atomically claim the next token. Token numbers denote subscriber ordering.
+int ShellSubscriber::claimToken() {
+ std::unique_lock<std::mutex> lock(mMutex);
+ int myToken = ++mToken;
+ return myToken;
+}
-// Read configs until EOF is reached. There may be multiple configs in the input
-// -- each new config should replace the previous one.
-//
-// Returns a boolean indicating whether the input was read successfully.
-bool ShellSubscriber::readConfig() {
- if (mInput < 0) {
+// Read and parse single config. There should only one config per input.
+bool ShellSubscriber::readConfig(shared_ptr<SubscriptionInfo> subscriptionInfo) {
+ // Read the size of the config.
+ size_t bufferSize;
+ if (!android::base::ReadFully(subscriptionInfo->mInputFd, &bufferSize, sizeof(bufferSize))) {
return false;
}
- while (true) {
- // Read the size of the config.
- size_t bufferSize = 0;
- ssize_t bytesRead = read(mInput, &bufferSize, sizeof(bufferSize));
- if (bytesRead == 0) {
- VLOG("We have reached the end of the input.");
- return true;
- } else if (bytesRead < 0 || (size_t)bytesRead != sizeof(bufferSize)) {
- ALOGE("Error reading config size");
- return false;
- }
-
- // Read and parse the config.
- vector<uint8_t> buffer(bufferSize);
- bytesRead = read(mInput, buffer.data(), bufferSize);
- if (bytesRead > 0 && (size_t)bytesRead == bufferSize) {
- ShellSubscription config;
- if (config.ParseFromArray(buffer.data(), bufferSize)) {
- updateConfig(config);
- } else {
- ALOGE("Error parsing the config");
- return false;
- }
- } else {
- VLOG("Error reading the config, expected bytes: %zu, actual bytes: %zu", bufferSize,
- bytesRead);
- return false;
- }
+ // Read the config.
+ vector<uint8_t> buffer(bufferSize);
+ if (!android::base::ReadFully(subscriptionInfo->mInputFd, buffer.data(), bufferSize)) {
+ return false;
}
-}
-void ShellSubscriber::updateConfig(const ShellSubscription& config) {
- mPushedMatchers.clear();
- mPulledInfo.clear();
+ // Parse the config.
+ ShellSubscription config;
+ if (!config.ParseFromArray(buffer.data(), bufferSize)) {
+ return false;
+ }
+ // Update SubscriptionInfo with state from config
for (const auto& pushed : config.pushed()) {
- mPushedMatchers.push_back(pushed);
- VLOG("adding matcher for pushed atom %d", pushed.atom_id());
+ subscriptionInfo->mPushedMatchers.push_back(pushed);
}
- int64_t token = getElapsedRealtimeNs();
- mPullToken = token;
-
- int64_t minInterval = -1;
+ int minInterval = -1;
for (const auto& pulled : config.pulled()) {
// All intervals need to be multiples of the min interval.
if (minInterval < 0 || pulled.freq_millis() < minInterval) {
minInterval = pulled.freq_millis();
}
-
- mPulledInfo.emplace_back(pulled.matcher(), pulled.freq_millis());
- VLOG("adding matcher for pulled atom %d", pulled.matcher().atom_id());
+ subscriptionInfo->mPulledInfo.emplace_back(pulled.matcher(), pulled.freq_millis());
}
+ subscriptionInfo->mPullIntervalMin = minInterval;
- if (mPulledInfo.size() > 0 && minInterval > 0) {
- // This thread is guaranteed to terminate after it detects the token is
- // different.
- std::thread puller([token, minInterval, this] { startPull(token, minInterval); });
- puller.detach();
- }
+ return true;
}
-void ShellSubscriber::startPull(int64_t token, int64_t intervalMillis) {
+void ShellSubscriber::startPull(int64_t myToken) {
while (true) {
- int64_t nowMillis = getElapsedRealtimeMillis();
- {
- std::lock_guard<std::mutex> lock(mMutex);
- // If the token has changed, the config has changed, so this
- // puller can now stop.
- if (mPulledInfo.size() == 0 || mPullToken != token) {
- VLOG("Pulling thread %lld done!", (long long)token);
- return;
- }
- for (auto& pullInfo : mPulledInfo) {
- if (pullInfo.mPrevPullElapsedRealtimeMs + pullInfo.mInterval < nowMillis) {
- VLOG("pull atom %d now", pullInfo.mPullerMatcher.atom_id());
+ std::lock_guard<std::mutex> lock(mMutex);
+ if (!mSubscriptionInfo || mToken != myToken) {
+ VLOG("Pulling thread %lld done!", (long long)myToken);
+ return;
+ }
- vector<std::shared_ptr<LogEvent>> data;
- mPullerMgr->Pull(pullInfo.mPullerMatcher.atom_id(), &data);
- VLOG("pulled %zu atoms", data.size());
- if (data.size() > 0) {
- writeToOutputLocked(data, pullInfo.mPullerMatcher);
- }
- pullInfo.mPrevPullElapsedRealtimeMs = nowMillis;
+ int64_t nowMillis = getElapsedRealtimeMillis();
+ for (auto& pullInfo : mSubscriptionInfo->mPulledInfo) {
+ if (pullInfo.mPrevPullElapsedRealtimeMs + pullInfo.mInterval < nowMillis) {
+ vector<std::shared_ptr<LogEvent>> data;
+ mPullerMgr->Pull(pullInfo.mPullerMatcher.atom_id(), &data);
+ VLOG("pulled %zu atoms with id %d", data.size(), pullInfo.mPullerMatcher.atom_id());
+
+ // TODO(b/150969574): Don't write to a pipe while holding a lock.
+ if (!writePulledAtomsLocked(data, pullInfo.mPullerMatcher)) {
+ mSubscriptionInfo->mClientAlive = false;
+ mSubscriptionShouldEnd.notify_one();
+ return;
}
+ pullInfo.mPrevPullElapsedRealtimeMs = nowMillis;
}
}
- VLOG("Pulling thread %lld sleep....", (long long)token);
- std::this_thread::sleep_for(std::chrono::milliseconds(intervalMillis));
+
+ VLOG("Pulling thread %lld sleep....", (long long)myToken);
+ std::this_thread::sleep_for(std::chrono::milliseconds(mSubscriptionInfo->mPullIntervalMin));
}
}
-// Must be called with the lock acquired, so that mProto isn't being written to
-// at the same time by multiple threads.
-void ShellSubscriber::writeToOutputLocked(const vector<std::shared_ptr<LogEvent>>& data,
- const SimpleAtomMatcher& matcher) {
- if (mOutput < 0) {
- return;
- }
- int count = 0;
+// \return boolean indicating if writes were successful (will return false if
+// client dies)
+bool ShellSubscriber::writePulledAtomsLocked(const vector<std::shared_ptr<LogEvent>>& data,
+ const SimpleAtomMatcher& matcher) {
mProto.clear();
+ int count = 0;
for (const auto& event : data) {
VLOG("%s", event->ToString().c_str());
if (matchesSimple(*mUidMap, matcher, *event)) {
- VLOG("matched");
count++;
uint64_t atomToken = mProto.start(util::FIELD_TYPE_MESSAGE |
util::FIELD_COUNT_REPEATED | FIELD_ID_ATOM);
@@ -189,24 +165,29 @@
if (count > 0) {
// First write the payload size.
size_t bufferSize = mProto.size();
- write(mOutput, &bufferSize, sizeof(bufferSize));
+ if (!android::base::WriteFully(mSubscriptionInfo->mOutputFd, &bufferSize,
+ sizeof(bufferSize))) {
+ return false;
+ }
VLOG("%d atoms, proto size: %zu", count, bufferSize);
// Then write the payload.
- mProto.flush(mOutput);
+ if (!mProto.flush(mSubscriptionInfo->mOutputFd)) {
+ return false;
+ }
}
+
+ return true;
}
void ShellSubscriber::onLogEvent(const LogEvent& event) {
- // Acquire a lock to prevent corruption from multiple threads writing to
- // mProto.
std::lock_guard<std::mutex> lock(mMutex);
- if (mOutput < 0) {
+ if (!mSubscriptionInfo) {
return;
}
mProto.clear();
- for (const auto& matcher : mPushedMatchers) {
+ for (const auto& matcher : mSubscriptionInfo->mPushedMatchers) {
if (matchesSimple(*mUidMap, matcher, event)) {
VLOG("%s", event.ToString().c_str());
uint64_t atomToken = mProto.start(util::FIELD_TYPE_MESSAGE |
@@ -216,26 +197,23 @@
// First write the payload size.
size_t bufferSize = mProto.size();
- write(mOutput, &bufferSize, sizeof(bufferSize));
+ if (!android::base::WriteFully(mSubscriptionInfo->mOutputFd, &bufferSize,
+ sizeof(bufferSize))) {
+ mSubscriptionInfo->mClientAlive = false;
+ mSubscriptionShouldEnd.notify_one();
+ return;
+ }
// Then write the payload.
- mProto.flush(mOutput);
+ if (!mProto.flush(mSubscriptionInfo->mOutputFd)) {
+ mSubscriptionInfo->mClientAlive = false;
+ mSubscriptionShouldEnd.notify_one();
+ return;
+ }
}
}
}
-void ShellSubscriber::cleanUpLocked() {
- // The file descriptors will be closed by binder.
- mInput = -1;
- mOutput = -1;
- mSubscriberId = 0;
- mPushedMatchers.clear();
- mPulledInfo.clear();
- // Setting mPullToken == 0 tells pull thread that its work is done.
- mPullToken = 0;
- VLOG("done clean up");
-}
-
} // namespace statsd
} // namespace os
} // namespace android
diff --git a/cmds/statsd/src/shell/ShellSubscriber.h b/cmds/statsd/src/shell/ShellSubscriber.h
index eaf2ad1..7fd625e 100644
--- a/cmds/statsd/src/shell/ShellSubscriber.h
+++ b/cmds/statsd/src/shell/ShellSubscriber.h
@@ -60,9 +60,6 @@
ShellSubscriber(sp<UidMap> uidMap, sp<StatsPullerManager> pullerMgr)
: mUidMap(uidMap), mPullerMgr(pullerMgr){};
- /**
- * Start a new subscription.
- */
void startNewSubscription(int inFd, int outFd, int timeoutSec);
void onLogEvent(const LogEvent& event);
@@ -76,16 +73,28 @@
int64_t mInterval;
int64_t mPrevPullElapsedRealtimeMs;
};
- bool readConfig();
- void updateConfig(const ShellSubscription& config);
+ struct SubscriptionInfo {
+ SubscriptionInfo(const int& inputFd, const int& outputFd)
+ : mInputFd(inputFd), mOutputFd(outputFd), mClientAlive(true) {
+ }
- void startPull(int64_t token, int64_t intervalMillis);
+ int mInputFd;
+ int mOutputFd;
+ std::vector<SimpleAtomMatcher> mPushedMatchers;
+ std::vector<PullInfo> mPulledInfo;
+ int mPullIntervalMin;
+ bool mClientAlive;
+ };
- void cleanUpLocked();
+ int claimToken();
- void writeToOutputLocked(const vector<std::shared_ptr<LogEvent>>& data,
- const SimpleAtomMatcher& matcher);
+ bool readConfig(std::shared_ptr<SubscriptionInfo> subscriptionInfo);
+
+ void startPull(int64_t myToken);
+
+ bool writePulledAtomsLocked(const vector<std::shared_ptr<LogEvent>>& data,
+ const SimpleAtomMatcher& matcher);
sp<UidMap> mUidMap;
@@ -95,19 +104,11 @@
mutable std::mutex mMutex;
- std::condition_variable mShellDied; // semaphore for waiting until shell exits.
+ std::condition_variable mSubscriptionShouldEnd;
- int mInput = -1; // The input file descriptor
+ std::shared_ptr<SubscriptionInfo> mSubscriptionInfo = nullptr;
- int mOutput = -1; // The output file descriptor
-
- std::vector<SimpleAtomMatcher> mPushedMatchers;
-
- std::vector<PullInfo> mPulledInfo;
-
- int64_t mSubscriberId = 0; // A unique id to identify a subscriber.
-
- int64_t mPullToken = 0; // A unique token to identify a puller thread.
+ int mToken;
};
} // namespace statsd
diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp
index 3d02ffb..77a3eb3 100644
--- a/cmds/statsd/src/stats_log_util.cpp
+++ b/cmds/statsd/src/stats_log_util.cpp
@@ -357,30 +357,7 @@
protoOutput->write(FIELD_TYPE_FLOAT | fieldNum, dim.mValue.float_value);
break;
case STRING: {
- bool isBytesField = false;
- // Bytes field is logged via string format in log_msg format. So here we check
- // if this string field is a byte field.
- std::map<int, std::vector<int>>::const_iterator itr;
- if (depth == 0 && (itr = AtomsInfo::kBytesFieldAtoms.find(tagId)) !=
- AtomsInfo::kBytesFieldAtoms.end()) {
- const std::vector<int>& bytesFields = itr->second;
- for (int bytesField : bytesFields) {
- if (bytesField == fieldNum) {
- // This is a bytes field
- isBytesField = true;
- break;
- }
- }
- }
- if (isBytesField) {
- if (dim.mValue.str_value.length() > 0) {
- protoOutput->write(FIELD_TYPE_MESSAGE | fieldNum,
- (const char*)dim.mValue.str_value.c_str(),
- dim.mValue.str_value.length());
- }
- } else {
- protoOutput->write(FIELD_TYPE_STRING | fieldNum, dim.mValue.str_value);
- }
+ protoOutput->write(FIELD_TYPE_STRING | fieldNum, dim.mValue.str_value);
break;
}
case STORAGE:
diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
index 14b191e..ae6769e 100644
--- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
@@ -3155,1025 +3155,902 @@
EXPECT_EQ(NanoToMillis(dumpReportTimeNs), dropEvent.drop_time_millis());
}
-///*
-// * Test that MULTIPLE_BUCKETS_SKIPPED dump reason is logged when a log event
-// * skips over more than one bucket.
-// */
-// TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenMultipleBucketsSkipped) {
-// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition();
-//
-// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
-// EXPECT_CALL(*pullerManager, Pull(tagId, _))
-// // Condition change to true.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
-// event->write("field1");
-// event->write(10);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Dump report requested.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event =
-// make_shared<LogEvent>(tagId, bucket4StartTimeNs + 1000);
-// event->write("field1");
-// event->write(15);
-// event->init();
-// data->push_back(event);
-// return true;
-// }));
-//
-// sp<ValueMetricProducer> valueProducer =
-// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager,
-// metric);
-//
-// // Condition change event.
-// valueProducer->onConditionChanged(true, bucketStartTimeNs + 10);
-//
-// // Condition change event that skips forward by three buckets.
-// valueProducer->onConditionChanged(false, bucket4StartTimeNs + 10);
-//
-// // Check dump report.
-// ProtoOutputStream output;
-// std::set<string> strSet;
-// valueProducer->onDumpReport(bucket4StartTimeNs + 1000, true /* include recent buckets */,
-// true,
-// NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output);
-//
-// StatsLogReport report = outputStreamToProto(&output);
-// EXPECT_TRUE(report.has_value_metrics());
-// EXPECT_EQ(0, report.value_metrics().data_size());
-// EXPECT_EQ(1, report.value_metrics().skipped_size());
-//
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs),
-// report.value_metrics().skipped(0).start_bucket_elapsed_millis());
-// EXPECT_EQ(NanoToMillis(bucket2StartTimeNs),
-// report.value_metrics().skipped(0).end_bucket_elapsed_millis());
-// EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size());
-//
-// auto dropEvent = report.value_metrics().skipped(0).drop_event(0);
-// EXPECT_EQ(BucketDropReason::MULTIPLE_BUCKETS_SKIPPED, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(bucket4StartTimeNs + 10), dropEvent.drop_time_millis());
-//}
-//
-///*
-// * Test that BUCKET_TOO_SMALL dump reason is logged when a flushed bucket size
-// * is smaller than the "min_bucket_size_nanos" specified in the metric config.
-// */
-// TEST(ValueMetricProducerTest_BucketDrop, TestBucketDropWhenBucketTooSmall) {
-// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition();
-// metric.set_min_bucket_size_nanos(10000000000); // 10 seconds
-//
-// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
-// EXPECT_CALL(*pullerManager, Pull(tagId, _))
-// // Condition change to true.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
-// event->write("field1");
-// event->write(10);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Dump report requested.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event =
-// make_shared<LogEvent>(tagId, bucketStartTimeNs + 9000000);
-// event->write("field1");
-// event->write(15);
-// event->init();
-// data->push_back(event);
-// return true;
-// }));
-//
-// sp<ValueMetricProducer> valueProducer =
-// ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager,
-// metric);
-//
-// // Condition change event.
-// valueProducer->onConditionChanged(true, bucketStartTimeNs + 10);
-//
-// // Check dump report.
-// ProtoOutputStream output;
-// std::set<string> strSet;
-// int64_t dumpReportTimeNs = bucketStartTimeNs + 9000000;
-// valueProducer->onDumpReport(dumpReportTimeNs, true /* include recent buckets */, true,
-// NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output);
-//
-// StatsLogReport report = outputStreamToProto(&output);
-// EXPECT_TRUE(report.has_value_metrics());
-// EXPECT_EQ(0, report.value_metrics().data_size());
-// EXPECT_EQ(1, report.value_metrics().skipped_size());
-//
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs),
-// report.value_metrics().skipped(0).start_bucket_elapsed_millis());
-// EXPECT_EQ(NanoToMillis(dumpReportTimeNs),
-// report.value_metrics().skipped(0).end_bucket_elapsed_millis());
-// EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size());
-//
-// auto dropEvent = report.value_metrics().skipped(0).drop_event(0);
-// EXPECT_EQ(BucketDropReason::BUCKET_TOO_SMALL, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(dumpReportTimeNs), dropEvent.drop_time_millis());
-//}
-//
-///*
-// * Test multiple bucket drop events in the same bucket.
-// */
-// TEST(ValueMetricProducerTest_BucketDrop, TestMultipleBucketDropEvents) {
-// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition();
-//
-// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
-// EXPECT_CALL(*pullerManager, Pull(tagId, _))
-// // Condition change to true.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
-// event->write("field1");
-// event->write(10);
-// event->init();
-// data->push_back(event);
-// return true;
-// }));
-//
-// sp<ValueMetricProducer> valueProducer =
-// ValueMetricProducerTestHelper::createValueProducerWithNoInitialCondition(pullerManager,
-// metric);
-//
-// // Condition change event.
-// valueProducer->onConditionChanged(true, bucketStartTimeNs + 10);
-//
-// // Check dump report.
-// ProtoOutputStream output;
-// std::set<string> strSet;
-// int64_t dumpReportTimeNs = bucketStartTimeNs + 1000;
-// valueProducer->onDumpReport(dumpReportTimeNs, true /* include recent buckets */, true,
-// FAST /* dumpLatency */, &strSet, &output);
-//
-// StatsLogReport report = outputStreamToProto(&output);
-// EXPECT_TRUE(report.has_value_metrics());
-// EXPECT_EQ(0, report.value_metrics().data_size());
-// EXPECT_EQ(1, report.value_metrics().skipped_size());
-//
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs),
-// report.value_metrics().skipped(0).start_bucket_elapsed_millis());
-// EXPECT_EQ(NanoToMillis(dumpReportTimeNs),
-// report.value_metrics().skipped(0).end_bucket_elapsed_millis());
-// EXPECT_EQ(2, report.value_metrics().skipped(0).drop_event_size());
-//
-// auto dropEvent = report.value_metrics().skipped(0).drop_event(0);
-// EXPECT_EQ(BucketDropReason::CONDITION_UNKNOWN, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 10), dropEvent.drop_time_millis());
-//
-// dropEvent = report.value_metrics().skipped(0).drop_event(1);
-// EXPECT_EQ(BucketDropReason::DUMP_REPORT_REQUESTED, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(dumpReportTimeNs), dropEvent.drop_time_millis());
-//}
-//
-///*
-// * Test that the number of logged bucket drop events is capped at the maximum.
-// * The maximum is currently 10 and is set in MetricProducer::maxDropEventsReached().
-// */
-// TEST(ValueMetricProducerTest_BucketDrop, TestMaxBucketDropEvents) {
-// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition();
-//
-// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
-// EXPECT_CALL(*pullerManager, Pull(tagId, _))
-// // First condition change event.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// for (int i = 0; i < 2000; i++) {
-// shared_ptr<LogEvent> event =
-// make_shared<LogEvent>(tagId, bucketStartTimeNs + 1);
-// event->write(i);
-// event->write(i);
-// event->init();
-// data->push_back(event);
-// }
-// return true;
-// }))
-// .WillOnce(Return(false))
-// .WillOnce(Return(false))
-// .WillOnce(Return(false))
-// .WillOnce(Return(false))
-// .WillOnce(Return(false))
-// .WillOnce(Return(false))
-// .WillOnce(Return(false))
-// .WillOnce(Return(false))
-// .WillOnce(Return(false))
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs +
-// 220); event->write("field1"); event->write(10); event->init();
-// data->push_back(event);
-// return true;
-// }));
-//
-// sp<ValueMetricProducer> valueProducer =
-// ValueMetricProducerTestHelper::createValueProducerWithNoInitialCondition(pullerManager,
-// metric);
-//
-// // First condition change event causes guardrail to be reached.
-// valueProducer->onConditionChanged(true, bucketStartTimeNs + 10);
-//
-// // 2-10 condition change events result in failed pulls.
-// valueProducer->onConditionChanged(false, bucketStartTimeNs + 30);
-// valueProducer->onConditionChanged(true, bucketStartTimeNs + 50);
-// valueProducer->onConditionChanged(false, bucketStartTimeNs + 70);
-// valueProducer->onConditionChanged(true, bucketStartTimeNs + 90);
-// valueProducer->onConditionChanged(false, bucketStartTimeNs + 100);
-// valueProducer->onConditionChanged(true, bucketStartTimeNs + 150);
-// valueProducer->onConditionChanged(false, bucketStartTimeNs + 170);
-// valueProducer->onConditionChanged(true, bucketStartTimeNs + 190);
-// valueProducer->onConditionChanged(false, bucketStartTimeNs + 200);
-//
-// // Condition change event 11
-// valueProducer->onConditionChanged(true, bucketStartTimeNs + 220);
-//
-// // Check dump report.
-// ProtoOutputStream output;
-// std::set<string> strSet;
-// int64_t dumpReportTimeNs = bucketStartTimeNs + 1000;
-// // Because we already have 10 dump events in the current bucket,
-// // this case should not be added to the list of dump events.
-// valueProducer->onDumpReport(bucketStartTimeNs + 1000, true /* include recent buckets */, true,
-// FAST /* dumpLatency */, &strSet, &output);
-//
-// StatsLogReport report = outputStreamToProto(&output);
-// EXPECT_TRUE(report.has_value_metrics());
-// EXPECT_EQ(0, report.value_metrics().data_size());
-// EXPECT_EQ(1, report.value_metrics().skipped_size());
-//
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs),
-// report.value_metrics().skipped(0).start_bucket_elapsed_millis());
-// EXPECT_EQ(NanoToMillis(dumpReportTimeNs),
-// report.value_metrics().skipped(0).end_bucket_elapsed_millis());
-// EXPECT_EQ(10, report.value_metrics().skipped(0).drop_event_size());
-//
-// auto dropEvent = report.value_metrics().skipped(0).drop_event(0);
-// EXPECT_EQ(BucketDropReason::CONDITION_UNKNOWN, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 10), dropEvent.drop_time_millis());
-//
-// dropEvent = report.value_metrics().skipped(0).drop_event(1);
-// EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 30), dropEvent.drop_time_millis());
-//
-// dropEvent = report.value_metrics().skipped(0).drop_event(2);
-// EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 50), dropEvent.drop_time_millis());
-//
-// dropEvent = report.value_metrics().skipped(0).drop_event(3);
-// EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 70), dropEvent.drop_time_millis());
-//
-// dropEvent = report.value_metrics().skipped(0).drop_event(4);
-// EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 90), dropEvent.drop_time_millis());
-//
-// dropEvent = report.value_metrics().skipped(0).drop_event(5);
-// EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 100), dropEvent.drop_time_millis());
-//
-// dropEvent = report.value_metrics().skipped(0).drop_event(6);
-// EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 150), dropEvent.drop_time_millis());
-//
-// dropEvent = report.value_metrics().skipped(0).drop_event(7);
-// EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 170), dropEvent.drop_time_millis());
-//
-// dropEvent = report.value_metrics().skipped(0).drop_event(8);
-// EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 190), dropEvent.drop_time_millis());
-//
-// dropEvent = report.value_metrics().skipped(0).drop_event(9);
-// EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
-// EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 200), dropEvent.drop_time_millis());
-//}
-//
-///*
-// * Test metric with a simple sliced state
-// * - Increasing values
-// * - Using diff
-// * - Second field is value field
-// */
-// TEST(ValueMetricProducerTest, TestSlicedState) {
-// // Set up ValueMetricProducer.
-// ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithState("SCREEN_STATE");
-// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
-// EXPECT_CALL(*pullerManager, Pull(tagId, _))
-// // ValueMetricProducer initialized.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs);
-// event->write("field1");
-// event->write(3);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Screen state change to ON.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 5);
-// event->write("field1");
-// event->write(5);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Screen state change to OFF.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
-// event->write("field1");
-// event->write(9);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Screen state change to ON.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 15);
-// event->write("field1");
-// event->write(21);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Dump report requested.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 50);
-// event->write("field1");
-// event->write(30);
-// event->init();
-// data->push_back(event);
-// return true;
-// }));
-//
-// sp<ValueMetricProducer> valueProducer =
-// ValueMetricProducerTestHelper::createValueProducerWithState(
-// pullerManager, metric, {util::SCREEN_STATE_CHANGED}, {});
-//
-// // Set up StateManager and check that StateTrackers are initialized.
-// StateManager::getInstance().clear();
-// StateManager::getInstance().registerListener(SCREEN_STATE_ATOM_ID, valueProducer);
-// EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount());
-// EXPECT_EQ(1, StateManager::getInstance().getListenersCount(SCREEN_STATE_ATOM_ID));
-//
-// // Bucket status after metric initialized.
-// EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size());
-// // Base for dimension key {}
-// auto it = valueProducer->mCurrentSlicedBucket.begin();
-// auto itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(3, itBase->second[0].base.long_value);
-// // Value for dimension, state key {{}, kStateUnknown}
-// EXPECT_EQ(false, it->second[0].hasValue);
-//
-// // Bucket status after screen state change kStateUnknown->ON.
-// auto screenEvent = CreateScreenStateChangedEvent(
-// android::view::DisplayStateEnum::DISPLAY_STATE_ON, bucketStartTimeNs + 5);
-// StateManager::getInstance().onLogEvent(*screenEvent);
-// EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size());
-// // Base for dimension key {}
-// it = valueProducer->mCurrentSlicedBucket.begin();
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(5, itBase->second[0].base.long_value);
-// // Value for dimension, state key {{}, kStateUnknown}
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(2, it->second[0].value.long_value);
-//
-// // Bucket status after screen state change ON->OFF.
-// screenEvent =
-// CreateScreenStateChangedEvent(android::view::DisplayStateEnum::DISPLAY_STATE_OFF,
-// bucketStartTimeNs + 10);
-// StateManager::getInstance().onLogEvent(*screenEvent);
-// EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size());
-// // Base for dimension key {}
-// it = valueProducer->mCurrentSlicedBucket.begin();
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(9, itBase->second[0].base.long_value);
-// // Value for dimension, state key {{}, ON}
-// EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
-// it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(4, it->second[0].value.long_value);
-// // Value for dimension, state key {{}, kStateUnknown}
-// it++;
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(2, it->second[0].value.long_value);
-//
-// // Bucket status after screen state change OFF->ON.
-// screenEvent = CreateScreenStateChangedEvent(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
-// bucketStartTimeNs + 15);
-// StateManager::getInstance().onLogEvent(*screenEvent);
-// EXPECT_EQ(3UL, valueProducer->mCurrentSlicedBucket.size());
-// // Base for dimension key {}
-// it = valueProducer->mCurrentSlicedBucket.begin();
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(21, itBase->second[0].base.long_value);
-// // Value for dimension, state key {{}, OFF}
-// EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_OFF,
-// it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(12, it->second[0].value.long_value);
-// // Value for dimension, state key {{}, ON}
-// it++;
-// EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
-// it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(4, it->second[0].value.long_value);
-// // Value for dimension, state key {{}, kStateUnknown}
-// it++;
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(2, it->second[0].value.long_value);
-//
-// // Start dump report and check output.
-// ProtoOutputStream output;
-// std::set<string> strSet;
-// valueProducer->onDumpReport(bucketStartTimeNs + 50, true /* include recent buckets */, true,
-// NO_TIME_CONSTRAINTS, &strSet, &output);
-//
-// StatsLogReport report = outputStreamToProto(&output);
-// EXPECT_TRUE(report.has_value_metrics());
-// EXPECT_EQ(3, report.value_metrics().data_size());
-//
-// auto data = report.value_metrics().data(0);
-// EXPECT_EQ(1, data.bucket_info_size());
-// EXPECT_EQ(2, report.value_metrics().data(0).bucket_info(0).values(0).value_long());
-//
-// data = report.value_metrics().data(1);
-// EXPECT_EQ(1, report.value_metrics().data(1).bucket_info_size());
-// EXPECT_EQ(13, report.value_metrics().data(1).bucket_info(0).values(0).value_long());
-// EXPECT_EQ(SCREEN_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
-// EXPECT_TRUE(data.slice_by_state(0).has_value());
-// EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON, data.slice_by_state(0).value());
-//
-// data = report.value_metrics().data(2);
-// EXPECT_EQ(1, report.value_metrics().data(2).bucket_info_size());
-// EXPECT_EQ(12, report.value_metrics().data(2).bucket_info(0).values(0).value_long());
-// EXPECT_EQ(SCREEN_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
-// EXPECT_TRUE(data.slice_by_state(0).has_value());
-// EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_OFF, data.slice_by_state(0).value());
-//}
-//
-///*
-// * Test metric with sliced state with map
-// * - Increasing values
-// * - Using diff
-// * - Second field is value field
-// */
-// TEST(ValueMetricProducerTest, TestSlicedStateWithMap) {
-// // Set up ValueMetricProducer.
-// ValueMetric metric =
-// ValueMetricProducerTestHelper::createMetricWithState("SCREEN_STATE_ONOFF");
-// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
-// EXPECT_CALL(*pullerManager, Pull(tagId, _))
-// // ValueMetricProducer initialized.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs);
-// event->write("field1");
-// event->write(3);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Screen state change to ON.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 5);
-// event->write("field1");
-// event->write(5);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Screen state change to VR.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 10);
-// event->write("field1");
-// event->write(9);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Screen state change to OFF.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 15);
-// event->write("field1");
-// event->write(21);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Dump report requested.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 50);
-// event->write("field1");
-// event->write(30);
-// event->init();
-// data->push_back(event);
-// return true;
-// }));
-//
-// const StateMap& stateMap = CreateScreenStateOnOffMap();
-// const StateMap_StateGroup screenOnGroup = stateMap.group(0);
-// const StateMap_StateGroup screenOffGroup = stateMap.group(1);
-//
-// unordered_map<int, unordered_map<int, int64_t>> stateGroupMap;
-// for (auto group : stateMap.group()) {
-// for (auto value : group.value()) {
-// stateGroupMap[SCREEN_STATE_ATOM_ID][value] = group.group_id();
-// }
-// }
-//
-// sp<ValueMetricProducer> valueProducer =
-// ValueMetricProducerTestHelper::createValueProducerWithState(
-// pullerManager, metric, {util::SCREEN_STATE_CHANGED}, stateGroupMap);
-//
-// // Set up StateManager and check that StateTrackers are initialized.
-// StateManager::getInstance().clear();
-// StateManager::getInstance().registerListener(SCREEN_STATE_ATOM_ID, valueProducer);
-// EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount());
-// EXPECT_EQ(1, StateManager::getInstance().getListenersCount(SCREEN_STATE_ATOM_ID));
-//
-// // Bucket status after metric initialized.
-// EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size());
-// // Base for dimension key {}
-// auto it = valueProducer->mCurrentSlicedBucket.begin();
-// auto itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(3, itBase->second[0].base.long_value);
-// // Value for dimension, state key {{}, {}}
-// EXPECT_EQ(false, it->second[0].hasValue);
-//
-// // Bucket status after screen state change kStateUnknown->ON.
-// auto screenEvent = CreateScreenStateChangedEvent(
-// android::view::DisplayStateEnum::DISPLAY_STATE_ON, bucketStartTimeNs + 5);
-// StateManager::getInstance().onLogEvent(*screenEvent);
-// EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size());
-// // Base for dimension key {}
-// it = valueProducer->mCurrentSlicedBucket.begin();
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(5, itBase->second[0].base.long_value);
-// // Value for dimension, state key {{}, kStateUnknown}
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(2, it->second[0].value.long_value);
-//
-// // Bucket status after screen state change ON->VR (also ON).
-// screenEvent = CreateScreenStateChangedEvent(android::view::DisplayStateEnum::DISPLAY_STATE_VR,
-// bucketStartTimeNs + 10);
-// StateManager::getInstance().onLogEvent(*screenEvent);
-// EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size());
-// // Base for dimension key {}
-// it = valueProducer->mCurrentSlicedBucket.begin();
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(9, itBase->second[0].base.long_value);
-// // Value for dimension, state key {{}, ON GROUP}
-// EXPECT_EQ(screenOnGroup.group_id(),
-// it->first.getStateValuesKey().getValues()[0].mValue.long_value);
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(4, it->second[0].value.long_value);
-// // Value for dimension, state key {{}, kStateUnknown}
-// it++;
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(2, it->second[0].value.long_value);
-//
-// // Bucket status after screen state change VR->OFF.
-// screenEvent =
-// CreateScreenStateChangedEvent(android::view::DisplayStateEnum::DISPLAY_STATE_OFF,
-// bucketStartTimeNs + 15);
-// StateManager::getInstance().onLogEvent(*screenEvent);
-// EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size());
-// // Base for dimension key {}
-// it = valueProducer->mCurrentSlicedBucket.begin();
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(21, itBase->second[0].base.long_value);
-// // Value for dimension, state key {{}, ON GROUP}
-// EXPECT_EQ(screenOnGroup.group_id(),
-// it->first.getStateValuesKey().getValues()[0].mValue.long_value);
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(16, it->second[0].value.long_value);
-// // Value for dimension, state key {{}, kStateUnknown}
-// it++;
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(2, it->second[0].value.long_value);
-//
-// // Start dump report and check output.
-// ProtoOutputStream output;
-// std::set<string> strSet;
-// valueProducer->onDumpReport(bucketStartTimeNs + 50, true /* include recent buckets */, true,
-// NO_TIME_CONSTRAINTS, &strSet, &output);
-//
-// StatsLogReport report = outputStreamToProto(&output);
-// EXPECT_TRUE(report.has_value_metrics());
-// EXPECT_EQ(3, report.value_metrics().data_size());
-//
-// auto data = report.value_metrics().data(0);
-// EXPECT_EQ(1, data.bucket_info_size());
-// EXPECT_EQ(2, report.value_metrics().data(0).bucket_info(0).values(0).value_long());
-//
-// data = report.value_metrics().data(1);
-// EXPECT_EQ(1, report.value_metrics().data(1).bucket_info_size());
-// EXPECT_EQ(16, report.value_metrics().data(1).bucket_info(0).values(0).value_long());
-// EXPECT_EQ(SCREEN_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
-// EXPECT_TRUE(data.slice_by_state(0).has_group_id());
-// EXPECT_EQ(screenOnGroup.group_id(), data.slice_by_state(0).group_id());
-//
-// data = report.value_metrics().data(2);
-// EXPECT_EQ(1, report.value_metrics().data(2).bucket_info_size());
-// EXPECT_EQ(9, report.value_metrics().data(2).bucket_info(0).values(0).value_long());
-// EXPECT_EQ(SCREEN_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
-// EXPECT_TRUE(data.slice_by_state(0).has_group_id());
-// EXPECT_EQ(screenOffGroup.group_id(), data.slice_by_state(0).group_id());
-//}
-//
-///*
-// * Test metric that slices by state with a primary field and has dimensions
-// * - Increasing values
-// * - Using diff
-// * - Second field is value field
-// */
-// TEST(ValueMetricProducerTest, TestSlicedStateWithPrimaryField_WithDimensions) {
-// // Set up ValueMetricProducer.
-// ValueMetric metric =
-// ValueMetricProducerTestHelper::createMetricWithState("UID_PROCESS_STATE");
-// metric.mutable_dimensions_in_what()->set_field(tagId);
-// metric.mutable_dimensions_in_what()->add_child()->set_field(1);
-//
-// MetricStateLink* stateLink = metric.add_state_link();
-// stateLink->set_state_atom_id(UID_PROCESS_STATE_ATOM_ID);
-// auto fieldsInWhat = stateLink->mutable_fields_in_what();
-// *fieldsInWhat = CreateDimensions(tagId, {1 /* uid */});
-// auto fieldsInState = stateLink->mutable_fields_in_state();
-// *fieldsInState = CreateDimensions(UID_PROCESS_STATE_ATOM_ID, {1 /* uid */});
-//
-// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
-// EXPECT_CALL(*pullerManager, Pull(tagId, _))
-// // ValueMetricProducer initialized.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs);
-// event->write(2 /* uid */);
-// event->write(7);
-// event->init();
-// data->push_back(event);
-//
-// event = make_shared<LogEvent>(tagId, bucketStartTimeNs);
-// event->write(1 /* uid */);
-// event->write(3);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Uid 1 process state change from kStateUnknown -> Foreground
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 20);
-// event->write(1 /* uid */);
-// event->write(6);
-// event->init();
-// data->push_back(event);
-//
-// // This event should be skipped.
-// event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 20);
-// event->write(2 /* uid */);
-// event->write(8);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Uid 2 process state change from kStateUnknown -> Background
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 40);
-// event->write(2 /* uid */);
-// event->write(9);
-// event->init();
-// data->push_back(event);
-//
-// // This event should be skipped.
-// event = make_shared<LogEvent>(tagId, bucketStartTimeNs + 40);
-// event->write(1 /* uid */);
-// event->write(12);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Uid 1 process state change from Foreground -> Background
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs +
-// 20); event->write(1 /* uid */); event->write(13); event->init();
-// data->push_back(event);
-//
-// // This event should be skipped.
-// event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 20);
-// event->write(2 /* uid */);
-// event->write(11);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Uid 1 process state change from Background -> Foreground
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs +
-// 40); event->write(1 /* uid */); event->write(17); event->init();
-// data->push_back(event);
-//
-// // This event should be skipped.
-// event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 40);
-// event->write(2 /* uid */);
-// event->write(15);
-// event->init();
-// data->push_back(event);
-// return true;
-// }))
-// // Dump report pull.
-// .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs +
-// 50); event->write(2 /* uid */); event->write(20); event->init();
-// data->push_back(event);
-//
-// event = make_shared<LogEvent>(tagId, bucket2StartTimeNs + 50);
-// event->write(1 /* uid */);
-// event->write(21);
-// event->init();
-// data->push_back(event);
-// return true;
-// }));
-//
-// sp<ValueMetricProducer> valueProducer =
-// ValueMetricProducerTestHelper::createValueProducerWithState(
-// pullerManager, metric, {UID_PROCESS_STATE_ATOM_ID}, {});
-//
-// // Set up StateManager and check that StateTrackers are initialized.
-// StateManager::getInstance().clear();
-// StateManager::getInstance().registerListener(UID_PROCESS_STATE_ATOM_ID, valueProducer);
-// EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount());
-// EXPECT_EQ(1, StateManager::getInstance().getListenersCount(UID_PROCESS_STATE_ATOM_ID));
-//
-// // Bucket status after metric initialized.
-// EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size());
-// // Base for dimension key {uid 1}.
-// auto it = valueProducer->mCurrentSlicedBucket.begin();
-// EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// auto itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(3, itBase->second[0].base.long_value);
-// // Value for dimension, state key {{uid 1}, kStateUnknown}
-// // TODO(tsaichristine): test equality of state values key
-// // EXPECT_EQ(-1, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(false, it->second[0].hasValue);
-// // Base for dimension key {uid 2}
-// it++;
-// EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(7, itBase->second[0].base.long_value);
-// // Value for dimension, state key {{uid 2}, kStateUnknown}
-// // EXPECT_EQ(-1, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(false, it->second[0].hasValue);
-//
-// // Bucket status after uid 1 process state change kStateUnknown -> Foreground.
-// auto uidProcessEvent = CreateUidProcessStateChangedEvent(
-// 1 /* uid */, android::app::PROCESS_STATE_IMPORTANT_FOREGROUND, bucketStartTimeNs +
-// 20);
-// StateManager::getInstance().onLogEvent(*uidProcessEvent);
-// EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size());
-// // Base for dimension key {uid 1}.
-// it = valueProducer->mCurrentSlicedBucket.begin();
-// EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(6, itBase->second[0].base.long_value);
-// // Value for key {uid 1, kStateUnknown}.
-// // EXPECT_EQ(-1, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(3, it->second[0].value.long_value);
-//
-// // Base for dimension key {uid 2}
-// it++;
-// EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(7, itBase->second[0].base.long_value);
-// // Value for key {uid 2, kStateUnknown}
-// EXPECT_EQ(false, it->second[0].hasValue);
-//
-// // Bucket status after uid 2 process state change kStateUnknown -> Background.
-// uidProcessEvent = CreateUidProcessStateChangedEvent(
-// 2 /* uid */, android::app::PROCESS_STATE_IMPORTANT_BACKGROUND, bucketStartTimeNs +
-// 40);
-// StateManager::getInstance().onLogEvent(*uidProcessEvent);
-// EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size());
-// // Base for dimension key {uid 1}.
-// it = valueProducer->mCurrentSlicedBucket.begin();
-// EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(6, itBase->second[0].base.long_value);
-// // Value for key {uid 1, kStateUnknown}.
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(3, it->second[0].value.long_value);
-//
-// // Base for dimension key {uid 2}
-// it++;
-// EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(9, itBase->second[0].base.long_value);
-// // Value for key {uid 2, kStateUnknown}
-// // EXPECT_EQ(-1, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(2, it->second[0].value.long_value);
-//
-// // Pull at end of first bucket.
-// vector<shared_ptr<LogEvent>> allData;
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, bucket2StartTimeNs);
-// event->write(1 /* uid */);
-// event->write(10);
-// event->init();
-// allData.push_back(event);
-//
-// event = make_shared<LogEvent>(tagId, bucket2StartTimeNs);
-// event->write(2 /* uid */);
-// event->write(15);
-// event->init();
-// allData.push_back(event);
-//
-// valueProducer->onDataPulled(allData, /** succeeds */ true, bucket2StartTimeNs + 1);
-//
-// // Buckets flushed after end of first bucket.
-// // None of the buckets should have a value.
-// EXPECT_EQ(4UL, valueProducer->mCurrentSlicedBucket.size());
-// EXPECT_EQ(4UL, valueProducer->mPastBuckets.size());
-// EXPECT_EQ(2UL, valueProducer->mCurrentBaseInfo.size());
-// // Base for dimension key {uid 2}.
-// it = valueProducer->mCurrentSlicedBucket.begin();
-// EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(15, itBase->second[0].base.long_value);
-// // Value for key {uid 2, BACKGROUND}.
-// EXPECT_EQ(1, it->first.getStateValuesKey().getValues().size());
-// EXPECT_EQ(1006, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(false, it->second[0].hasValue);
-//
-// // Base for dimension key {uid 1}
-// it++;
-// EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(10, itBase->second[0].base.long_value);
-// // Value for key {uid 1, kStateUnknown}
-// EXPECT_EQ(0, it->first.getStateValuesKey().getValues().size());
-// // EXPECT_EQ(-1, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(false, it->second[0].hasValue);
-//
-// // Value for key {uid 1, FOREGROUND}
-// it++;
-// EXPECT_EQ(1, it->first.getStateValuesKey().getValues().size());
-// EXPECT_EQ(1005, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(false, it->second[0].hasValue);
-//
-// // Value for key {uid 2, kStateUnknown}
-// it++;
-// EXPECT_EQ(false, it->second[0].hasValue);
-//
-// // Bucket status after uid 1 process state change from Foreground -> Background.
-// uidProcessEvent = CreateUidProcessStateChangedEvent(
-// 1 /* uid */, android::app::PROCESS_STATE_IMPORTANT_BACKGROUND, bucket2StartTimeNs +
-// 20);
-// StateManager::getInstance().onLogEvent(*uidProcessEvent);
-//
-// EXPECT_EQ(4UL, valueProducer->mCurrentSlicedBucket.size());
-// EXPECT_EQ(4UL, valueProducer->mPastBuckets.size());
-// EXPECT_EQ(2UL, valueProducer->mCurrentBaseInfo.size());
-// // Base for dimension key {uid 2}.
-// it = valueProducer->mCurrentSlicedBucket.begin();
-// EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(15, itBase->second[0].base.long_value);
-// // Value for key {uid 2, BACKGROUND}.
-// EXPECT_EQ(false, it->second[0].hasValue);
-// // Base for dimension key {uid 1}
-// it++;
-// EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(13, itBase->second[0].base.long_value);
-// // Value for key {uid 1, kStateUnknown}
-// EXPECT_EQ(false, it->second[0].hasValue);
-// // Value for key {uid 1, FOREGROUND}
-// it++;
-// EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// EXPECT_EQ(1005, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(3, it->second[0].value.long_value);
-// // Value for key {uid 2, kStateUnknown}
-// it++;
-// EXPECT_EQ(false, it->second[0].hasValue);
-//
-// // Bucket status after uid 1 process state change Background->Foreground.
-// uidProcessEvent = CreateUidProcessStateChangedEvent(
-// 1 /* uid */, android::app::PROCESS_STATE_IMPORTANT_FOREGROUND, bucket2StartTimeNs +
-// 40);
-// StateManager::getInstance().onLogEvent(*uidProcessEvent);
-//
-// EXPECT_EQ(5UL, valueProducer->mCurrentSlicedBucket.size());
-// EXPECT_EQ(2UL, valueProducer->mCurrentBaseInfo.size());
-// // Base for dimension key {uid 2}
-// it = valueProducer->mCurrentSlicedBucket.begin();
-// EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(true, itBase->second[0].hasBase);
-// EXPECT_EQ(15, itBase->second[0].base.long_value);
-// EXPECT_EQ(false, it->second[0].hasValue);
-//
-// it++;
-// EXPECT_EQ(false, it->second[0].hasValue);
-//
-// // Base for dimension key {uid 1}
-// it++;
-// EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
-// itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
-// EXPECT_EQ(17, itBase->second[0].base.long_value);
-// // Value for key {uid 1, BACKGROUND}
-// EXPECT_EQ(1006, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(4, it->second[0].value.long_value);
-// // Value for key {uid 1, FOREGROUND}
-// it++;
-// EXPECT_EQ(1005, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
-// EXPECT_EQ(true, it->second[0].hasValue);
-// EXPECT_EQ(3, it->second[0].value.long_value);
-//
-// // Start dump report and check output.
-// ProtoOutputStream output;
-// std::set<string> strSet;
-// valueProducer->onDumpReport(bucket2StartTimeNs + 50, true /* include recent buckets */, true,
-// NO_TIME_CONSTRAINTS, &strSet, &output);
-//
-// StatsLogReport report = outputStreamToProto(&output);
-// EXPECT_TRUE(report.has_value_metrics());
-// EXPECT_EQ(5, report.value_metrics().data_size());
-//
-// auto data = report.value_metrics().data(0);
-// EXPECT_EQ(1, data.bucket_info_size());
-// EXPECT_EQ(4, report.value_metrics().data(0).bucket_info(0).values(0).value_long());
-// EXPECT_EQ(UID_PROCESS_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
-// EXPECT_TRUE(data.slice_by_state(0).has_value());
-// EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_IMPORTANT_BACKGROUND,
-// data.slice_by_state(0).value());
-//
-// data = report.value_metrics().data(1);
-// EXPECT_EQ(1, report.value_metrics().data(1).bucket_info_size());
-// EXPECT_EQ(2, report.value_metrics().data(1).bucket_info(0).values(0).value_long());
-//
-// data = report.value_metrics().data(2);
-// EXPECT_EQ(UID_PROCESS_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
-// EXPECT_TRUE(data.slice_by_state(0).has_value());
-// EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_IMPORTANT_FOREGROUND,
-// data.slice_by_state(0).value());
-// EXPECT_EQ(2, report.value_metrics().data(2).bucket_info_size());
-// EXPECT_EQ(4, report.value_metrics().data(2).bucket_info(0).values(0).value_long());
-// EXPECT_EQ(7, report.value_metrics().data(2).bucket_info(1).values(0).value_long());
-//
-// data = report.value_metrics().data(3);
-// EXPECT_EQ(1, report.value_metrics().data(3).bucket_info_size());
-// EXPECT_EQ(3, report.value_metrics().data(3).bucket_info(0).values(0).value_long());
-//
-// data = report.value_metrics().data(4);
-// EXPECT_EQ(UID_PROCESS_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
-// EXPECT_TRUE(data.slice_by_state(0).has_value());
-// EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_IMPORTANT_BACKGROUND,
-// data.slice_by_state(0).value());
-// EXPECT_EQ(2, report.value_metrics().data(4).bucket_info_size());
-// EXPECT_EQ(6, report.value_metrics().data(4).bucket_info(0).values(0).value_long());
-// EXPECT_EQ(5, report.value_metrics().data(4).bucket_info(1).values(0).value_long());
-//}
+/*
+ * Test that MULTIPLE_BUCKETS_SKIPPED dump reason is logged when a log event
+ * skips over more than one bucket.
+ */
+TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenMultipleBucketsSkipped) {
+ ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition();
+
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+ EXPECT_CALL(*pullerManager, Pull(tagId, _))
+ // Condition change to true.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 10, 10));
+ return true;
+ }))
+ // Dump report requested.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucket4StartTimeNs + 1000, 15));
+ return true;
+ }));
+
+ sp<ValueMetricProducer> valueProducer =
+ ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric);
+
+ // Condition change event.
+ valueProducer->onConditionChanged(true, bucketStartTimeNs + 10);
+
+ // Condition change event that skips forward by three buckets.
+ valueProducer->onConditionChanged(false, bucket4StartTimeNs + 10);
+
+ // Check dump report.
+ ProtoOutputStream output;
+ std::set<string> strSet;
+ valueProducer->onDumpReport(bucket4StartTimeNs + 1000, true /* include recent buckets */, true,
+ NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output);
+
+ StatsLogReport report = outputStreamToProto(&output);
+ EXPECT_TRUE(report.has_value_metrics());
+ EXPECT_EQ(0, report.value_metrics().data_size());
+ EXPECT_EQ(1, report.value_metrics().skipped_size());
+
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs),
+ report.value_metrics().skipped(0).start_bucket_elapsed_millis());
+ EXPECT_EQ(NanoToMillis(bucket2StartTimeNs),
+ report.value_metrics().skipped(0).end_bucket_elapsed_millis());
+ EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size());
+
+ auto dropEvent = report.value_metrics().skipped(0).drop_event(0);
+ EXPECT_EQ(BucketDropReason::MULTIPLE_BUCKETS_SKIPPED, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(bucket4StartTimeNs + 10), dropEvent.drop_time_millis());
+}
+
+/*
+ * Test that BUCKET_TOO_SMALL dump reason is logged when a flushed bucket size
+ * is smaller than the "min_bucket_size_nanos" specified in the metric config.
+ */
+TEST(ValueMetricProducerTest_BucketDrop, TestBucketDropWhenBucketTooSmall) {
+ ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition();
+ metric.set_min_bucket_size_nanos(10000000000); // 10 seconds
+
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+ EXPECT_CALL(*pullerManager, Pull(tagId, _))
+ // Condition change to true.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 10, 10));
+ return true;
+ }))
+ // Dump report requested.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(
+ CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 9000000, 15));
+ return true;
+ }));
+
+ sp<ValueMetricProducer> valueProducer =
+ ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric);
+
+ // Condition change event.
+ valueProducer->onConditionChanged(true, bucketStartTimeNs + 10);
+
+ // Check dump report.
+ ProtoOutputStream output;
+ std::set<string> strSet;
+ int64_t dumpReportTimeNs = bucketStartTimeNs + 9000000;
+ valueProducer->onDumpReport(dumpReportTimeNs, true /* include recent buckets */, true,
+ NO_TIME_CONSTRAINTS /* dumpLatency */, &strSet, &output);
+
+ StatsLogReport report = outputStreamToProto(&output);
+ EXPECT_TRUE(report.has_value_metrics());
+ EXPECT_EQ(0, report.value_metrics().data_size());
+ EXPECT_EQ(1, report.value_metrics().skipped_size());
+
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs),
+ report.value_metrics().skipped(0).start_bucket_elapsed_millis());
+ EXPECT_EQ(NanoToMillis(dumpReportTimeNs),
+ report.value_metrics().skipped(0).end_bucket_elapsed_millis());
+ EXPECT_EQ(1, report.value_metrics().skipped(0).drop_event_size());
+
+ auto dropEvent = report.value_metrics().skipped(0).drop_event(0);
+ EXPECT_EQ(BucketDropReason::BUCKET_TOO_SMALL, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(dumpReportTimeNs), dropEvent.drop_time_millis());
+}
+
+/*
+ * Test multiple bucket drop events in the same bucket.
+ */
+TEST(ValueMetricProducerTest_BucketDrop, TestMultipleBucketDropEvents) {
+ ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition();
+
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+ EXPECT_CALL(*pullerManager, Pull(tagId, _))
+ // Condition change to true.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 10, 10));
+ return true;
+ }));
+
+ sp<ValueMetricProducer> valueProducer =
+ ValueMetricProducerTestHelper::createValueProducerWithNoInitialCondition(pullerManager,
+ metric);
+
+ // Condition change event.
+ valueProducer->onConditionChanged(true, bucketStartTimeNs + 10);
+
+ // Check dump report.
+ ProtoOutputStream output;
+ std::set<string> strSet;
+ int64_t dumpReportTimeNs = bucketStartTimeNs + 1000;
+ valueProducer->onDumpReport(dumpReportTimeNs, true /* include recent buckets */, true,
+ FAST /* dumpLatency */, &strSet, &output);
+
+ StatsLogReport report = outputStreamToProto(&output);
+ EXPECT_TRUE(report.has_value_metrics());
+ EXPECT_EQ(0, report.value_metrics().data_size());
+ EXPECT_EQ(1, report.value_metrics().skipped_size());
+
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs),
+ report.value_metrics().skipped(0).start_bucket_elapsed_millis());
+ EXPECT_EQ(NanoToMillis(dumpReportTimeNs),
+ report.value_metrics().skipped(0).end_bucket_elapsed_millis());
+ EXPECT_EQ(2, report.value_metrics().skipped(0).drop_event_size());
+
+ auto dropEvent = report.value_metrics().skipped(0).drop_event(0);
+ EXPECT_EQ(BucketDropReason::CONDITION_UNKNOWN, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 10), dropEvent.drop_time_millis());
+
+ dropEvent = report.value_metrics().skipped(0).drop_event(1);
+ EXPECT_EQ(BucketDropReason::DUMP_REPORT_REQUESTED, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(dumpReportTimeNs), dropEvent.drop_time_millis());
+}
+
+/*
+ * Test that the number of logged bucket drop events is capped at the maximum.
+ * The maximum is currently 10 and is set in MetricProducer::maxDropEventsReached().
+ */
+TEST(ValueMetricProducerTest_BucketDrop, TestMaxBucketDropEvents) {
+ ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition();
+
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+ EXPECT_CALL(*pullerManager, Pull(tagId, _))
+ // First condition change event.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ for (int i = 0; i < 2000; i++) {
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 1, i));
+ }
+ return true;
+ }))
+ .WillOnce(Return(false))
+ .WillOnce(Return(false))
+ .WillOnce(Return(false))
+ .WillOnce(Return(false))
+ .WillOnce(Return(false))
+ .WillOnce(Return(false))
+ .WillOnce(Return(false))
+ .WillOnce(Return(false))
+ .WillOnce(Return(false))
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 220, 10));
+ return true;
+ }));
+
+ sp<ValueMetricProducer> valueProducer =
+ ValueMetricProducerTestHelper::createValueProducerWithNoInitialCondition(pullerManager,
+ metric);
+
+ // First condition change event causes guardrail to be reached.
+ valueProducer->onConditionChanged(true, bucketStartTimeNs + 10);
+
+ // 2-10 condition change events result in failed pulls.
+ valueProducer->onConditionChanged(false, bucketStartTimeNs + 30);
+ valueProducer->onConditionChanged(true, bucketStartTimeNs + 50);
+ valueProducer->onConditionChanged(false, bucketStartTimeNs + 70);
+ valueProducer->onConditionChanged(true, bucketStartTimeNs + 90);
+ valueProducer->onConditionChanged(false, bucketStartTimeNs + 100);
+ valueProducer->onConditionChanged(true, bucketStartTimeNs + 150);
+ valueProducer->onConditionChanged(false, bucketStartTimeNs + 170);
+ valueProducer->onConditionChanged(true, bucketStartTimeNs + 190);
+ valueProducer->onConditionChanged(false, bucketStartTimeNs + 200);
+
+ // Condition change event 11
+ valueProducer->onConditionChanged(true, bucketStartTimeNs + 220);
+
+ // Check dump report.
+ ProtoOutputStream output;
+ std::set<string> strSet;
+ int64_t dumpReportTimeNs = bucketStartTimeNs + 1000;
+ // Because we already have 10 dump events in the current bucket,
+ // this case should not be added to the list of dump events.
+ valueProducer->onDumpReport(bucketStartTimeNs + 1000, true /* include recent buckets */, true,
+ FAST /* dumpLatency */, &strSet, &output);
+
+ StatsLogReport report = outputStreamToProto(&output);
+ EXPECT_TRUE(report.has_value_metrics());
+ EXPECT_EQ(0, report.value_metrics().data_size());
+ EXPECT_EQ(1, report.value_metrics().skipped_size());
+
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs),
+ report.value_metrics().skipped(0).start_bucket_elapsed_millis());
+ EXPECT_EQ(NanoToMillis(dumpReportTimeNs),
+ report.value_metrics().skipped(0).end_bucket_elapsed_millis());
+ EXPECT_EQ(10, report.value_metrics().skipped(0).drop_event_size());
+
+ auto dropEvent = report.value_metrics().skipped(0).drop_event(0);
+ EXPECT_EQ(BucketDropReason::CONDITION_UNKNOWN, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 10), dropEvent.drop_time_millis());
+
+ dropEvent = report.value_metrics().skipped(0).drop_event(1);
+ EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 30), dropEvent.drop_time_millis());
+
+ dropEvent = report.value_metrics().skipped(0).drop_event(2);
+ EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 50), dropEvent.drop_time_millis());
+
+ dropEvent = report.value_metrics().skipped(0).drop_event(3);
+ EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 70), dropEvent.drop_time_millis());
+
+ dropEvent = report.value_metrics().skipped(0).drop_event(4);
+ EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 90), dropEvent.drop_time_millis());
+
+ dropEvent = report.value_metrics().skipped(0).drop_event(5);
+ EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 100), dropEvent.drop_time_millis());
+
+ dropEvent = report.value_metrics().skipped(0).drop_event(6);
+ EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 150), dropEvent.drop_time_millis());
+
+ dropEvent = report.value_metrics().skipped(0).drop_event(7);
+ EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 170), dropEvent.drop_time_millis());
+
+ dropEvent = report.value_metrics().skipped(0).drop_event(8);
+ EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 190), dropEvent.drop_time_millis());
+
+ dropEvent = report.value_metrics().skipped(0).drop_event(9);
+ EXPECT_EQ(BucketDropReason::PULL_FAILED, dropEvent.drop_reason());
+ EXPECT_EQ(NanoToMillis(bucketStartTimeNs + 200), dropEvent.drop_time_millis());
+}
+
+/*
+ * Test metric with a simple sliced state
+ * - Increasing values
+ * - Using diff
+ * - Second field is value field
+ */
+TEST(ValueMetricProducerTest, TestSlicedState) {
+ // Set up ValueMetricProducer.
+ ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithState("SCREEN_STATE");
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+ EXPECT_CALL(*pullerManager, Pull(tagId, _))
+ // ValueMetricProducer initialized.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 3));
+ return true;
+ }))
+ // Screen state change to ON.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 5, 5));
+ return true;
+ }))
+ // Screen state change to OFF.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 10, 9));
+ return true;
+ }))
+ // Screen state change to ON.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 15, 21));
+ return true;
+ }))
+ // Dump report requested.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 30));
+ return true;
+ }));
+
+ sp<ValueMetricProducer> valueProducer =
+ ValueMetricProducerTestHelper::createValueProducerWithState(
+ pullerManager, metric, {util::SCREEN_STATE_CHANGED}, {});
+
+ // Set up StateManager and check that StateTrackers are initialized.
+ StateManager::getInstance().clear();
+ StateManager::getInstance().registerListener(SCREEN_STATE_ATOM_ID, valueProducer);
+ EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount());
+ EXPECT_EQ(1, StateManager::getInstance().getListenersCount(SCREEN_STATE_ATOM_ID));
+
+ // Bucket status after metric initialized.
+ EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size());
+ // Base for dimension key {}
+ auto it = valueProducer->mCurrentSlicedBucket.begin();
+ auto itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(3, itBase->second[0].base.long_value);
+ // Value for dimension, state key {{}, kStateUnknown}
+ EXPECT_EQ(false, it->second[0].hasValue);
+
+ // Bucket status after screen state change kStateUnknown->ON.
+ auto screenEvent = CreateScreenStateChangedEvent(
+ bucketStartTimeNs + 5, android::view::DisplayStateEnum::DISPLAY_STATE_ON);
+ StateManager::getInstance().onLogEvent(*screenEvent);
+ EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size());
+ // Base for dimension key {}
+ it = valueProducer->mCurrentSlicedBucket.begin();
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(5, itBase->second[0].base.long_value);
+ // Value for dimension, state key {{}, kStateUnknown}
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(2, it->second[0].value.long_value);
+
+ // Bucket status after screen state change ON->OFF.
+ screenEvent = CreateScreenStateChangedEvent(bucketStartTimeNs + 10,
+ android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
+ StateManager::getInstance().onLogEvent(*screenEvent);
+ EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size());
+ // Base for dimension key {}
+ it = valueProducer->mCurrentSlicedBucket.begin();
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(9, itBase->second[0].base.long_value);
+ // Value for dimension, state key {{}, ON}
+ EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
+ it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(4, it->second[0].value.long_value);
+ // Value for dimension, state key {{}, kStateUnknown}
+ it++;
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(2, it->second[0].value.long_value);
+
+ // Bucket status after screen state change OFF->ON.
+ screenEvent = CreateScreenStateChangedEvent(bucketStartTimeNs + 15,
+ android::view::DisplayStateEnum::DISPLAY_STATE_ON);
+ StateManager::getInstance().onLogEvent(*screenEvent);
+ EXPECT_EQ(3UL, valueProducer->mCurrentSlicedBucket.size());
+ // Base for dimension key {}
+ it = valueProducer->mCurrentSlicedBucket.begin();
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(21, itBase->second[0].base.long_value);
+ // Value for dimension, state key {{}, OFF}
+ EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_OFF,
+ it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(12, it->second[0].value.long_value);
+ // Value for dimension, state key {{}, ON}
+ it++;
+ EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
+ it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(4, it->second[0].value.long_value);
+ // Value for dimension, state key {{}, kStateUnknown}
+ it++;
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(2, it->second[0].value.long_value);
+
+ // Start dump report and check output.
+ ProtoOutputStream output;
+ std::set<string> strSet;
+ valueProducer->onDumpReport(bucketStartTimeNs + 50, true /* include recent buckets */, true,
+ NO_TIME_CONSTRAINTS, &strSet, &output);
+
+ StatsLogReport report = outputStreamToProto(&output);
+ EXPECT_TRUE(report.has_value_metrics());
+ EXPECT_EQ(3, report.value_metrics().data_size());
+
+ auto data = report.value_metrics().data(0);
+ EXPECT_EQ(1, data.bucket_info_size());
+ EXPECT_EQ(2, report.value_metrics().data(0).bucket_info(0).values(0).value_long());
+
+ data = report.value_metrics().data(1);
+ EXPECT_EQ(1, report.value_metrics().data(1).bucket_info_size());
+ EXPECT_EQ(13, report.value_metrics().data(1).bucket_info(0).values(0).value_long());
+ EXPECT_EQ(SCREEN_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
+ EXPECT_TRUE(data.slice_by_state(0).has_value());
+ EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON, data.slice_by_state(0).value());
+
+ data = report.value_metrics().data(2);
+ EXPECT_EQ(1, report.value_metrics().data(2).bucket_info_size());
+ EXPECT_EQ(12, report.value_metrics().data(2).bucket_info(0).values(0).value_long());
+ EXPECT_EQ(SCREEN_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
+ EXPECT_TRUE(data.slice_by_state(0).has_value());
+ EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_OFF, data.slice_by_state(0).value());
+}
+
+/*
+ * Test metric with sliced state with map
+ * - Increasing values
+ * - Using diff
+ * - Second field is value field
+ */
+TEST(ValueMetricProducerTest, TestSlicedStateWithMap) {
+ // Set up ValueMetricProducer.
+ ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithState("SCREEN_STATE_ONOFF");
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+ EXPECT_CALL(*pullerManager, Pull(tagId, _))
+ // ValueMetricProducer initialized.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 3));
+ return true;
+ }))
+ // Screen state change to ON.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 5, 5));
+ return true;
+ }))
+ // Screen state change to VR.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 10, 9));
+ return true;
+ }))
+ // Screen state change to OFF.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 15, 21));
+ return true;
+ }))
+ // Dump report requested.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 30));
+ return true;
+ }));
+
+ const StateMap& stateMap = CreateScreenStateOnOffMap();
+ const StateMap_StateGroup screenOnGroup = stateMap.group(0);
+ const StateMap_StateGroup screenOffGroup = stateMap.group(1);
+
+ unordered_map<int, unordered_map<int, int64_t>> stateGroupMap;
+ for (auto group : stateMap.group()) {
+ for (auto value : group.value()) {
+ stateGroupMap[SCREEN_STATE_ATOM_ID][value] = group.group_id();
+ }
+ }
+
+ sp<ValueMetricProducer> valueProducer =
+ ValueMetricProducerTestHelper::createValueProducerWithState(
+ pullerManager, metric, {util::SCREEN_STATE_CHANGED}, stateGroupMap);
+
+ // Set up StateManager and check that StateTrackers are initialized.
+ StateManager::getInstance().clear();
+ StateManager::getInstance().registerListener(SCREEN_STATE_ATOM_ID, valueProducer);
+ EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount());
+ EXPECT_EQ(1, StateManager::getInstance().getListenersCount(SCREEN_STATE_ATOM_ID));
+
+ // Bucket status after metric initialized.
+ EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size());
+ // Base for dimension key {}
+ auto it = valueProducer->mCurrentSlicedBucket.begin();
+ auto itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(3, itBase->second[0].base.long_value);
+ // Value for dimension, state key {{}, {}}
+ EXPECT_EQ(false, it->second[0].hasValue);
+
+ // Bucket status after screen state change kStateUnknown->ON.
+ auto screenEvent = CreateScreenStateChangedEvent(
+ bucketStartTimeNs + 5, android::view::DisplayStateEnum::DISPLAY_STATE_ON);
+ StateManager::getInstance().onLogEvent(*screenEvent);
+ EXPECT_EQ(1UL, valueProducer->mCurrentSlicedBucket.size());
+ // Base for dimension key {}
+ it = valueProducer->mCurrentSlicedBucket.begin();
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(5, itBase->second[0].base.long_value);
+ // Value for dimension, state key {{}, kStateUnknown}
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(2, it->second[0].value.long_value);
+
+ // Bucket status after screen state change ON->VR (also ON).
+ screenEvent = CreateScreenStateChangedEvent(bucketStartTimeNs + 10,
+ android::view::DisplayStateEnum::DISPLAY_STATE_VR);
+ StateManager::getInstance().onLogEvent(*screenEvent);
+ EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size());
+ // Base for dimension key {}
+ it = valueProducer->mCurrentSlicedBucket.begin();
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(9, itBase->second[0].base.long_value);
+ // Value for dimension, state key {{}, ON GROUP}
+ EXPECT_EQ(screenOnGroup.group_id(),
+ it->first.getStateValuesKey().getValues()[0].mValue.long_value);
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(4, it->second[0].value.long_value);
+ // Value for dimension, state key {{}, kStateUnknown}
+ it++;
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(2, it->second[0].value.long_value);
+
+ // Bucket status after screen state change VR->OFF.
+ screenEvent = CreateScreenStateChangedEvent(bucketStartTimeNs + 15,
+ android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
+ StateManager::getInstance().onLogEvent(*screenEvent);
+ EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size());
+ // Base for dimension key {}
+ it = valueProducer->mCurrentSlicedBucket.begin();
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(21, itBase->second[0].base.long_value);
+ // Value for dimension, state key {{}, ON GROUP}
+ EXPECT_EQ(screenOnGroup.group_id(),
+ it->first.getStateValuesKey().getValues()[0].mValue.long_value);
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(16, it->second[0].value.long_value);
+ // Value for dimension, state key {{}, kStateUnknown}
+ it++;
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(2, it->second[0].value.long_value);
+
+ // Start dump report and check output.
+ ProtoOutputStream output;
+ std::set<string> strSet;
+ valueProducer->onDumpReport(bucketStartTimeNs + 50, true /* include recent buckets */, true,
+ NO_TIME_CONSTRAINTS, &strSet, &output);
+
+ StatsLogReport report = outputStreamToProto(&output);
+ EXPECT_TRUE(report.has_value_metrics());
+ EXPECT_EQ(3, report.value_metrics().data_size());
+
+ auto data = report.value_metrics().data(0);
+ EXPECT_EQ(1, data.bucket_info_size());
+ EXPECT_EQ(2, report.value_metrics().data(0).bucket_info(0).values(0).value_long());
+
+ data = report.value_metrics().data(1);
+ EXPECT_EQ(1, report.value_metrics().data(1).bucket_info_size());
+ EXPECT_EQ(16, report.value_metrics().data(1).bucket_info(0).values(0).value_long());
+ EXPECT_EQ(SCREEN_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
+ EXPECT_TRUE(data.slice_by_state(0).has_group_id());
+ EXPECT_EQ(screenOnGroup.group_id(), data.slice_by_state(0).group_id());
+
+ data = report.value_metrics().data(2);
+ EXPECT_EQ(1, report.value_metrics().data(2).bucket_info_size());
+ EXPECT_EQ(9, report.value_metrics().data(2).bucket_info(0).values(0).value_long());
+ EXPECT_EQ(SCREEN_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
+ EXPECT_TRUE(data.slice_by_state(0).has_group_id());
+ EXPECT_EQ(screenOffGroup.group_id(), data.slice_by_state(0).group_id());
+}
+
+/*
+ * Test metric that slices by state with a primary field and has dimensions
+ * - Increasing values
+ * - Using diff
+ * - Second field is value field
+ */
+TEST(ValueMetricProducerTest, TestSlicedStateWithPrimaryField_WithDimensions) {
+ // Set up ValueMetricProducer.
+ ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithState("UID_PROCESS_STATE");
+ metric.mutable_dimensions_in_what()->set_field(tagId);
+ metric.mutable_dimensions_in_what()->add_child()->set_field(1);
+
+ MetricStateLink* stateLink = metric.add_state_link();
+ stateLink->set_state_atom_id(UID_PROCESS_STATE_ATOM_ID);
+ auto fieldsInWhat = stateLink->mutable_fields_in_what();
+ *fieldsInWhat = CreateDimensions(tagId, {1 /* uid */});
+ auto fieldsInState = stateLink->mutable_fields_in_state();
+ *fieldsInState = CreateDimensions(UID_PROCESS_STATE_ATOM_ID, {1 /* uid */});
+
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+ EXPECT_CALL(*pullerManager, Pull(tagId, _))
+ // ValueMetricProducer initialized.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(CreateTwoValueLogEvent(tagId, bucketStartTimeNs, 2 /*uid*/, 7));
+ data->push_back(CreateTwoValueLogEvent(tagId, bucketStartTimeNs, 1 /*uid*/, 3));
+ return true;
+ }))
+ // Uid 1 process state change from kStateUnknown -> Foreground
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(
+ CreateTwoValueLogEvent(tagId, bucketStartTimeNs + 20, 1 /*uid*/, 6));
+
+ // This event should be skipped.
+ data->push_back(
+ CreateTwoValueLogEvent(tagId, bucketStartTimeNs + 20, 2 /*uid*/, 8));
+ return true;
+ }))
+ // Uid 2 process state change from kStateUnknown -> Background
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(
+ CreateTwoValueLogEvent(tagId, bucketStartTimeNs + 40, 2 /*uid*/, 9));
+
+ // This event should be skipped.
+ data->push_back(
+ CreateTwoValueLogEvent(tagId, bucketStartTimeNs + 40, 1 /*uid*/, 12));
+ return true;
+ }))
+ // Uid 1 process state change from Foreground -> Background
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(
+ CreateTwoValueLogEvent(tagId, bucket2StartTimeNs + 20, 1 /*uid*/, 13));
+
+ // This event should be skipped.
+ data->push_back(
+ CreateTwoValueLogEvent(tagId, bucket2StartTimeNs + 20, 2 /*uid*/, 11));
+ return true;
+ }))
+ // Uid 1 process state change from Background -> Foreground
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(
+ CreateTwoValueLogEvent(tagId, bucket2StartTimeNs + 40, 1 /*uid*/, 17));
+
+ // This event should be skipped.
+ data->push_back(
+ CreateTwoValueLogEvent(tagId, bucket2StartTimeNs + 40, 2 /*uid */, 15));
+ return true;
+ }))
+ // Dump report pull.
+ .WillOnce(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(
+ CreateTwoValueLogEvent(tagId, bucket2StartTimeNs + 50, 2 /*uid*/, 20));
+ data->push_back(
+ CreateTwoValueLogEvent(tagId, bucket2StartTimeNs + 50, 1 /*uid*/, 21));
+ return true;
+ }));
+
+ sp<ValueMetricProducer> valueProducer =
+ ValueMetricProducerTestHelper::createValueProducerWithState(
+ pullerManager, metric, {UID_PROCESS_STATE_ATOM_ID}, {});
+
+ // Set up StateManager and check that StateTrackers are initialized.
+ StateManager::getInstance().clear();
+ StateManager::getInstance().registerListener(UID_PROCESS_STATE_ATOM_ID, valueProducer);
+ EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount());
+ EXPECT_EQ(1, StateManager::getInstance().getListenersCount(UID_PROCESS_STATE_ATOM_ID));
+
+ // Bucket status after metric initialized.
+ EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size());
+ // Base for dimension key {uid 1}.
+ auto it = valueProducer->mCurrentSlicedBucket.begin();
+ EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ auto itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(3, itBase->second[0].base.long_value);
+ // Value for dimension, state key {{uid 1}, kStateUnknown}
+ // TODO(tsaichristine): test equality of state values key
+ // EXPECT_EQ(-1, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(false, it->second[0].hasValue);
+ // Base for dimension key {uid 2}
+ it++;
+ EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(7, itBase->second[0].base.long_value);
+ // Value for dimension, state key {{uid 2}, kStateUnknown}
+ // EXPECT_EQ(-1, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(false, it->second[0].hasValue);
+
+ // Bucket status after uid 1 process state change kStateUnknown -> Foreground.
+ auto uidProcessEvent = CreateUidProcessStateChangedEvent(
+ bucketStartTimeNs + 20, 1 /* uid */, android::app::PROCESS_STATE_IMPORTANT_FOREGROUND);
+ StateManager::getInstance().onLogEvent(*uidProcessEvent);
+ EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size());
+ // Base for dimension key {uid 1}.
+ it = valueProducer->mCurrentSlicedBucket.begin();
+ EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(6, itBase->second[0].base.long_value);
+ // Value for key {uid 1, kStateUnknown}.
+ // EXPECT_EQ(-1, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(3, it->second[0].value.long_value);
+
+ // Base for dimension key {uid 2}
+ it++;
+ EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(7, itBase->second[0].base.long_value);
+ // Value for key {uid 2, kStateUnknown}
+ EXPECT_EQ(false, it->second[0].hasValue);
+
+ // Bucket status after uid 2 process state change kStateUnknown -> Background.
+ uidProcessEvent = CreateUidProcessStateChangedEvent(
+ bucketStartTimeNs + 40, 2 /* uid */, android::app::PROCESS_STATE_IMPORTANT_BACKGROUND);
+ StateManager::getInstance().onLogEvent(*uidProcessEvent);
+ EXPECT_EQ(2UL, valueProducer->mCurrentSlicedBucket.size());
+ // Base for dimension key {uid 1}.
+ it = valueProducer->mCurrentSlicedBucket.begin();
+ EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(6, itBase->second[0].base.long_value);
+ // Value for key {uid 1, kStateUnknown}.
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(3, it->second[0].value.long_value);
+
+ // Base for dimension key {uid 2}
+ it++;
+ EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(9, itBase->second[0].base.long_value);
+ // Value for key {uid 2, kStateUnknown}
+ // EXPECT_EQ(-1, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(2, it->second[0].value.long_value);
+
+ // Pull at end of first bucket.
+ vector<shared_ptr<LogEvent>> allData;
+ allData.push_back(CreateTwoValueLogEvent(tagId, bucket2StartTimeNs, 1 /*uid*/, 10));
+ allData.push_back(CreateTwoValueLogEvent(tagId, bucket2StartTimeNs, 2 /*uid*/, 15));
+ valueProducer->onDataPulled(allData, /** succeeds */ true, bucket2StartTimeNs + 1);
+
+ // Buckets flushed after end of first bucket.
+ // None of the buckets should have a value.
+ EXPECT_EQ(4UL, valueProducer->mCurrentSlicedBucket.size());
+ EXPECT_EQ(4UL, valueProducer->mPastBuckets.size());
+ EXPECT_EQ(2UL, valueProducer->mCurrentBaseInfo.size());
+ // Base for dimension key {uid 2}.
+ it = valueProducer->mCurrentSlicedBucket.begin();
+ EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(15, itBase->second[0].base.long_value);
+ // Value for key {uid 2, BACKGROUND}.
+ EXPECT_EQ(1, it->first.getStateValuesKey().getValues().size());
+ EXPECT_EQ(1006, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(false, it->second[0].hasValue);
+
+ // Base for dimension key {uid 1}
+ it++;
+ EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(10, itBase->second[0].base.long_value);
+ // Value for key {uid 1, kStateUnknown}
+ EXPECT_EQ(0, it->first.getStateValuesKey().getValues().size());
+ // EXPECT_EQ(-1, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(false, it->second[0].hasValue);
+
+ // Value for key {uid 1, FOREGROUND}
+ it++;
+ EXPECT_EQ(1, it->first.getStateValuesKey().getValues().size());
+ EXPECT_EQ(1005, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(false, it->second[0].hasValue);
+
+ // Value for key {uid 2, kStateUnknown}
+ it++;
+ EXPECT_EQ(false, it->second[0].hasValue);
+
+ // Bucket status after uid 1 process state change from Foreground -> Background.
+ uidProcessEvent = CreateUidProcessStateChangedEvent(
+ bucket2StartTimeNs + 20, 1 /* uid */, android::app::PROCESS_STATE_IMPORTANT_BACKGROUND);
+ StateManager::getInstance().onLogEvent(*uidProcessEvent);
+
+ EXPECT_EQ(4UL, valueProducer->mCurrentSlicedBucket.size());
+ EXPECT_EQ(4UL, valueProducer->mPastBuckets.size());
+ EXPECT_EQ(2UL, valueProducer->mCurrentBaseInfo.size());
+ // Base for dimension key {uid 2}.
+ it = valueProducer->mCurrentSlicedBucket.begin();
+ EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(15, itBase->second[0].base.long_value);
+ // Value for key {uid 2, BACKGROUND}.
+ EXPECT_EQ(false, it->second[0].hasValue);
+ // Base for dimension key {uid 1}
+ it++;
+ EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(13, itBase->second[0].base.long_value);
+ // Value for key {uid 1, kStateUnknown}
+ EXPECT_EQ(false, it->second[0].hasValue);
+ // Value for key {uid 1, FOREGROUND}
+ it++;
+ EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ EXPECT_EQ(1005, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(3, it->second[0].value.long_value);
+ // Value for key {uid 2, kStateUnknown}
+ it++;
+ EXPECT_EQ(false, it->second[0].hasValue);
+
+ // Bucket status after uid 1 process state change Background->Foreground.
+ uidProcessEvent = CreateUidProcessStateChangedEvent(
+ bucket2StartTimeNs + 40, 1 /* uid */, android::app::PROCESS_STATE_IMPORTANT_FOREGROUND);
+ StateManager::getInstance().onLogEvent(*uidProcessEvent);
+
+ EXPECT_EQ(5UL, valueProducer->mCurrentSlicedBucket.size());
+ EXPECT_EQ(2UL, valueProducer->mCurrentBaseInfo.size());
+ // Base for dimension key {uid 2}
+ it = valueProducer->mCurrentSlicedBucket.begin();
+ EXPECT_EQ(2, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(true, itBase->second[0].hasBase);
+ EXPECT_EQ(15, itBase->second[0].base.long_value);
+ EXPECT_EQ(false, it->second[0].hasValue);
+
+ it++;
+ EXPECT_EQ(false, it->second[0].hasValue);
+
+ // Base for dimension key {uid 1}
+ it++;
+ EXPECT_EQ(1, it->first.getDimensionKeyInWhat().getValues()[0].mValue.int_value);
+ itBase = valueProducer->mCurrentBaseInfo.find(it->first.getDimensionKeyInWhat());
+ EXPECT_EQ(17, itBase->second[0].base.long_value);
+ // Value for key {uid 1, BACKGROUND}
+ EXPECT_EQ(1006, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(4, it->second[0].value.long_value);
+ // Value for key {uid 1, FOREGROUND}
+ it++;
+ EXPECT_EQ(1005, it->first.getStateValuesKey().getValues()[0].mValue.int_value);
+ EXPECT_EQ(true, it->second[0].hasValue);
+ EXPECT_EQ(3, it->second[0].value.long_value);
+
+ // Start dump report and check output.
+ ProtoOutputStream output;
+ std::set<string> strSet;
+ valueProducer->onDumpReport(bucket2StartTimeNs + 50, true /* include recent buckets */, true,
+ NO_TIME_CONSTRAINTS, &strSet, &output);
+
+ StatsLogReport report = outputStreamToProto(&output);
+ EXPECT_TRUE(report.has_value_metrics());
+ EXPECT_EQ(5, report.value_metrics().data_size());
+
+ auto data = report.value_metrics().data(0);
+ EXPECT_EQ(1, data.bucket_info_size());
+ EXPECT_EQ(4, report.value_metrics().data(0).bucket_info(0).values(0).value_long());
+ EXPECT_EQ(UID_PROCESS_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
+ EXPECT_TRUE(data.slice_by_state(0).has_value());
+ EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_IMPORTANT_BACKGROUND,
+ data.slice_by_state(0).value());
+
+ data = report.value_metrics().data(1);
+ EXPECT_EQ(1, report.value_metrics().data(1).bucket_info_size());
+ EXPECT_EQ(2, report.value_metrics().data(1).bucket_info(0).values(0).value_long());
+
+ data = report.value_metrics().data(2);
+ EXPECT_EQ(UID_PROCESS_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
+ EXPECT_TRUE(data.slice_by_state(0).has_value());
+ EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_IMPORTANT_FOREGROUND,
+ data.slice_by_state(0).value());
+ EXPECT_EQ(2, report.value_metrics().data(2).bucket_info_size());
+ EXPECT_EQ(4, report.value_metrics().data(2).bucket_info(0).values(0).value_long());
+ EXPECT_EQ(7, report.value_metrics().data(2).bucket_info(1).values(0).value_long());
+
+ data = report.value_metrics().data(3);
+ EXPECT_EQ(1, report.value_metrics().data(3).bucket_info_size());
+ EXPECT_EQ(3, report.value_metrics().data(3).bucket_info(0).values(0).value_long());
+
+ data = report.value_metrics().data(4);
+ EXPECT_EQ(UID_PROCESS_STATE_ATOM_ID, data.slice_by_state(0).atom_id());
+ EXPECT_TRUE(data.slice_by_state(0).has_value());
+ EXPECT_EQ(android::app::ProcessStateEnum::PROCESS_STATE_IMPORTANT_BACKGROUND,
+ data.slice_by_state(0).value());
+ EXPECT_EQ(2, report.value_metrics().data(4).bucket_info_size());
+ EXPECT_EQ(6, report.value_metrics().data(4).bucket_info(0).values(0).value_long());
+ EXPECT_EQ(5, report.value_metrics().data(4).bucket_info(1).values(0).value_long());
+}
} // namespace statsd
} // namespace os
diff --git a/cmds/statsd/tests/shell/ShellSubscriber_test.cpp b/cmds/statsd/tests/shell/ShellSubscriber_test.cpp
index 57e4265..4c55683 100644
--- a/cmds/statsd/tests/shell/ShellSubscriber_test.cpp
+++ b/cmds/statsd/tests/shell/ShellSubscriber_test.cpp
@@ -19,6 +19,7 @@
#include "frameworks/base/cmds/statsd/src/shell/shell_config.pb.h"
#include "frameworks/base/cmds/statsd/src/shell/shell_data.pb.h"
#include "src/shell/ShellSubscriber.h"
+#include "stats_event.h"
#include "tests/metrics/metrics_test_helper.h"
#include <stdio.h>
@@ -88,6 +89,7 @@
// now read from the pipe. firstly read the atom size.
size_t dataSize = 0;
EXPECT_EQ((int)sizeof(dataSize), read(fds_data[0], &dataSize, sizeof(dataSize)));
+
EXPECT_EQ(expected_data_size, (int)dataSize);
// then read that much data which is the atom in proto binary format
@@ -103,32 +105,43 @@
expectedData.SerializeToArray(&atomBuffer[0], expected_data_size);
EXPECT_EQ(atomBuffer, dataBuffer);
close(fds_data[0]);
+
+ if (reader.joinable()) {
+ reader.join();
+ }
}
-// TODO(b/149590301): Update this test to use new socket schema.
-//TEST(ShellSubscriberTest, testPushedSubscription) {
-// sp<MockUidMap> uidMap = new NaggyMock<MockUidMap>();
-//
-// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
-// vector<std::shared_ptr<LogEvent>> pushedList;
-//
-// std::shared_ptr<LogEvent> event1 =
-// std::make_shared<LogEvent>(29 /*screen_state_atom_id*/, 1000 /*timestamp*/);
-// event1->write(::android::view::DisplayStateEnum::DISPLAY_STATE_ON);
-// event1->init();
-// pushedList.push_back(event1);
-//
-// // create a simple config to get screen events
-// ShellSubscription config;
-// config.add_pushed()->set_atom_id(29);
-//
-// // this is the expected screen event atom.
-// ShellData shellData;
-// shellData.add_atom()->mutable_screen_state_changed()->set_state(
-// ::android::view::DisplayStateEnum::DISPLAY_STATE_ON);
-//
-// runShellTest(config, uidMap, pullerManager, pushedList, shellData);
-//}
+TEST(ShellSubscriberTest, testPushedSubscription) {
+ sp<MockUidMap> uidMap = new NaggyMock<MockUidMap>();
+
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+ vector<std::shared_ptr<LogEvent>> pushedList;
+
+ // Create the LogEvent from an AStatsEvent
+ AStatsEvent* statsEvent = AStatsEvent_obtain();
+ AStatsEvent_setAtomId(statsEvent, 29 /*screen_state_atom_id*/);
+ AStatsEvent_overwriteTimestamp(statsEvent, 1000);
+ AStatsEvent_writeInt32(statsEvent, ::android::view::DisplayStateEnum::DISPLAY_STATE_ON);
+ AStatsEvent_build(statsEvent);
+ size_t size;
+ uint8_t* buffer = AStatsEvent_getBuffer(statsEvent, &size);
+ std::shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
+ logEvent->parseBuffer(buffer, size);
+ AStatsEvent_release(statsEvent);
+
+ pushedList.push_back(logEvent);
+
+ // create a simple config to get screen events
+ ShellSubscription config;
+ config.add_pushed()->set_atom_id(29);
+
+ // this is the expected screen event atom.
+ ShellData shellData;
+ shellData.add_atom()->mutable_screen_state_changed()->set_state(
+ ::android::view::DisplayStateEnum::DISPLAY_STATE_ON);
+
+ runShellTest(config, uidMap, pullerManager, pushedList, shellData);
+}
namespace {
@@ -159,33 +172,38 @@
return config;
}
+shared_ptr<LogEvent> makeCpuActiveTimeAtom(int32_t uid, int64_t timeMillis) {
+ AStatsEvent* statsEvent = AStatsEvent_obtain();
+ AStatsEvent_setAtomId(statsEvent, 10016);
+ AStatsEvent_overwriteTimestamp(statsEvent, 1111L);
+ AStatsEvent_writeInt32(statsEvent, uid);
+ AStatsEvent_writeInt64(statsEvent, timeMillis);
+ AStatsEvent_build(statsEvent);
+
+ size_t size;
+ uint8_t* buf = AStatsEvent_getBuffer(statsEvent, &size);
+
+ std::shared_ptr<LogEvent> logEvent = std::make_shared<LogEvent>(/*uid=*/0, /*pid=*/0);
+ logEvent->parseBuffer(buf, size);
+ return logEvent;
+}
+
} // namespace
-// TODO(b/149590301): Update this test to use new socket schema.
-//TEST(ShellSubscriberTest, testPulledSubscription) {
-// sp<MockUidMap> uidMap = new NaggyMock<MockUidMap>();
-//
-// sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
-// EXPECT_CALL(*pullerManager, Pull(10016, _))
-// .WillRepeatedly(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
-// data->clear();
-// shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, 1111L);
-// event->write(kUid1);
-// event->write(kCpuTime1);
-// event->init();
-// data->push_back(event);
-// // another event
-// event = make_shared<LogEvent>(tagId, 1111L);
-// event->write(kUid2);
-// event->write(kCpuTime2);
-// event->init();
-// data->push_back(event);
-// return true;
-// }));
-//
-// runShellTest(getPulledConfig(), uidMap, pullerManager, vector<std::shared_ptr<LogEvent>>(),
-// getExpectedShellData());
-//}
+TEST(ShellSubscriberTest, testPulledSubscription) {
+ sp<MockUidMap> uidMap = new NaggyMock<MockUidMap>();
+
+ sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>();
+ EXPECT_CALL(*pullerManager, Pull(10016, _))
+ .WillRepeatedly(Invoke([](int tagId, vector<std::shared_ptr<LogEvent>>* data) {
+ data->clear();
+ data->push_back(makeCpuActiveTimeAtom(/*uid=*/kUid1, /*timeMillis=*/kCpuTime1));
+ data->push_back(makeCpuActiveTimeAtom(/*uid=*/kUid2, /*timeMillis=*/kCpuTime2));
+ return true;
+ }));
+ runShellTest(getPulledConfig(), uidMap, pullerManager, vector<std::shared_ptr<LogEvent>>(),
+ getExpectedShellData());
+}
#else
GTEST_LOG_(INFO) << "This test does nothing.\n";
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index b00f542..1b81704 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -4821,9 +4821,9 @@
/**
* Register with {@link HomeVisibilityObserver} with ActivityManager.
+ * TODO: b/144351078 expose as SystemApi
* @hide
*/
- @SystemApi
public void registerHomeVisibilityObserver(@NonNull HomeVisibilityObserver observer) {
Preconditions.checkNotNull(observer);
try {
@@ -4838,9 +4838,9 @@
/**
* Unregister with {@link HomeVisibilityObserver} with ActivityManager.
+ * TODO: b/144351078 expose as SystemApi
* @hide
*/
- @SystemApi
public void unregisterHomeVisibilityObserver(@NonNull HomeVisibilityObserver observer) {
Preconditions.checkNotNull(observer);
try {
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 9c1a861..26db8f3 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -776,151 +776,157 @@
/** @hide No operation specified. */
@UnsupportedAppUsage
- public static final int OP_NONE = -1;
+ public static final int OP_NONE = AppProtoEnums.APP_OP_NONE;
/** @hide Access to coarse location information. */
@UnsupportedAppUsage
@TestApi
- public static final int OP_COARSE_LOCATION = 0;
+ public static final int OP_COARSE_LOCATION = AppProtoEnums.APP_OP_COARSE_LOCATION;
/** @hide Access to fine location information. */
@UnsupportedAppUsage
- public static final int OP_FINE_LOCATION = 1;
+ public static final int OP_FINE_LOCATION = AppProtoEnums.APP_OP_FINE_LOCATION;
/** @hide Causing GPS to run. */
@UnsupportedAppUsage
- public static final int OP_GPS = 2;
+ public static final int OP_GPS = AppProtoEnums.APP_OP_GPS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_VIBRATE = 3;
+ public static final int OP_VIBRATE = AppProtoEnums.APP_OP_VIBRATE;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_READ_CONTACTS = 4;
+ public static final int OP_READ_CONTACTS = AppProtoEnums.APP_OP_READ_CONTACTS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_WRITE_CONTACTS = 5;
+ public static final int OP_WRITE_CONTACTS = AppProtoEnums.APP_OP_WRITE_CONTACTS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_READ_CALL_LOG = 6;
+ public static final int OP_READ_CALL_LOG = AppProtoEnums.APP_OP_READ_CALL_LOG;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_WRITE_CALL_LOG = 7;
+ public static final int OP_WRITE_CALL_LOG = AppProtoEnums.APP_OP_WRITE_CALL_LOG;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_READ_CALENDAR = 8;
+ public static final int OP_READ_CALENDAR = AppProtoEnums.APP_OP_READ_CALENDAR;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_WRITE_CALENDAR = 9;
+ public static final int OP_WRITE_CALENDAR = AppProtoEnums.APP_OP_WRITE_CALENDAR;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_WIFI_SCAN = 10;
+ public static final int OP_WIFI_SCAN = AppProtoEnums.APP_OP_WIFI_SCAN;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_POST_NOTIFICATION = 11;
+ public static final int OP_POST_NOTIFICATION = AppProtoEnums.APP_OP_POST_NOTIFICATION;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_NEIGHBORING_CELLS = 12;
+ public static final int OP_NEIGHBORING_CELLS = AppProtoEnums.APP_OP_NEIGHBORING_CELLS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_CALL_PHONE = 13;
+ public static final int OP_CALL_PHONE = AppProtoEnums.APP_OP_CALL_PHONE;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_READ_SMS = 14;
+ public static final int OP_READ_SMS = AppProtoEnums.APP_OP_READ_SMS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_WRITE_SMS = 15;
+ public static final int OP_WRITE_SMS = AppProtoEnums.APP_OP_WRITE_SMS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_RECEIVE_SMS = 16;
+ public static final int OP_RECEIVE_SMS = AppProtoEnums.APP_OP_RECEIVE_SMS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_RECEIVE_EMERGECY_SMS = 17;
+ public static final int OP_RECEIVE_EMERGECY_SMS =
+ AppProtoEnums.APP_OP_RECEIVE_EMERGENCY_SMS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_RECEIVE_MMS = 18;
+ public static final int OP_RECEIVE_MMS = AppProtoEnums.APP_OP_RECEIVE_MMS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_RECEIVE_WAP_PUSH = 19;
+ public static final int OP_RECEIVE_WAP_PUSH = AppProtoEnums.APP_OP_RECEIVE_WAP_PUSH;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_SEND_SMS = 20;
+ public static final int OP_SEND_SMS = AppProtoEnums.APP_OP_SEND_SMS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_READ_ICC_SMS = 21;
+ public static final int OP_READ_ICC_SMS = AppProtoEnums.APP_OP_READ_ICC_SMS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_WRITE_ICC_SMS = 22;
+ public static final int OP_WRITE_ICC_SMS = AppProtoEnums.APP_OP_WRITE_ICC_SMS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_WRITE_SETTINGS = 23;
+ public static final int OP_WRITE_SETTINGS = AppProtoEnums.APP_OP_WRITE_SETTINGS;
/** @hide Required to draw on top of other apps. */
@UnsupportedAppUsage
@TestApi
- public static final int OP_SYSTEM_ALERT_WINDOW = 24;
+ public static final int OP_SYSTEM_ALERT_WINDOW = AppProtoEnums.APP_OP_SYSTEM_ALERT_WINDOW;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_ACCESS_NOTIFICATIONS = 25;
+ public static final int OP_ACCESS_NOTIFICATIONS =
+ AppProtoEnums.APP_OP_ACCESS_NOTIFICATIONS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_CAMERA = 26;
+ public static final int OP_CAMERA = AppProtoEnums.APP_OP_CAMERA;
/** @hide */
@UnsupportedAppUsage
@TestApi
- public static final int OP_RECORD_AUDIO = 27;
+ public static final int OP_RECORD_AUDIO = AppProtoEnums.APP_OP_RECORD_AUDIO;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_PLAY_AUDIO = 28;
+ public static final int OP_PLAY_AUDIO = AppProtoEnums.APP_OP_PLAY_AUDIO;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_READ_CLIPBOARD = 29;
+ public static final int OP_READ_CLIPBOARD = AppProtoEnums.APP_OP_READ_CLIPBOARD;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_WRITE_CLIPBOARD = 30;
+ public static final int OP_WRITE_CLIPBOARD = AppProtoEnums.APP_OP_WRITE_CLIPBOARD;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_TAKE_MEDIA_BUTTONS = 31;
+ public static final int OP_TAKE_MEDIA_BUTTONS = AppProtoEnums.APP_OP_TAKE_MEDIA_BUTTONS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_TAKE_AUDIO_FOCUS = 32;
+ public static final int OP_TAKE_AUDIO_FOCUS = AppProtoEnums.APP_OP_TAKE_AUDIO_FOCUS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_AUDIO_MASTER_VOLUME = 33;
+ public static final int OP_AUDIO_MASTER_VOLUME = AppProtoEnums.APP_OP_AUDIO_MASTER_VOLUME;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_AUDIO_VOICE_VOLUME = 34;
+ public static final int OP_AUDIO_VOICE_VOLUME = AppProtoEnums.APP_OP_AUDIO_VOICE_VOLUME;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_AUDIO_RING_VOLUME = 35;
+ public static final int OP_AUDIO_RING_VOLUME = AppProtoEnums.APP_OP_AUDIO_RING_VOLUME;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_AUDIO_MEDIA_VOLUME = 36;
+ public static final int OP_AUDIO_MEDIA_VOLUME = AppProtoEnums.APP_OP_AUDIO_MEDIA_VOLUME;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_AUDIO_ALARM_VOLUME = 37;
+ public static final int OP_AUDIO_ALARM_VOLUME = AppProtoEnums.APP_OP_AUDIO_ALARM_VOLUME;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_AUDIO_NOTIFICATION_VOLUME = 38;
+ public static final int OP_AUDIO_NOTIFICATION_VOLUME =
+ AppProtoEnums.APP_OP_AUDIO_NOTIFICATION_VOLUME;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_AUDIO_BLUETOOTH_VOLUME = 39;
+ public static final int OP_AUDIO_BLUETOOTH_VOLUME =
+ AppProtoEnums.APP_OP_AUDIO_BLUETOOTH_VOLUME;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_WAKE_LOCK = 40;
+ public static final int OP_WAKE_LOCK = AppProtoEnums.APP_OP_WAKE_LOCK;
/** @hide Continually monitoring location data. */
@UnsupportedAppUsage
- public static final int OP_MONITOR_LOCATION = 41;
+ public static final int OP_MONITOR_LOCATION =
+ AppProtoEnums.APP_OP_MONITOR_LOCATION;
/** @hide Continually monitoring location data with a relatively high power request. */
@UnsupportedAppUsage
- public static final int OP_MONITOR_HIGH_POWER_LOCATION = 42;
+ public static final int OP_MONITOR_HIGH_POWER_LOCATION =
+ AppProtoEnums.APP_OP_MONITOR_HIGH_POWER_LOCATION;
/** @hide Retrieve current usage stats via {@link UsageStatsManager}. */
@UnsupportedAppUsage
- public static final int OP_GET_USAGE_STATS = 43;
+ public static final int OP_GET_USAGE_STATS = AppProtoEnums.APP_OP_GET_USAGE_STATS;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_MUTE_MICROPHONE = 44;
+ public static final int OP_MUTE_MICROPHONE = AppProtoEnums.APP_OP_MUTE_MICROPHONE;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_TOAST_WINDOW = 45;
+ public static final int OP_TOAST_WINDOW = AppProtoEnums.APP_OP_TOAST_WINDOW;
/** @hide Capture the device's display contents and/or audio */
@UnsupportedAppUsage
- public static final int OP_PROJECT_MEDIA = 46;
+ public static final int OP_PROJECT_MEDIA = AppProtoEnums.APP_OP_PROJECT_MEDIA;
/**
* Start (without additional user intervention) a VPN connection, as used by {@link
* android.net.VpnService} along with as Platform VPN connections, as used by {@link
@@ -933,130 +939,142 @@
* @hide
*/
@UnsupportedAppUsage
- public static final int OP_ACTIVATE_VPN = 47;
+ public static final int OP_ACTIVATE_VPN = AppProtoEnums.APP_OP_ACTIVATE_VPN;
/** @hide Access the WallpaperManagerAPI to write wallpapers. */
@UnsupportedAppUsage
- public static final int OP_WRITE_WALLPAPER = 48;
+ public static final int OP_WRITE_WALLPAPER = AppProtoEnums.APP_OP_WRITE_WALLPAPER;
/** @hide Received the assist structure from an app. */
@UnsupportedAppUsage
- public static final int OP_ASSIST_STRUCTURE = 49;
+ public static final int OP_ASSIST_STRUCTURE = AppProtoEnums.APP_OP_ASSIST_STRUCTURE;
/** @hide Received a screenshot from assist. */
@UnsupportedAppUsage
- public static final int OP_ASSIST_SCREENSHOT = 50;
+ public static final int OP_ASSIST_SCREENSHOT = AppProtoEnums.APP_OP_ASSIST_SCREENSHOT;
/** @hide Read the phone state. */
@UnsupportedAppUsage
- public static final int OP_READ_PHONE_STATE = 51;
+ public static final int OP_READ_PHONE_STATE = AppProtoEnums.APP_OP_READ_PHONE_STATE;
/** @hide Add voicemail messages to the voicemail content provider. */
@UnsupportedAppUsage
- public static final int OP_ADD_VOICEMAIL = 52;
+ public static final int OP_ADD_VOICEMAIL = AppProtoEnums.APP_OP_ADD_VOICEMAIL;
/** @hide Access APIs for SIP calling over VOIP or WiFi. */
@UnsupportedAppUsage
- public static final int OP_USE_SIP = 53;
+ public static final int OP_USE_SIP = AppProtoEnums.APP_OP_USE_SIP;
/** @hide Intercept outgoing calls. */
@UnsupportedAppUsage
- public static final int OP_PROCESS_OUTGOING_CALLS = 54;
+ public static final int OP_PROCESS_OUTGOING_CALLS =
+ AppProtoEnums.APP_OP_PROCESS_OUTGOING_CALLS;
/** @hide User the fingerprint API. */
@UnsupportedAppUsage
- public static final int OP_USE_FINGERPRINT = 55;
+ public static final int OP_USE_FINGERPRINT = AppProtoEnums.APP_OP_USE_FINGERPRINT;
/** @hide Access to body sensors such as heart rate, etc. */
@UnsupportedAppUsage
- public static final int OP_BODY_SENSORS = 56;
+ public static final int OP_BODY_SENSORS = AppProtoEnums.APP_OP_BODY_SENSORS;
/** @hide Read previously received cell broadcast messages. */
@UnsupportedAppUsage
- public static final int OP_READ_CELL_BROADCASTS = 57;
+ public static final int OP_READ_CELL_BROADCASTS = AppProtoEnums.APP_OP_READ_CELL_BROADCASTS;
/** @hide Inject mock location into the system. */
@UnsupportedAppUsage
- public static final int OP_MOCK_LOCATION = 58;
+ public static final int OP_MOCK_LOCATION = AppProtoEnums.APP_OP_MOCK_LOCATION;
/** @hide Read external storage. */
@UnsupportedAppUsage
- public static final int OP_READ_EXTERNAL_STORAGE = 59;
+ public static final int OP_READ_EXTERNAL_STORAGE = AppProtoEnums.APP_OP_READ_EXTERNAL_STORAGE;
/** @hide Write external storage. */
@UnsupportedAppUsage
- public static final int OP_WRITE_EXTERNAL_STORAGE = 60;
+ public static final int OP_WRITE_EXTERNAL_STORAGE =
+ AppProtoEnums.APP_OP_WRITE_EXTERNAL_STORAGE;
/** @hide Turned on the screen. */
@UnsupportedAppUsage
- public static final int OP_TURN_SCREEN_ON = 61;
+ public static final int OP_TURN_SCREEN_ON = AppProtoEnums.APP_OP_TURN_SCREEN_ON;
/** @hide Get device accounts. */
@UnsupportedAppUsage
- public static final int OP_GET_ACCOUNTS = 62;
+ public static final int OP_GET_ACCOUNTS = AppProtoEnums.APP_OP_GET_ACCOUNTS;
/** @hide Control whether an application is allowed to run in the background. */
@UnsupportedAppUsage
- public static final int OP_RUN_IN_BACKGROUND = 63;
+ public static final int OP_RUN_IN_BACKGROUND =
+ AppProtoEnums.APP_OP_RUN_ANY_IN_BACKGROUND;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_AUDIO_ACCESSIBILITY_VOLUME = 64;
+ public static final int OP_AUDIO_ACCESSIBILITY_VOLUME =
+ AppProtoEnums.APP_OP_AUDIO_ACCESSIBILITY_VOLUME;
/** @hide Read the phone number. */
@UnsupportedAppUsage
- public static final int OP_READ_PHONE_NUMBERS = 65;
+ public static final int OP_READ_PHONE_NUMBERS = AppProtoEnums.APP_OP_READ_PHONE_NUMBERS;
/** @hide Request package installs through package installer */
@UnsupportedAppUsage
- public static final int OP_REQUEST_INSTALL_PACKAGES = 66;
+ public static final int OP_REQUEST_INSTALL_PACKAGES =
+ AppProtoEnums.APP_OP_REQUEST_INSTALL_PACKAGES;
/** @hide Enter picture-in-picture. */
@UnsupportedAppUsage
- public static final int OP_PICTURE_IN_PICTURE = 67;
+ public static final int OP_PICTURE_IN_PICTURE = AppProtoEnums.APP_OP_PICTURE_IN_PICTURE;
/** @hide Instant app start foreground service. */
@UnsupportedAppUsage
- public static final int OP_INSTANT_APP_START_FOREGROUND = 68;
+ public static final int OP_INSTANT_APP_START_FOREGROUND =
+ AppProtoEnums.APP_OP_INSTANT_APP_START_FOREGROUND;
/** @hide Answer incoming phone calls */
@UnsupportedAppUsage
- public static final int OP_ANSWER_PHONE_CALLS = 69;
+ public static final int OP_ANSWER_PHONE_CALLS = AppProtoEnums.APP_OP_ANSWER_PHONE_CALLS;
/** @hide Run jobs when in background */
@UnsupportedAppUsage
- public static final int OP_RUN_ANY_IN_BACKGROUND = 70;
+ public static final int OP_RUN_ANY_IN_BACKGROUND = AppProtoEnums.APP_OP_RUN_ANY_IN_BACKGROUND;
/** @hide Change Wi-Fi connectivity state */
@UnsupportedAppUsage
- public static final int OP_CHANGE_WIFI_STATE = 71;
+ public static final int OP_CHANGE_WIFI_STATE = AppProtoEnums.APP_OP_CHANGE_WIFI_STATE;
/** @hide Request package deletion through package installer */
@UnsupportedAppUsage
- public static final int OP_REQUEST_DELETE_PACKAGES = 72;
+ public static final int OP_REQUEST_DELETE_PACKAGES =
+ AppProtoEnums.APP_OP_REQUEST_DELETE_PACKAGES;
/** @hide Bind an accessibility service. */
@UnsupportedAppUsage
- public static final int OP_BIND_ACCESSIBILITY_SERVICE = 73;
+ public static final int OP_BIND_ACCESSIBILITY_SERVICE =
+ AppProtoEnums.APP_OP_BIND_ACCESSIBILITY_SERVICE;
/** @hide Continue handover of a call from another app */
@UnsupportedAppUsage
- public static final int OP_ACCEPT_HANDOVER = 74;
+ public static final int OP_ACCEPT_HANDOVER = AppProtoEnums.APP_OP_ACCEPT_HANDOVER;
/** @hide Create and Manage IPsec Tunnels */
@UnsupportedAppUsage
- public static final int OP_MANAGE_IPSEC_TUNNELS = 75;
+ public static final int OP_MANAGE_IPSEC_TUNNELS = AppProtoEnums.APP_OP_MANAGE_IPSEC_TUNNELS;
/** @hide Any app start foreground service. */
@UnsupportedAppUsage
@TestApi
- public static final int OP_START_FOREGROUND = 76;
+ public static final int OP_START_FOREGROUND = AppProtoEnums.APP_OP_START_FOREGROUND;
/** @hide */
@UnsupportedAppUsage
- public static final int OP_BLUETOOTH_SCAN = 77;
+ public static final int OP_BLUETOOTH_SCAN = AppProtoEnums.APP_OP_BLUETOOTH_SCAN;
/** @hide Use the BiometricPrompt/BiometricManager APIs. */
- public static final int OP_USE_BIOMETRIC = 78;
+ public static final int OP_USE_BIOMETRIC = AppProtoEnums.APP_OP_USE_BIOMETRIC;
/** @hide Physical activity recognition. */
- public static final int OP_ACTIVITY_RECOGNITION = 79;
+ public static final int OP_ACTIVITY_RECOGNITION = AppProtoEnums.APP_OP_ACTIVITY_RECOGNITION;
/** @hide Financial app sms read. */
- public static final int OP_SMS_FINANCIAL_TRANSACTIONS = 80;
+ public static final int OP_SMS_FINANCIAL_TRANSACTIONS =
+ AppProtoEnums.APP_OP_SMS_FINANCIAL_TRANSACTIONS;
/** @hide Read media of audio type. */
- public static final int OP_READ_MEDIA_AUDIO = 81;
+ public static final int OP_READ_MEDIA_AUDIO = AppProtoEnums.APP_OP_READ_MEDIA_AUDIO;
/** @hide Write media of audio type. */
- public static final int OP_WRITE_MEDIA_AUDIO = 82;
+ public static final int OP_WRITE_MEDIA_AUDIO = AppProtoEnums.APP_OP_WRITE_MEDIA_AUDIO;
/** @hide Read media of video type. */
- public static final int OP_READ_MEDIA_VIDEO = 83;
+ public static final int OP_READ_MEDIA_VIDEO = AppProtoEnums.APP_OP_READ_MEDIA_VIDEO;
/** @hide Write media of video type. */
- public static final int OP_WRITE_MEDIA_VIDEO = 84;
+ public static final int OP_WRITE_MEDIA_VIDEO = AppProtoEnums.APP_OP_WRITE_MEDIA_VIDEO;
/** @hide Read media of image type. */
- public static final int OP_READ_MEDIA_IMAGES = 85;
+ public static final int OP_READ_MEDIA_IMAGES = AppProtoEnums.APP_OP_READ_MEDIA_IMAGES;
/** @hide Write media of image type. */
- public static final int OP_WRITE_MEDIA_IMAGES = 86;
+ public static final int OP_WRITE_MEDIA_IMAGES = AppProtoEnums.APP_OP_WRITE_MEDIA_IMAGES;
/** @hide Has a legacy (non-isolated) view of storage. */
- public static final int OP_LEGACY_STORAGE = 87;
+ public static final int OP_LEGACY_STORAGE = AppProtoEnums.APP_OP_LEGACY_STORAGE;
/** @hide Accessing accessibility features */
- public static final int OP_ACCESS_ACCESSIBILITY = 88;
+ public static final int OP_ACCESS_ACCESSIBILITY = AppProtoEnums.APP_OP_ACCESS_ACCESSIBILITY;
/** @hide Read the device identifiers (IMEI / MEID, IMSI, SIM / Build serial) */
- public static final int OP_READ_DEVICE_IDENTIFIERS = 89;
+ public static final int OP_READ_DEVICE_IDENTIFIERS =
+ AppProtoEnums.APP_OP_READ_DEVICE_IDENTIFIERS;
/** @hide Read location metadata from media */
- public static final int OP_ACCESS_MEDIA_LOCATION = 90;
+ public static final int OP_ACCESS_MEDIA_LOCATION = AppProtoEnums.APP_OP_ACCESS_MEDIA_LOCATION;
/** @hide Query all apps on device, regardless of declarations in the calling app manifest */
- public static final int OP_QUERY_ALL_PACKAGES = 91;
+ public static final int OP_QUERY_ALL_PACKAGES = AppProtoEnums.APP_OP_QUERY_ALL_PACKAGES;
/** @hide Access all external storage */
- public static final int OP_MANAGE_EXTERNAL_STORAGE = 92;
+ public static final int OP_MANAGE_EXTERNAL_STORAGE =
+ AppProtoEnums.APP_OP_MANAGE_EXTERNAL_STORAGE;
/** @hide Communicate cross-profile within the same profile group. */
- public static final int OP_INTERACT_ACROSS_PROFILES = 93;
+ public static final int OP_INTERACT_ACROSS_PROFILES =
+ AppProtoEnums.APP_OP_INTERACT_ACROSS_PROFILES;
/**
* Start (without additional user intervention) a Platform VPN connection, as used by {@link
* android.net.VpnManager}
@@ -1067,14 +1085,15 @@
*
* @hide
*/
- public static final int OP_ACTIVATE_PLATFORM_VPN = 94;
+ public static final int OP_ACTIVATE_PLATFORM_VPN = AppProtoEnums.APP_OP_ACTIVATE_PLATFORM_VPN;
/** @hide */
- public static final int OP_LOADER_USAGE_STATS = 95;
+ public static final int OP_LOADER_USAGE_STATS = AppProtoEnums.APP_OP_LOADER_USAGE_STATS;
/** @hide Access telephony call audio */
- public static final int OP_ACCESS_CALL_AUDIO = 96;
+ public static final int OP_ACCESS_CALL_AUDIO = AppProtoEnums.APP_OP_ACCESS_CALL_AUDIO;
/** @hide Auto-revoke app permissions if app is unused for an extended period */
- public static final int OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED = 97;
+ public static final int OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED =
+ AppProtoEnums.APP_OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED;
/**
* Whether {@link #OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED} is allowed to be changed by
@@ -1082,7 +1101,8 @@
*
* @hide
*/
- public static final int OP_AUTO_REVOKE_MANAGED_BY_INSTALLER = 98;
+ public static final int OP_AUTO_REVOKE_MANAGED_BY_INSTALLER =
+ AppProtoEnums.APP_OP_AUTO_REVOKE_MANAGED_BY_INSTALLER;
/** @hide */
@UnsupportedAppUsage
@@ -2339,114 +2359,6 @@
};
/**
- * This maps each operation to its statsd logging code.
- */
- private static int[] sOpToLoggingId = new int[]{
- AppProtoEnums.APP_OP_COARSE_LOCATION, // OP_COARSE_LOCATION
- AppProtoEnums.APP_OP_FINE_LOCATION, // OP_FINE_LOCATION
- AppProtoEnums.APP_OP_GPS, // OP_ID__GPS
- AppProtoEnums.APP_OP_VIBRATE, // OP_VIBRATE
- AppProtoEnums.APP_OP_READ_CONTACTS, // OP_READ_CONTACTS
- AppProtoEnums.APP_OP_WRITE_CONTACTS, // OP_WRITE_CONTACTS
- AppProtoEnums.APP_OP_READ_CALL_LOG, // OP_READ_CALL_LOG
- AppProtoEnums.APP_OP_WRITE_CALL_LOG, // OP_WRITE_CALL_LOG
- AppProtoEnums.APP_OP_READ_CALENDAR, // OP_READ_CALENDAR
- AppProtoEnums.APP_OP_WRITE_CALENDAR, // OP_WRITE_CALENDAR
- AppProtoEnums.APP_OP_WIFI_SCAN, // OP_WIFI_SCAN
- AppProtoEnums.APP_OP_POST_NOTIFICATION, // OP_POST_NOTIFICATION
- AppProtoEnums.APP_OP_NEIGHBORING_CELLS, // OP_NEIGHBORING_CELLS
- AppProtoEnums.APP_OP_CALL_PHONE, // OP_CALL_PHONE
- AppProtoEnums.APP_OP_READ_SMS, // OP_READ_SMS
- AppProtoEnums.APP_OP_WRITE_SMS, // OP_WRITE_SMS
- AppProtoEnums.APP_OP_RECEIVE_SMS, // OP_RECEIVE_SMS
- AppProtoEnums.APP_OP_RECEIVE_EMERGENCY_SMS, // OP_RECEIVE_EMERGENCY_SMS
- AppProtoEnums.APP_OP_RECEIVE_MMS, // OP_RECEIVE_MMS
- AppProtoEnums.APP_OP_RECEIVE_WAP_PUSH, // OP_RECEIVE_WAP_PUSH
- AppProtoEnums.APP_OP_SEND_SMS, // OP_SEND_SMS
- AppProtoEnums.APP_OP_READ_ICC_SMS, // OP_READ_ICC_SMS
- AppProtoEnums.APP_OP_WRITE_ICC_SMS, // OP_WRITE_ICC_SMS
- AppProtoEnums.APP_OP_WRITE_SETTINGS, // OP_WRITE_SETTINGS
- AppProtoEnums.APP_OP_SYSTEM_ALERT_WINDOW, // OP_SYSTEM_ALERT_WINDOW
- AppProtoEnums.APP_OP_ACCESS_NOTIFICATIONS, // OP_ACCESS_NOTIFICATIONS
- AppProtoEnums.APP_OP_CAMERA, // OP_CAMERA
- AppProtoEnums.APP_OP_RECORD_AUDIO, // OP_RECORD_AUDIO
- AppProtoEnums.APP_OP_PLAY_AUDIO, // OP_PLAY_AUDIO
- AppProtoEnums.APP_OP_READ_CLIPBOARD, // OP_READ_CLIPBOARD
- AppProtoEnums.APP_OP_WRITE_CLIPBOARD, // OP_WRITE_CLIPBOARD
- AppProtoEnums.APP_OP_TAKE_MEDIA_BUTTONS, // OP_TAKE_MEDIA_BUTTONS
- AppProtoEnums.APP_OP_TAKE_AUDIO_FOCUS, // OP_TAKE_AUDIO_FOCUS
- AppProtoEnums.APP_OP_AUDIO_MASTER_VOLUME, // OP_AUDIO_MASTER_VOLUME
- AppProtoEnums.APP_OP_AUDIO_VOICE_VOLUME, // OP_AUDIO_VOICE_VOLUME
- AppProtoEnums.APP_OP_AUDIO_RING_VOLUME, // OP_AUDIO_RING_VOLUME
- AppProtoEnums.APP_OP_AUDIO_MEDIA_VOLUME, // OP_AUDIO_MEDIA_VOLUME
- AppProtoEnums.APP_OP_AUDIO_ALARM_VOLUME, // OP_AUDIO_ALARM_VOLUME
- AppProtoEnums.APP_OP_AUDIO_NOTIFICATION_VOLUME, // OP_AUDIO_NOTIFICATION_VOLUME
- AppProtoEnums.APP_OP_AUDIO_BLUETOOTH_VOLUME, // OP_AUDIO_BLUETOOTH_VOLUME
- AppProtoEnums.APP_OP_WAKE_LOCK, // OP_WAKE_LOCK
- AppProtoEnums.APP_OP_MONITOR_LOCATION, // OP_MONITOR_LOCATION
- AppProtoEnums.APP_OP_MONITOR_HIGH_POWER_LOCATION, // OP_MONITOR_HIGH_POWER_LOCATION
- AppProtoEnums.APP_OP_GET_USAGE_STATS, // OP_GET_USAGE_STATS
- AppProtoEnums.APP_OP_MUTE_MICROPHONE, //OP_MUTE_MICROPHONE
- AppProtoEnums.APP_OP_TOAST_WINDOW, // OP_TOAST_WINDOW
- AppProtoEnums.APP_OP_PROJECT_MEDIA, // OP_PROJECT_MEDIA
- AppProtoEnums.APP_OP_ACTIVATE_VPN, // OP_ACTIVATE_VPN
- AppProtoEnums.APP_OP_WRITE_WALLPAPER, // OP_WRITE_WALLPAPER
- AppProtoEnums.APP_OP_ASSIST_STRUCTURE, // OP_ASSIST_STRUCTURE
- AppProtoEnums.APP_OP_ASSIST_SCREENSHOT, // OP_ASSIST_SCREENSHOT
- AppProtoEnums.APP_OP_READ_PHONE_STATE, // OP_READ_PHONE_STATE
- AppProtoEnums.APP_OP_ADD_VOICEMAIL, // OP_ADD_VOICEMAIL
- AppProtoEnums.APP_OP_USE_SIP, // OP_USE_SIP
- AppProtoEnums.APP_OP_PROCESS_OUTGOING_CALLS, // OP_PROCESS_OUTGOING_CALLS
- AppProtoEnums.APP_OP_USE_FINGERPRINT, // OP_USE_FINGERPRINT
- AppProtoEnums.APP_OP_BODY_SENSORS, // OP_BODY_SENSORS
- AppProtoEnums.APP_OP_READ_CELL_BROADCASTS, // OP_READ_CELL_BROADCASTS
- AppProtoEnums.APP_OP_MOCK_LOCATION, // OP_MOCK_LOCATION
- AppProtoEnums.APP_OP_READ_EXTERNAL_STORAGE, // OP_READ_EXTERNAL_STORAGE
- AppProtoEnums.APP_OP_WRITE_EXTERNAL_STORAGE, // OP_WRITE_EXTERNAL_STORAGE
- AppProtoEnums.APP_OP_TURN_SCREEN_ON, // OP_TURN_SCREEN_ON
- AppProtoEnums.APP_OP_GET_ACCOUNTS, // OP_GET_ACCOUNTS
- AppProtoEnums.APP_OP_RUN_IN_BACKGROUND, // OP_RUN_IN_BACKGROUND
- AppProtoEnums.APP_OP_AUDIO_ACCESSIBILITY_VOLUME, // OP_AUDIO_ACCESSIBILITY_VOLUME
- AppProtoEnums.APP_OP_READ_PHONE_NUMBERS, // OP_READ_PHONE_NUMBERS
- AppProtoEnums.APP_OP_REQUEST_INSTALL_PACKAGES, // OP_REQUEST_INSTALL_PACKAGES
- AppProtoEnums.APP_OP_PICTURE_IN_PICTURE, // OP_PICTURE_IN_PICTURE
- AppProtoEnums.APP_OP_INSTANT_APP_START_FOREGROUND, // OP_INSTANT_APP_START_FOREGROUND
- AppProtoEnums.APP_OP_ANSWER_PHONE_CALLS, // OP_ANSWER_PHONE_CALLS
- AppProtoEnums.APP_OP_RUN_ANY_IN_BACKGROUND, // OP_RUN_ANY_IN_BACKGROUND
- AppProtoEnums.APP_OP_CHANGE_WIFI_STATE, // OP_CHANGE_WIFI_STATE
- AppProtoEnums.APP_OP_REQUEST_DELETE_PACKAGES, // OP_REQUEST_DELETE_PACKAGES
- AppProtoEnums.APP_OP_BIND_ACCESSIBILITY_SERVICE, // OP_BIND_ACCESSIBILITY_SERVICE
- AppProtoEnums.APP_OP_ACCEPT_HANDOVER, // OP_ACCEPT_HANDOVER
- AppProtoEnums.APP_OP_MANAGE_IPSEC_TUNNELS, // OP_MANAGE_IPSEC_TUNNELS
- AppProtoEnums.APP_OP_START_FOREGROUND, // OP_START_FOREGROUND
- AppProtoEnums.APP_OP_BLUETOOTH_SCAN, // OP_BLUETOOTH_SCAN
- AppProtoEnums.APP_OP_USE_BIOMETRIC, // OP_USE_BIOMETRIC
- AppProtoEnums.APP_OP_ACTIVITY_RECOGNITION, // OP_ACTIVITY_RECOGNITION
- AppProtoEnums.APP_OP_SMS_FINANCIAL_TRANSACTIONS, // OP_SMS_FINANCIAL_TRANSACTIONS
- AppProtoEnums.APP_OP_READ_MEDIA_AUDIO, // OP_READ_MEDIA_AUDIO
- AppProtoEnums.APP_OP_WRITE_MEDIA_AUDIO, // OP_WRITE_MEDIA_AUDIO
- AppProtoEnums.APP_OP_READ_MEDIA_VIDEO, // OP_READ_MEDIA_VIDEO
- AppProtoEnums.APP_OP_WRITE_MEDIA_VIDEO, // OP_WRITE_MEDIA_VIDEO
- AppProtoEnums.APP_OP_READ_MEDIA_IMAGES, // OP_READ_MEDIA_IMAGES
- AppProtoEnums.APP_OP_WRITE_MEDIA_IMAGES, // OP_WRITE_MEDIA_IMAGES
- AppProtoEnums.APP_OP_LEGACY_STORAGE, // OP_LEGACY_STORAGE
- AppProtoEnums.APP_OP_ACCESS_ACCESSIBILITY, // OP_ACCESS_ACCESSIBILITY
- AppProtoEnums.APP_OP_READ_DEVICE_IDENTIFIERS, // OP_READ_DEVICE_IDENTIFIERS
- AppProtoEnums.APP_OP_ACCESS_MEDIA_LOCATION, // OP_ACCESS_MEDIA_LOCATION
- AppProtoEnums.APP_OP_QUERY_ALL_PACKAGES, // OP_QUERY_ALL_PACKAGES
- AppProtoEnums.APP_OP_MANAGE_EXTERNAL_STORAGE, // OP_MANAGE_EXTERNAL_STORAGE
- AppProtoEnums.APP_OP_INTERACT_ACROSS_PROFILES, // OP_INTERACT_ACROSS_PROFILES
- AppProtoEnums.APP_OP_ACTIVATE_PLATFORM_VPN, // OP_ACTIVATE_PLATFORM_VPN
- AppProtoEnums.APP_OP_LOADER_USAGE_STATS, // OP_LOADER_USAGE_STATS
- AppProtoEnums.APP_OP_ACCESS_CALL_AUDIO, // OP_ACCESS_CALL_AUDIO
- AppProtoEnums.APP_OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED,
- // OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED
- AppProtoEnums.APP_OP_AUTO_REVOKE_MANAGED_BY_INSTALLER
- //OP_AUTO_REVOKE_MANAGED_BY_INSTALLER
- };
-
-
- /**
* Mapping from an app op name to the app op code.
*/
private static HashMap<String, Integer> sOpStrToOp = new HashMap<>();
@@ -2487,10 +2399,6 @@
throw new IllegalStateException("sOpToString length " + sOpToString.length
+ " should be " + _NUM_OP);
}
- if (sOpToLoggingId.length != _NUM_OP) {
- throw new IllegalStateException("sOpToLoggingId length " + sOpToLoggingId.length
- + " should be " + _NUM_OP);
- }
if (sOpNames.length != _NUM_OP) {
throw new IllegalStateException("sOpNames length " + sOpNames.length
+ " should be " + _NUM_OP);
@@ -2575,15 +2483,6 @@
}
/**
- * Retrieve a logging id for the operation.
- *
- * @hide
- */
- public static int opToLoggingId(int op) {
- return sOpToLoggingId[op];
- }
-
- /**
* @hide
*/
public static int strDebugOpToOp(String op) {
@@ -6037,11 +5936,6 @@
return mOp;
}
- /** @hide */
- public int getLoggingOpCode() {
- return AppOpsManager.opToLoggingId(mOp);
- }
-
/**
* Gets the number times the op was accessed (performed) in the foreground.
*
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 0b0a803..a1ec27b 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -3358,31 +3358,20 @@
}
}
+ @Override
public void setMimeGroup(String mimeGroup, Set<String> mimeTypes) {
try {
- mPM.setMimeGroup(mContext.getPackageName(), mimeGroup,
- new ArrayList<String>(mimeTypes));
+ mPM.setMimeGroup(mContext.getPackageName(), mimeGroup, new ArrayList<>(mimeTypes));
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
}
}
- @Override
- public void clearMimeGroup(String mimeGroup) {
- try {
- mPM.clearMimeGroup(mContext.getPackageName(), mimeGroup);
- } catch (RemoteException e) {
- throw e.rethrowAsRuntimeException();
- }
- }
-
+ @NonNull
@Override
public Set<String> getMimeGroup(String group) {
try {
List<String> mimeGroup = mPM.getMimeGroup(mContext.getPackageName(), group);
- if (mimeGroup == null) {
- return null;
- }
return new ArraySet<>(mimeGroup);
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
diff --git a/core/java/android/app/HomeVisibilityObserver.java b/core/java/android/app/HomeVisibilityObserver.java
index f3465f8..8422c6f 100644
--- a/core/java/android/app/HomeVisibilityObserver.java
+++ b/core/java/android/app/HomeVisibilityObserver.java
@@ -16,7 +16,6 @@
package android.app;
-import android.annotation.SystemApi;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -28,9 +27,9 @@
* An observer / callback to create and register by
* {@link ActivityManager#registerHomeVisibilityObserver} so that it's triggered when
* visibility of home page changes.
+ * TODO: b/144351078 expose as SystemApi
* @hide
*/
-@SystemApi
public abstract class HomeVisibilityObserver {
private Context mContext;
private ActivityManager mActivityManager;
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 1320d1d..31fc2d0 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -33,6 +33,7 @@
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
@@ -2535,8 +2536,8 @@
}
}
- if (mBubbleMetadata != null && mBubbleMetadata.getBubbleIcon() != null) {
- final Icon icon = mBubbleMetadata.getBubbleIcon();
+ if (mBubbleMetadata != null && mBubbleMetadata.getIcon() != null) {
+ final Icon icon = mBubbleMetadata.getIcon();
final int iconType = icon.getType();
if (iconType == TYPE_URI_ADAPTIVE_BITMAP || iconType == TYPE_URI) {
visitor.accept(icon.getUri());
@@ -3597,15 +3598,14 @@
* notification content, or don't show {@link android.content.pm.ShortcutManager shortcuts}.
*
* If this notification has {@link BubbleMetadata} attached that was created with
- * {@link BubbleMetadata.Builder#createShortcutBubble(String)} a check will be performed
- * to ensure the shortcutId supplied to bubble metadata matches the shortcutId set here,
- * if one was set. If the shortcutId's were specified but do not match, an exception
- * is thrown.
+ * a shortcutId a check will be performed to ensure the shortcutId supplied to bubble
+ * metadata matches the shortcutId set here, if one was set. If the shortcutId's were
+ * specified but do not match, an exception is thrown.
*
* @param shortcutId the {@link ShortcutInfo#getId() id} of the shortcut this notification
* supersedes
*
- * @see BubbleMetadata.Builder#createShortcutBubble(String)
+ * @see Notification.BubbleMetadata.Builder#Builder(String)
*/
@NonNull
public Builder setShortcutId(String shortcutId) {
@@ -5963,12 +5963,11 @@
* object.
*
* If this notification has {@link BubbleMetadata} attached that was created with
- * {@link BubbleMetadata.Builder#createShortcutBubble(String)} a check will be performed
- * to ensure the shortcutId supplied to bubble metadata matches the shortcutId set on the
- * notification builder, if one was set. If the shortcutId's were specified but do not
- * match, an exception is thrown here.
+ * a shortcutId a check will be performed to ensure the shortcutId supplied to bubble
+ * metadata matches the shortcutId set on the notification builder, if one was set.
+ * If the shortcutId's were specified but do not match, an exception is thrown here.
*
- * @see BubbleMetadata.Builder#createShortcutBubble(String)
+ * @see Notification.BubbleMetadata.Builder#Builder(String)
* @see #setShortcutId(String)
*/
@NonNull
@@ -7584,7 +7583,10 @@
isOneToOne = !isGroupConversation();
}
boolean isConversationLayout = mConversationType != CONVERSATION_TYPE_LEGACY;
- Icon largeIcon = isConversationLayout ? mShortcutIcon : mBuilder.mN.mLargeIcon;
+ boolean isImportantConversation = mConversationType == CONVERSATION_TYPE_IMPORTANT;
+ Icon largeIcon = isConversationLayout && mShortcutIcon != null
+ ? mShortcutIcon
+ : mBuilder.mN.mLargeIcon;
TemplateBindResult bindResult = new TemplateBindResult();
StandardTemplateParams p = mBuilder.mParams.reset()
.hasProgress(false)
@@ -7626,6 +7628,10 @@
isOneToOne);
contentView.setCharSequence(R.id.status_bar_latest_event_content,
"setConversationTitle", conversationTitle);
+ if (isConversationLayout) {
+ contentView.setBoolean(R.id.status_bar_latest_event_content,
+ "setIsImportantConversation", isImportantConversation);
+ }
contentView.setIcon(R.id.status_bar_latest_event_content, "setLargeIcon",
largeIcon);
contentView.setBundle(R.id.status_bar_latest_event_content, "setData",
@@ -8744,9 +8750,8 @@
* <p>A bubble is used to display app content in a floating window over the existing
* foreground activity. A bubble has a collapsed state represented by an icon and an
* expanded state that displays an activity. These may be defined via
- * {@link BubbleMetadata.Builder#createIntentBubble(PendingIntent, Icon)} or they may
- * be definied via an existing shortcut using
- * {@link BubbleMetadata.Builder#createShortcutBubble(String)}.
+ * {@link Builder#Builder(PendingIntent, Icon)} or they may
+ * be defined via an existing shortcut using {@link Builder#Builder(String)}.
* </p>
*
* <b>Notifications with a valid and allowed bubble will display in collapsed state
@@ -8767,8 +8772,7 @@
/**
* If set and the app creating the bubble is in the foreground, the bubble will be posted
- * in its expanded state, with the contents of {@link #getBubbleIntent()} in a floating
- * window.
+ * in its expanded state.
*
* <p>This flag has no effect if the app posting the bubble is not in the foreground.
* The app is considered foreground if it is visible and on the screen, note that
@@ -8834,7 +8838,9 @@
}
/**
- * @return the shortcut id used to populate the bubble, if it exists.
+ * @return the shortcut id used for this bubble if created via
+ * {@link Builder#Builder(String)} or null if created
+ * via {@link Builder#Builder(PendingIntent, Icon)}.
*/
@Nullable
public String getShortcutId() {
@@ -8842,20 +8848,20 @@
}
/**
- * @deprecated use {@link #getBubbleIntent()} or use {@link #getShortcutId()} if created
- * with a valid shortcut instead.
+ * @return the pending intent used to populate the floating window for this bubble, or
+ * null if this bubble is created via {@link Builder#Builder(String)}.
*/
- @Deprecated
- @NonNull
+ @SuppressLint("InvalidNullConversion")
+ @Nullable
public PendingIntent getIntent() {
return mPendingIntent;
}
/**
- * @return the pending intent used to populate the floating window for this bubble, or
- * null if this bubble is shortcut based.
+ * @deprecated use {@link #getIntent()} instead.
*/
@Nullable
+ @Deprecated
public PendingIntent getBubbleIntent() {
return mPendingIntent;
}
@@ -8869,27 +8875,27 @@
}
/**
- * @deprecated use {@link #getBubbleIcon()} or use {@link #getShortcutId()} if created
- * with a valid shortcut instead.
+ * @return the icon that will be displayed for this bubble when it is collapsed, or null
+ * if the bubble is created via {@link Builder#Builder(String)}.
*/
- @Deprecated
- @NonNull
+ @SuppressLint("InvalidNullConversion")
+ @Nullable
public Icon getIcon() {
return mIcon;
}
/**
- * @return the icon that will be displayed for this bubble when it is collapsed, or null
- * if the bubble is shortcut based.
+ * @deprecated use {@link #getIcon()} instead.
*/
@Nullable
+ @Deprecated
public Icon getBubbleIcon() {
return mIcon;
}
/**
* @return the ideal height, in DPs, for the floating window that app content defined by
- * {@link #getBubbleIntent()} for this bubble. A value of 0 indicates a desired height has
+ * {@link #getIntent()} for this bubble. A value of 0 indicates a desired height has
* not been set.
*/
@Dimension(unit = DP)
@@ -8899,7 +8905,7 @@
/**
* @return the resId of ideal height for the floating window that app content defined by
- * {@link #getBubbleIntent()} for this bubble. A value of 0 indicates a res value has not
+ * {@link #getIntent()} for this bubble. A value of 0 indicates a res value has not
* been provided for the desired height.
*/
@DimenRes
@@ -9013,15 +9019,20 @@
private String mShortcutId;
/**
- * Constructs a new builder object.
+ * @deprecated use {@link Builder#Builder(String)} for a bubble created via a
+ * {@link ShortcutInfo} or {@link Builder#Builder(PendingIntent, Icon)} for a bubble
+ * created via a {@link PendingIntent}.
*/
+ @Deprecated
public Builder() {
}
/**
- * Creates a {@link BubbleMetadata.Builder} based on a shortcut. Only
- * {@link android.content.pm.ShortcutManager#addDynamicShortcuts(List)} shortcuts are
- * supported.
+ * Creates a {@link BubbleMetadata.Builder} based on a {@link ShortcutInfo}. To create
+ * a shortcut bubble, ensure that the shortcut associated with the provided
+ * {@param shortcutId} is published as a dynamic shortcut that was built with
+ * {@link ShortcutInfo.Builder#setLongLived(boolean)} being true, otherwise your
+ * notification will not be able to bubble.
*
* <p>The shortcut icon will be used to represent the bubble when it is collapsed.</p>
*
@@ -9032,11 +9043,55 @@
* no bubble will be produced. If the shortcut is deleted while the bubble is active,
* the bubble will be removed.</p>
*
- * <p>Calling this method will clear the contents of
- * {@link #createIntentBubble(PendingIntent, Icon)} if it was previously called on
- * this builder.</p>
+ * @throws NullPointerException if shortcutId is null.
+ *
+ * @see ShortcutInfo
+ * @see ShortcutInfo.Builder#setLongLived(boolean)
+ * @see android.content.pm.ShortcutManager#addDynamicShortcuts(List)
+ */
+ public Builder(@NonNull String shortcutId) {
+ if (TextUtils.isEmpty(shortcutId)) {
+ throw new NullPointerException("Bubble requires a non-null shortcut id");
+ }
+ mShortcutId = shortcutId;
+ }
+
+ /**
+ * Creates a {@link BubbleMetadata.Builder} based on the provided intent and icon.
+ *
+ * <p>The icon will be used to represent the bubble when it is collapsed. An icon
+ * should be representative of the content within the bubble. If your app produces
+ * multiple bubbles, the icon should be unique for each of them.</p>
+ *
+ * <p>The intent that will be used when the bubble is expanded. This will display the
+ * app content in a floating window over the existing foreground activity. The intent
+ * should point to a resizable activity. </p>
+ *
+ * @throws NullPointerException if intent is null.
+ * @throws NullPointerException if icon is null.
+ */
+ public Builder(@NonNull PendingIntent intent, @NonNull Icon icon) {
+ if (intent == null) {
+ throw new NullPointerException("Bubble requires non-null pending intent");
+ }
+ if (icon == null) {
+ throw new NullPointerException("Bubbles require non-null icon");
+ }
+ if (icon.getType() != TYPE_URI_ADAPTIVE_BITMAP
+ && icon.getType() != TYPE_URI) {
+ Log.w(TAG, "Bubbles work best with icons of TYPE_URI or "
+ + "TYPE_URI_ADAPTIVE_BITMAP. "
+ + "In the future, using an icon of this type will be required.");
+ }
+ mPendingIntent = intent;
+ mIcon = icon;
+ }
+
+ /**
+ * @deprecated use {@link Builder#Builder(String)} instead.
*/
@NonNull
+ @Deprecated
public BubbleMetadata.Builder createShortcutBubble(@NonNull String shortcutId) {
if (!TextUtils.isEmpty(shortcutId)) {
// If shortcut id is set, we don't use these if they were previously set.
@@ -9048,23 +9103,10 @@
}
/**
- * Creates a {@link BubbleMetadata.Builder} based on the provided intent and icon.
- *
- * <p>The icon will be used to represent the bubble when it is collapsed. An icon
- * should be representative of the content within the bubble. If your app produces
- * multiple bubbles, the icon should be unique for each of them.</p>
- *
- * <p>The intent that will be used when the bubble is expanded. This will display the
- * app content in a floating window over the existing foreground activity.</p>
- *
- * <p>Calling this method will clear the contents of
- * {@link #createShortcutBubble(String)} if it was previously called on this builder.
- * </p>
- *
- * @throws IllegalArgumentException if intent is null.
- * @throws IllegalArgumentException if icon is null.
+ * @deprecated use {@link Builder#Builder(PendingIntent, Icon)} instead.
*/
@NonNull
+ @Deprecated
public BubbleMetadata.Builder createIntentBubble(@NonNull PendingIntent intent,
@NonNull Icon icon) {
if (intent == null) {
@@ -9086,31 +9128,61 @@
}
/**
- * @deprecated use {@link #createIntentBubble(PendingIntent, Icon)}
- * or {@link #createShortcutBubble(String)} instead.
+ * Sets the intent for the bubble.
+ *
+ * <p>The intent that will be used when the bubble is expanded. This will display the
+ * app content in a floating window over the existing foreground activity. The intent
+ * should point to a resizable activity. </p>
+ *
+ * @throws NullPointerException if intent is null.
+ * @throws IllegalStateException if this builder was created via
+ * {@link Builder#Builder(String)}.
*/
- @Deprecated
@NonNull
public BubbleMetadata.Builder setIntent(@NonNull PendingIntent intent) {
- if (intent == null) {
- throw new IllegalArgumentException("Bubble requires non-null pending intent");
+ if (mShortcutId != null) {
+ throw new IllegalStateException("Created as a shortcut bubble, cannot set a "
+ + "PendingIntent. Consider using "
+ + "BubbleMetadata.Builder(PendingIntent,Icon) instead.");
}
- mShortcutId = null;
+ if (intent == null) {
+ throw new NullPointerException("Bubble requires non-null pending intent");
+ }
mPendingIntent = intent;
return this;
}
/**
- * @deprecated use {@link #createIntentBubble(PendingIntent, Icon)}
- * or {@link #createShortcutBubble(String)} instead.
+ * Sets the icon for the bubble. Can only be used if the bubble was created
+ * via {@link Builder#Builder(PendingIntent, Icon)}.
+ *
+ * <p>The icon will be used to represent the bubble when it is collapsed. An icon
+ * should be representative of the content within the bubble. If your app produces
+ * multiple bubbles, the icon should be unique for each of them.</p>
+ *
+ * <p>It is recommended to use an {@link Icon} of type {@link Icon#TYPE_URI}
+ * or {@link Icon#TYPE_URI_ADAPTIVE_BITMAP}</p>
+ *
+ * @throws NullPointerException if icon is null.
+ * @throws IllegalStateException if this builder was created via
+ * {@link Builder#Builder(String)}.
*/
- @Deprecated
@NonNull
public BubbleMetadata.Builder setIcon(@NonNull Icon icon) {
- if (icon == null) {
- throw new IllegalArgumentException("Bubbles require non-null icon");
+ if (mShortcutId != null) {
+ throw new IllegalStateException("Created as a shortcut bubble, cannot set an "
+ + "Icon. Consider using "
+ + "BubbleMetadata.Builder(PendingIntent,Icon) instead.");
}
- mShortcutId = null;
+ if (icon == null) {
+ throw new NullPointerException("Bubbles require non-null icon");
+ }
+ if (icon.getType() != TYPE_URI_ADAPTIVE_BITMAP
+ && icon.getType() != TYPE_URI) {
+ Log.w(TAG, "Bubbles work best with icons of TYPE_URI or "
+ + "TYPE_URI_ADAPTIVE_BITMAP. "
+ + "In the future, using an icon of this type will be required.");
+ }
mIcon = icon;
return this;
}
@@ -9159,8 +9231,7 @@
}
/**
- * Sets whether the bubble will be posted in its expanded state (with the contents of
- * {@link #getBubbleIntent()} in a floating window).
+ * Sets whether the bubble will be posted in its expanded state.
*
* <p>This flag has no effect if the app posting the bubble is not in the foreground.
* The app is considered foreground if it is visible and on the screen, note that
@@ -9213,17 +9284,16 @@
/**
* Creates the {@link BubbleMetadata} defined by this builder.
*
- * @throws IllegalStateException if neither {@link #createShortcutBubble(String)} or
- * {@link #createIntentBubble(PendingIntent, Icon)} have been called on this builder.
+ * @throws NullPointerException if required elements have not been set.
*/
@NonNull
public BubbleMetadata build() {
if (mShortcutId == null && mPendingIntent == null) {
- throw new IllegalStateException(
+ throw new NullPointerException(
"Must supply pending intent or shortcut to bubble");
}
if (mShortcutId == null && mIcon == null) {
- throw new IllegalStateException(
+ throw new NullPointerException(
"Must supply an icon or shortcut for the bubble");
}
BubbleMetadata data = new BubbleMetadata(mPendingIntent, mDeleteIntent,
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index 9f5dee9..495bb6b 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -346,10 +346,9 @@
// We must load this from disk.
if (overlay) {
- apkAssets = ApkAssets.loadOverlayFromPath(overlayPathToIdmapPath(path),
- false /*system*/);
+ apkAssets = ApkAssets.loadOverlayFromPath(overlayPathToIdmapPath(path), 0 /*flags*/);
} else {
- apkAssets = ApkAssets.loadFromPath(path, false /*system*/, sharedLib);
+ apkAssets = ApkAssets.loadFromPath(path, sharedLib ? ApkAssets.PROPERTY_DYNAMIC : 0);
}
if (mLoadedApkAssets != null) {
@@ -1256,7 +1255,8 @@
* instance uses.
*/
@Override
- public void onLoadersChanged(Resources resources, List<ResourcesLoader> newLoader) {
+ public void onLoadersChanged(@NonNull Resources resources,
+ @NonNull List<ResourcesLoader> newLoader) {
synchronized (ResourcesManager.this) {
final ResourcesKey oldKey = findKeyForResourceImplLocked(resources.getImpl());
if (oldKey == null) {
@@ -1284,7 +1284,7 @@
* {@code loader} to apply any changes of the set of {@link ApkAssets}.
**/
@Override
- public void onLoaderUpdated(ResourcesLoader loader) {
+ public void onLoaderUpdated(@NonNull ResourcesLoader loader) {
synchronized (ResourcesManager.this) {
final ArrayMap<ResourcesImpl, ResourcesKey> updatedResourceImplKeys =
new ArrayMap<>();
diff --git a/core/java/android/app/admin/DevicePolicyKeyguardService.java b/core/java/android/app/admin/DevicePolicyKeyguardService.java
index 2ac5ebf..5b7e387 100644
--- a/core/java/android/app/admin/DevicePolicyKeyguardService.java
+++ b/core/java/android/app/admin/DevicePolicyKeyguardService.java
@@ -16,6 +16,7 @@
package android.app.admin;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Service;
import android.content.Intent;
@@ -27,7 +28,7 @@
/**
* Client interface for providing the SystemUI with secondary lockscreen information.
*
- * <p>An implementation must be provided by the device admin app when
+ * <p>An implementation must be provided by the Profile Owner when
* {@link DevicePolicyManager#setSecondaryLockscreenEnabled} is set to true and the service must be
* declared in the manifest as handling the action
* {@link DevicePolicyManager#ACTION_BIND_SECONDARY_LOCKSCREEN_SERVICE}, otherwise the keyguard
@@ -41,10 +42,11 @@
private final IKeyguardClient mClient = new IKeyguardClient.Stub() {
@Override
- public void onSurfaceReady(@Nullable IBinder hostInputToken, IKeyguardCallback callback) {
+ public void onCreateKeyguardSurface(@Nullable IBinder hostInputToken,
+ IKeyguardCallback callback) {
mCallback = callback;
SurfaceControlViewHost.SurfacePackage surfacePackage =
- DevicePolicyKeyguardService.this.onSurfaceReady(hostInputToken);
+ DevicePolicyKeyguardService.this.onCreateKeyguardSurface(hostInputToken);
if (mCallback != null) {
try {
@@ -63,13 +65,27 @@
}
/**
- * Called by keyguard once the host surface for the secondary lockscreen is ready to display
- * remote content.
+ * Called by keyguard once the host surface for the secondary lockscreen is created and ready to
+ * display remote content.
+ *
+ * <p>Implementations are expected to create a Surface hierarchy with view elements for the
+ * admin's desired secondary lockscreen UI, and optionally, interactive elements
+ * that will allow the user to dismiss the secondary lockscreen, subject to the implementation's
+ * requirements. The view hierarchy is expected to be embedded via the
+ * {@link SurfaceControlViewHost} APIs, and returned as a SurfacePackage via
+ * {@link SurfaceControlViewHost#getSurfacePackage}for the keyguard to reparent into its
+ * prepared SurfaceView.
+ *
+ * @param hostInputToken Token of the SurfaceView which will hosting the embedded hierarchy,
+ * primarily required by {@link SurfaceControlViewHost} for ANR reporting.
+ * It will be provided by the keyguard via
+ * {@link android.view.SurfaceView#getHostToken}.
* @return the {@link SurfaceControlViewHost.SurfacePackage} for the Surface the
* secondary lockscreen content is attached to.
*/
@Nullable
- public SurfaceControlViewHost.SurfacePackage onSurfaceReady(@Nullable IBinder hostInputToken) {
+ public SurfaceControlViewHost.SurfacePackage onCreateKeyguardSurface(
+ @NonNull IBinder hostInputToken) {
return null;
}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 37f1a65..51cfa31 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -7071,7 +7071,6 @@
*
* @hide
*/
- @SystemApi
public boolean hasDeviceIdentifierAccess(@NonNull String packageName, int pid, int uid) {
throwIfParentInstance("hasDeviceIdentifierAccess");
if (packageName == null) {
@@ -8658,11 +8657,11 @@
* @hide
*/
@SystemApi
- public boolean isSecondaryLockscreenEnabled(int userId) {
+ public boolean isSecondaryLockscreenEnabled(@NonNull UserHandle userHandle) {
throwIfParentInstance("isSecondaryLockscreenEnabled");
if (mService != null) {
try {
- return mService.isSecondaryLockscreenEnabled(userId);
+ return mService.isSecondaryLockscreenEnabled(userHandle);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -9388,9 +9387,9 @@
}
/**
- * Called by device owner or profile owner of secondary users that is affiliated with the
- * device to disable the status bar. Disabling the status bar blocks notifications, quick
- * settings and other screen overlays that allow escaping from a single use device.
+ * Called by device owner or profile owner of secondary users that is affiliated with the
+ * device to disable the status bar. Disabling the status bar blocks notifications and quick
+ * settings.
* <p>
* <strong>Note:</strong> This method has no effect for LockTask mode. The behavior of the
* status bar in LockTask mode can be configured with
@@ -11496,7 +11495,11 @@
/**
* Deprecated. Use {@code markProfileOwnerOnOrganizationOwnedDevice} instead.
- * Throws UnsupportedOperationException when called.
+ * When called by an app targeting SDK level {@link android.os.Build.VERSION_CODES#Q} or
+ * below, will behave the same as {@link #markProfileOwnerOnOrganizationOwnedDevice}.
+ *
+ * When called by an app targeting SDK level {@link android.os.Build.VERSION_CODES#R}
+ * or above, will throw an UnsupportedOperationException when called.
*
* @deprecated Use {@link #markProfileOwnerOnOrganizationOwnedDevice} instead.
*
@@ -11507,9 +11510,14 @@
@RequiresPermission(value = android.Manifest.permission.GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS,
conditional = true)
public void setProfileOwnerCanAccessDeviceIds(@NonNull ComponentName who) {
- throw new UnsupportedOperationException(
- "This method is deprecated. use markProfileOwnerOnOrganizationOwnedDevice instead"
- + ".");
+ ApplicationInfo ai = mContext.getApplicationInfo();
+ if (ai.targetSdkVersion > Build.VERSION_CODES.Q) {
+ throw new UnsupportedOperationException(
+ "This method is deprecated. use markProfileOwnerOnOrganizationOwnedDevice"
+ + " instead.");
+ } else {
+ markProfileOwnerOnOrganizationOwnedDevice(who);
+ }
}
/**
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 514677e..fc1eb0a 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -255,7 +255,7 @@
String[] getAccountTypesWithManagementDisabledAsUser(int userId, in boolean parent);
void setSecondaryLockscreenEnabled(in ComponentName who, boolean enabled);
- boolean isSecondaryLockscreenEnabled(int userId);
+ boolean isSecondaryLockscreenEnabled(in UserHandle userHandle);
void setLockTaskPackages(in ComponentName who, in String[] packages);
String[] getLockTaskPackages(in ComponentName who);
diff --git a/core/java/android/app/admin/IKeyguardClient.aidl b/core/java/android/app/admin/IKeyguardClient.aidl
index 4bfd990..9b2f3f4 100644
--- a/core/java/android/app/admin/IKeyguardClient.aidl
+++ b/core/java/android/app/admin/IKeyguardClient.aidl
@@ -23,5 +23,5 @@
* @hide
*/
interface IKeyguardClient {
- oneway void onSurfaceReady(in IBinder hostInputToken, in IKeyguardCallback keyguardCallback);
+ oneway void onCreateKeyguardSurface(in IBinder hostInputToken, in IKeyguardCallback keyguardCallback);
}
diff --git a/core/java/android/app/usage/UsageStats.java b/core/java/android/app/usage/UsageStats.java
index d06baed..4d73a61 100644
--- a/core/java/android/app/usage/UsageStats.java
+++ b/core/java/android/app/usage/UsageStats.java
@@ -27,6 +27,7 @@
import static android.app.usage.UsageEvents.Event.FOREGROUND_SERVICE_START;
import static android.app.usage.UsageEvents.Event.FOREGROUND_SERVICE_STOP;
import static android.app.usage.UsageEvents.Event.ROLLOVER_FOREGROUND_SERVICE;
+import static android.app.usage.UsageEvents.Event.USER_INTERACTION;
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
@@ -580,6 +581,18 @@
incrementServiceTimeUsed(timeStamp);
}
break;
+ case USER_INTERACTION:
+ if (hasForegroundActivity()) {
+ incrementTimeUsed(timeStamp);
+ } else {
+ mLastTimeUsed = timeStamp;
+ }
+ if (hasVisibleActivity()) {
+ incrementTimeVisible(timeStamp);
+ } else {
+ mLastTimeVisible = timeStamp;
+ }
+ break;
default:
break;
}
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index 0d66198..0a67802 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -204,6 +204,16 @@
/** @hide */
public static final int REASON_SUB_MASK = 0x00FF;
/**
+ * The reason for using the default main reason is unknown or undefined.
+ * @hide
+ */
+ public static final int REASON_SUB_DEFAULT_UNDEFINED = 0x0000;
+ /**
+ * The app was updated.
+ * @hide
+ */
+ public static final int REASON_SUB_DEFAULT_APP_UPDATE = 0x0001;
+ /**
* The app was interacted with in some way by the system.
* @hide
*/
@@ -1069,6 +1079,14 @@
switch (standbyReason & REASON_MAIN_MASK) {
case REASON_MAIN_DEFAULT:
sb.append("d");
+ switch (subReason) {
+ case REASON_SUB_DEFAULT_UNDEFINED:
+ // Historically, undefined didn't have a string, so don't add anything here.
+ break;
+ case REASON_SUB_DEFAULT_APP_UPDATE:
+ sb.append("-au");
+ break;
+ }
break;
case REASON_MAIN_FORCED_BY_SYSTEM:
sb.append("s");
diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java
index 0d461f5..8441287 100644
--- a/core/java/android/appwidget/AppWidgetManager.java
+++ b/core/java/android/appwidget/AppWidgetManager.java
@@ -1240,4 +1240,18 @@
throw e.rethrowFromSystemServer();
}
}
+
+ /**
+ * Note an app widget is tapped on.
+ * @param uid App UID.
+ * @param packageName App package name.
+ * @hide
+ */
+ public void noteAppWidgetTapped(int uid, @NonNull String packageName) {
+ try {
+ mService.noteAppWidgetTapped(uid, packageName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/core/java/android/bluetooth/BluetoothA2dp.java b/core/java/android/bluetooth/BluetoothA2dp.java
index b672a08..5374d6d 100644
--- a/core/java/android/bluetooth/BluetoothA2dp.java
+++ b/core/java/android/bluetooth/BluetoothA2dp.java
@@ -433,7 +433,7 @@
* is active
* @hide
*/
- @SystemApi
+ @UnsupportedAppUsage
@Nullable
@RequiresPermission(Manifest.permission.BLUETOOTH)
public BluetoothDevice getActiveDevice() {
@@ -462,7 +462,7 @@
* @return true if priority is set, false on error
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
return setConnectionPolicy(device, BluetoothAdapter.priorityToConnectionPolicy(priority));
@@ -481,7 +481,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setConnectionPolicy(@NonNull BluetoothDevice device,
@ConnectionPolicy int connectionPolicy) {
if (DBG) log("setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
@@ -517,7 +517,18 @@
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
- return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
+ try {
+ final IBluetoothA2dp service = getService();
+ if (service != null && isEnabled()
+ && isValidDevice(device)) {
+ return BluetoothAdapter.connectionPolicyToPriority(service.getPriority(device));
+ }
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
+ return BluetoothProfile.PRIORITY_OFF;
+ } catch (RemoteException e) {
+ Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
+ return BluetoothProfile.PRIORITY_OFF;
+ }
}
/**
@@ -532,7 +543,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
if (VDBG) log("getConnectionPolicy(" + device + ")");
try {
@@ -640,7 +651,7 @@
* @return the current codec status
* @hide
*/
- @SystemApi
+ @UnsupportedAppUsage
@Nullable
@RequiresPermission(Manifest.permission.BLUETOOTH)
public BluetoothCodecStatus getCodecStatus(@NonNull BluetoothDevice device) {
@@ -669,8 +680,8 @@
* @param codecConfig the codec configuration preference
* @hide
*/
- @SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @UnsupportedAppUsage
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public void setCodecConfigPreference(@NonNull BluetoothDevice device,
@NonNull BluetoothCodecConfig codecConfig) {
if (DBG) Log.d(TAG, "setCodecConfigPreference(" + device + ")");
@@ -699,8 +710,8 @@
* active A2DP Bluetooth device.
* @hide
*/
- @SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @UnsupportedAppUsage
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public void enableOptionalCodecs(@NonNull BluetoothDevice device) {
if (DBG) Log.d(TAG, "enableOptionalCodecs(" + device + ")");
verifyDeviceNotNull(device, "enableOptionalCodecs");
@@ -714,8 +725,8 @@
* active A2DP Bluetooth device.
* @hide
*/
- @SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @UnsupportedAppUsage
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public void disableOptionalCodecs(@NonNull BluetoothDevice device) {
if (DBG) Log.d(TAG, "disableOptionalCodecs(" + device + ")");
verifyDeviceNotNull(device, "disableOptionalCodecs");
@@ -755,7 +766,7 @@
* OPTIONAL_CODECS_SUPPORTED.
* @hide
*/
- @SystemApi
+ @UnsupportedAppUsage
@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
@OptionalCodecsSupportStatus
public int isOptionalCodecsSupported(@NonNull BluetoothDevice device) {
@@ -781,7 +792,7 @@
* OPTIONAL_CODECS_PREF_DISABLED.
* @hide
*/
- @SystemApi
+ @UnsupportedAppUsage
@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
@OptionalCodecsPreferenceStatus
public int isOptionalCodecsEnabled(@NonNull BluetoothDevice device) {
@@ -808,8 +819,8 @@
* OPTIONAL_CODECS_PREF_DISABLED.
* @hide
*/
- @SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @UnsupportedAppUsage
+ @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
public void setOptionalCodecsEnabled(@NonNull BluetoothDevice device,
@OptionalCodecsPreferenceStatus int value) {
verifyDeviceNotNull(device, "setOptionalCodecsEnabled");
diff --git a/core/java/android/bluetooth/BluetoothA2dpSink.java b/core/java/android/bluetooth/BluetoothA2dpSink.java
index ab49230..53f87e6 100755
--- a/core/java/android/bluetooth/BluetoothA2dpSink.java
+++ b/core/java/android/bluetooth/BluetoothA2dpSink.java
@@ -17,7 +17,7 @@
package android.bluetooth;
import android.Manifest;
-import android.annotation.Nullable;
+import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
@@ -120,7 +120,7 @@
* @return false on immediate error, true otherwise
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean connect(BluetoothDevice device) {
if (DBG) log("connect(" + device + ")");
final IBluetoothA2dpSink service = getService();
@@ -277,7 +277,7 @@
* @return true if priority is set, false on error
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
return setConnectionPolicy(device, BluetoothAdapter.priorityToConnectionPolicy(priority));
@@ -297,7 +297,7 @@
*/
@SystemApi
@RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
- public boolean setConnectionPolicy(@Nullable BluetoothDevice device,
+ public boolean setConnectionPolicy(@NonNull BluetoothDevice device,
@ConnectionPolicy int connectionPolicy) {
if (DBG) log("setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
final IBluetoothA2dpSink service = getService();
@@ -327,7 +327,7 @@
* @return priority of the device
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
@@ -346,7 +346,7 @@
*/
@SystemApi
@RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
- public @ConnectionPolicy int getConnectionPolicy(@Nullable BluetoothDevice device) {
+ public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
if (VDBG) log("getConnectionPolicy(" + device + ")");
final IBluetoothA2dpSink service = getService();
if (service != null && isEnabled() && isValidDevice(device)) {
@@ -371,7 +371,7 @@
*/
@SystemApi
@RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
- public boolean isAudioPlaying(@Nullable BluetoothDevice device) {
+ public boolean isAudioPlaying(@NonNull BluetoothDevice device) {
final IBluetoothA2dpSink service = getService();
if (service != null && isEnabled() && isValidDevice(device)) {
try {
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 608b563..4aad3cb 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -1224,7 +1224,7 @@
* @return true to indicate that the config file was successfully cleared
* @hide
*/
- @SystemApi
+ @UnsupportedAppUsage
@RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean factoryReset() {
try {
@@ -1517,8 +1517,9 @@
* @return true if the scan mode was set, false otherwise
* @hide
*/
- @SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @UnsupportedAppUsage(publicAlternatives = "Use {@link #ACTION_REQUEST_DISCOVERABLE}, which "
+ + "shows UI that confirms the user wants to go into discoverable mode.")
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public boolean setScanMode(@ScanMode int mode, long durationMillis) {
if (getState() != STATE_ON) {
return false;
@@ -1566,8 +1567,8 @@
* @return true if the scan mode was set, false otherwise
* @hide
*/
- @SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @UnsupportedAppUsage
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public boolean setScanMode(@ScanMode int mode) {
if (getState() != STATE_ON) {
return false;
@@ -1631,7 +1632,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public long getDiscoveryEndMillis() {
try {
mServiceLock.readLock().lock();
@@ -1883,7 +1884,6 @@
*
* @hide
*/
- @SystemApi
@RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean connectAllEnabledProfiles(@NonNull BluetoothDevice device) {
try {
@@ -1912,7 +1912,6 @@
*
* @hide
*/
- @SystemApi
@RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean disconnectAllEnabledProfiles(@NonNull BluetoothDevice device) {
try {
diff --git a/core/java/android/bluetooth/BluetoothCodecConfig.java b/core/java/android/bluetooth/BluetoothCodecConfig.java
index 93e76fa..d2a1535 100644
--- a/core/java/android/bluetooth/BluetoothCodecConfig.java
+++ b/core/java/android/bluetooth/BluetoothCodecConfig.java
@@ -18,7 +18,6 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
@@ -34,7 +33,6 @@
*
* {@hide}
*/
-@SystemApi
public final class BluetoothCodecConfig implements Parcelable {
// Add an entry for each source codec here.
// NOTE: The values should be same as those listed in the following file:
diff --git a/core/java/android/bluetooth/BluetoothCodecStatus.java b/core/java/android/bluetooth/BluetoothCodecStatus.java
index b6e7739..1e394b8 100644
--- a/core/java/android/bluetooth/BluetoothCodecStatus.java
+++ b/core/java/android/bluetooth/BluetoothCodecStatus.java
@@ -17,7 +17,6 @@
package android.bluetooth;
import android.annotation.Nullable;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -32,7 +31,6 @@
*
* {@hide}
*/
-@SystemApi
public final class BluetoothCodecStatus implements Parcelable {
/**
* Extra for the codec configuration intents of the individual profiles.
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index eab7a03..594e5ff 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -36,8 +36,6 @@
import android.os.RemoteException;
import android.util.Log;
-import com.android.internal.annotations.VisibleForTesting;
-
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.annotation.Retention;
@@ -1100,8 +1098,8 @@
* @return true on success, false on error
* @hide
*/
- @SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @UnsupportedAppUsage
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public boolean setAlias(@NonNull String alias) {
final IBluetooth service = sService;
if (service == null) {
@@ -1124,8 +1122,8 @@
* not have any battery reporting service, or return value is invalid
* @hide
*/
- @SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @UnsupportedAppUsage
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public int getBatteryLevel() {
final IBluetooth service = sService;
if (service == null) {
@@ -1215,8 +1213,8 @@
*
* @hide
*/
- @SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @UnsupportedAppUsage
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public boolean isBondingInitiatedLocally() {
final IBluetooth service = sService;
if (service == null) {
@@ -1539,7 +1537,7 @@
* @return true pin has been set false for error
* @hide
*/
- @SystemApi
+ @UnsupportedAppUsage
@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
public boolean setPin(@NonNull String pin) {
byte[] pinBytes = convertPinToBytes(pin);
@@ -1576,8 +1574,8 @@
*
* @hide
*/
- @SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @UnsupportedAppUsage
+ @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
public boolean cancelPairing() {
final IBluetooth service = sService;
if (service == null) {
@@ -1608,8 +1606,8 @@
* #ACCESS_UNKNOWN}, {@link #ACCESS_ALLOWED} or {@link #ACCESS_REJECTED}.
* @hide
*/
- @SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @UnsupportedAppUsage
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public @AccessPermission int getPhonebookAccessPermission() {
final IBluetooth service = sService;
if (service == null) {
@@ -1716,8 +1714,8 @@
* @return Whether the message access is allowed to this device.
* @hide
*/
- @SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @UnsupportedAppUsage
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public @AccessPermission int getMessageAccessPermission() {
final IBluetooth service = sService;
if (service == null) {
@@ -1766,7 +1764,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public @AccessPermission int getSimAccessPermission() {
final IBluetooth service = sService;
if (service == null) {
@@ -2021,7 +2019,7 @@
* @return the pin code as a UTF-8 byte array, or null if it is an invalid Bluetooth pin.
* @hide
*/
- @VisibleForTesting
+ @UnsupportedAppUsage
public static byte[] convertPinToBytes(String pin) {
if (pin == null) {
return null;
diff --git a/core/java/android/bluetooth/BluetoothHeadset.java b/core/java/android/bluetooth/BluetoothHeadset.java
index 1ba2bb5..6ce05f9 100644
--- a/core/java/android/bluetooth/BluetoothHeadset.java
+++ b/core/java/android/bluetooth/BluetoothHeadset.java
@@ -572,7 +572,22 @@
@RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN)
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
- return setConnectionPolicy(device, BluetoothAdapter.priorityToConnectionPolicy(priority));
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
+ if (priority != BluetoothProfile.PRIORITY_OFF
+ && priority != BluetoothProfile.PRIORITY_ON) {
+ return false;
+ }
+ try {
+ return service.setPriority(
+ device, BluetoothAdapter.priorityToConnectionPolicy(priority));
+ } catch (RemoteException e) {
+ Log.e(TAG, Log.getStackTraceString(new Throwable()));
+ return false;
+ }
+ }
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
+ return false;
}
/**
@@ -588,7 +603,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setConnectionPolicy(@NonNull BluetoothDevice device,
@ConnectionPolicy int connectionPolicy) {
if (DBG) log("setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
@@ -624,7 +639,17 @@
@RequiresPermission(Manifest.permission.BLUETOOTH)
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
- return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
+ final IBluetoothHeadset service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
+ try {
+ return BluetoothAdapter.connectionPolicyToPriority(service.getPriority(device));
+ } catch (RemoteException e) {
+ Log.e(TAG, Log.getStackTraceString(new Throwable()));
+ return BluetoothProfile.PRIORITY_OFF;
+ }
+ }
+ if (service == null) Log.w(TAG, "Proxy not attached to service");
+ return BluetoothProfile.PRIORITY_OFF;
}
/**
@@ -639,7 +664,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
if (VDBG) log("getConnectionPolicy(" + device + ")");
final IBluetoothHeadset service = mService;
@@ -1126,16 +1151,13 @@
/**
* Get the connected device that is active.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH}
- * permission.
- *
* @return the connected device that is active or null if no device
* is active.
* @hide
*/
- @SystemApi
+ @UnsupportedAppUsage
@Nullable
- @RequiresPermission(android.Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public BluetoothDevice getActiveDevice() {
if (VDBG) {
Log.d(TAG, "getActiveDevice");
diff --git a/core/java/android/bluetooth/BluetoothHeadsetClient.java b/core/java/android/bluetooth/BluetoothHeadsetClient.java
index fbda9e9..85e0e08 100644
--- a/core/java/android/bluetooth/BluetoothHeadsetClient.java
+++ b/core/java/android/bluetooth/BluetoothHeadsetClient.java
@@ -17,6 +17,7 @@
package android.bluetooth;
import android.Manifest;
+import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
@@ -442,6 +443,8 @@
* @param device a remote device we want connect to
* @return <code>true</code> if command has been issued successfully; <code>false</code>
* otherwise; upon completion HFP sends {@link #ACTION_CONNECTION_STATE_CHANGED} intent.
+ *
+ * @hide
*/
@UnsupportedAppUsage
public boolean connect(BluetoothDevice device) {
@@ -466,6 +469,8 @@
* @param device a remote device we want disconnect
* @return <code>true</code> if command has been issued successfully; <code>false</code>
* otherwise; upon completion HFP sends {@link #ACTION_CONNECTION_STATE_CHANGED} intent.
+ *
+ * @hide
*/
@UnsupportedAppUsage
public boolean disconnect(BluetoothDevice device) {
@@ -564,7 +569,7 @@
* @return true if priority is set, false on error
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
return setConnectionPolicy(device, BluetoothAdapter.priorityToConnectionPolicy(priority));
@@ -583,8 +588,8 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
- public boolean setConnectionPolicy(BluetoothDevice device,
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public boolean setConnectionPolicy(@NonNull BluetoothDevice device,
@ConnectionPolicy int connectionPolicy) {
if (DBG) log("setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
final IBluetoothHeadsetClient service =
@@ -634,7 +639,7 @@
*/
@SystemApi
@RequiresPermission(Manifest.permission.BLUETOOTH)
- public @ConnectionPolicy int getConnectionPolicy(BluetoothDevice device) {
+ public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
if (VDBG) log("getConnectionPolicy(" + device + ")");
final IBluetoothHeadsetClient service =
getService();
diff --git a/core/java/android/bluetooth/BluetoothHearingAid.java b/core/java/android/bluetooth/BluetoothHearingAid.java
index 38498bc..e0674d7 100644
--- a/core/java/android/bluetooth/BluetoothHearingAid.java
+++ b/core/java/android/bluetooth/BluetoothHearingAid.java
@@ -162,13 +162,11 @@
* the state. Users can get the connection state of the profile
* from this intent.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
- * permission.
- *
* @param device Remote Bluetooth Device
* @return false on immediate error, true otherwise
* @hide
*/
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean connect(BluetoothDevice device) {
if (DBG) log("connect(" + device + ")");
final IBluetoothHearingAid service = getService();
@@ -202,13 +200,11 @@
* {@link #STATE_DISCONNECTING} can be used to distinguish between the
* two scenarios.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
- * permission.
- *
* @param device Remote Bluetooth Device
* @return false on immediate error, true otherwise
* @hide
*/
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean disconnect(BluetoothDevice device) {
if (DBG) log("disconnect(" + device + ")");
final IBluetoothHearingAid service = getService();
@@ -327,15 +323,12 @@
/**
* Get the connected physical Hearing Aid devices that are active
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH}
- * permission.
- *
* @return the list of active devices. The first element is the left active
* device; the second element is the right active device. If either or both side
* is not active, it will be null on that position. Returns empty list on error.
* @hide
*/
- @SystemApi
+ @UnsupportedAppUsage
@RequiresPermission(Manifest.permission.BLUETOOTH)
public @NonNull List<BluetoothDevice> getActiveDevices() {
if (VDBG) log("getActiveDevices()");
@@ -363,7 +356,7 @@
* @return true if priority is set, false on error
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
return setConnectionPolicy(device, BluetoothAdapter.priorityToConnectionPolicy(priority));
@@ -382,7 +375,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setConnectionPolicy(@NonNull BluetoothDevice device,
@ConnectionPolicy int connectionPolicy) {
if (DBG) log("setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
@@ -414,7 +407,7 @@
* @return priority of the device
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
@@ -432,7 +425,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
if (VDBG) log("getConnectionPolicy(" + device + ")");
final IBluetoothHearingAid service = getService();
@@ -496,17 +489,20 @@
}
/**
- * Get the CustomerId of the device.
+ * Get the HiSyncId (unique hearing aid device identifier) of the device.
+ *
+ * <a href=https://source.android.com/devices/bluetooth/asha#hisyncid>HiSyncId documentation
+ * can be found here</a>
*
* @param device Bluetooth device
- * @return the CustomerId of the device
+ * @return the HiSyncId of the device
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
- public long getHiSyncId(@Nullable BluetoothDevice device) {
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public long getHiSyncId(@NonNull BluetoothDevice device) {
if (VDBG) {
- log("getCustomerId(" + device + ")");
+ log("getHiSyncId(" + device + ")");
}
final IBluetoothHearingAid service = getService();
try {
diff --git a/core/java/android/bluetooth/BluetoothHidHost.java b/core/java/android/bluetooth/BluetoothHidHost.java
index e9e1f68..9561d93 100644
--- a/core/java/android/bluetooth/BluetoothHidHost.java
+++ b/core/java/android/bluetooth/BluetoothHidHost.java
@@ -263,13 +263,11 @@
* the state. Users can get the connection state of the profile
* from this intent.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
- * permission.
- *
* @param device Remote Bluetooth Device
* @return false on immediate error, true otherwise
* @hide
*/
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean connect(BluetoothDevice device) {
if (DBG) log("connect(" + device + ")");
final IBluetoothHidHost service = getService();
@@ -303,13 +301,11 @@
* {@link #STATE_DISCONNECTING} can be used to distinguish between the
* two scenarios.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
- * permission.
- *
* @param device Remote Bluetooth Device
* @return false on immediate error, true otherwise
* @hide
*/
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean disconnect(BluetoothDevice device) {
if (DBG) log("disconnect(" + device + ")");
final IBluetoothHidHost service = getService();
@@ -327,7 +323,10 @@
/**
* {@inheritDoc}
+ *
+ * @hide
*/
+ @SystemApi
@Override
@RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public @NonNull List<BluetoothDevice> getConnectedDevices() {
@@ -368,7 +367,10 @@
/**
* {@inheritDoc}
+ *
+ * @hide
*/
+ @SystemApi
@Override
@RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public int getConnectionState(@NonNull BluetoothDevice device) {
@@ -400,7 +402,7 @@
* @return true if priority is set, false on error
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
return setConnectionPolicy(device, BluetoothAdapter.priorityToConnectionPolicy(priority));
@@ -419,7 +421,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setConnectionPolicy(@NonNull BluetoothDevice device,
@ConnectionPolicy int connectionPolicy) {
if (DBG) log("setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
@@ -453,7 +455,7 @@
* @return priority of the device
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
@@ -471,7 +473,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
if (VDBG) log("getConnectionPolicy(" + device + ")");
if (device == null) {
diff --git a/core/java/android/bluetooth/BluetoothMap.java b/core/java/android/bluetooth/BluetoothMap.java
index cc2b615..14a71c4 100644
--- a/core/java/android/bluetooth/BluetoothMap.java
+++ b/core/java/android/bluetooth/BluetoothMap.java
@@ -18,7 +18,6 @@
import android.Manifest;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
@@ -328,7 +327,7 @@
* @return true if priority is set, false on error
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
return setConnectionPolicy(device, BluetoothAdapter.priorityToConnectionPolicy(priority));
@@ -347,8 +346,8 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
- public boolean setConnectionPolicy(@Nullable BluetoothDevice device,
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public boolean setConnectionPolicy(@NonNull BluetoothDevice device,
@ConnectionPolicy int connectionPolicy) {
if (DBG) log("setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
final IBluetoothMap service = getService();
@@ -378,7 +377,7 @@
* @return priority of the device
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
@@ -396,8 +395,8 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
- public @ConnectionPolicy int getConnectionPolicy(@Nullable BluetoothDevice device) {
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
if (VDBG) log("getConnectionPolicy(" + device + ")");
final IBluetoothMap service = getService();
if (service != null && isEnabled() && isValidDevice(device)) {
diff --git a/core/java/android/bluetooth/BluetoothMapClient.java b/core/java/android/bluetooth/BluetoothMapClient.java
index 8d2aadd..19240dc 100644
--- a/core/java/android/bluetooth/BluetoothMapClient.java
+++ b/core/java/android/bluetooth/BluetoothMapClient.java
@@ -17,6 +17,7 @@
package android.bluetooth;
import android.Manifest;
+import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.app.PendingIntent;
@@ -140,7 +141,10 @@
/**
* Initiate connection. Initiation of outgoing connections is not
* supported for MAP server.
+ *
+ * @hide
*/
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean connect(BluetoothDevice device) {
if (DBG) Log.d(TAG, "connect(" + device + ")" + "for MAPS MCE");
final IBluetoothMapClient service = getService();
@@ -162,7 +166,10 @@
*
* @param device Remote Bluetooth Device
* @return false on error, true otherwise
+ *
+ * @hide
*/
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean disconnect(BluetoothDevice device) {
if (DBG) Log.d(TAG, "disconnect(" + device + ")");
final IBluetoothMapClient service = getService();
@@ -251,7 +258,7 @@
* @return true if priority is set, false on error
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) Log.d(TAG, "setPriority(" + device + ", " + priority + ")");
return setConnectionPolicy(device, BluetoothAdapter.priorityToConnectionPolicy(priority));
@@ -270,8 +277,8 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
- public boolean setConnectionPolicy(BluetoothDevice device,
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public boolean setConnectionPolicy(@NonNull BluetoothDevice device,
@ConnectionPolicy int connectionPolicy) {
if (DBG) Log.d(TAG, "setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
final IBluetoothMapClient service = getService();
@@ -301,7 +308,7 @@
* @return priority of the device
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public int getPriority(BluetoothDevice device) {
if (VDBG) Log.d(TAG, "getPriority(" + device + ")");
return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
@@ -319,8 +326,8 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
- public @ConnectionPolicy int getConnectionPolicy(BluetoothDevice device) {
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
if (VDBG) Log.d(TAG, "getConnectionPolicy(" + device + ")");
final IBluetoothMapClient service = getService();
if (service != null && isEnabled() && isValidDevice(device)) {
diff --git a/core/java/android/bluetooth/BluetoothPan.java b/core/java/android/bluetooth/BluetoothPan.java
index ec63fd0..a80f5b7 100644
--- a/core/java/android/bluetooth/BluetoothPan.java
+++ b/core/java/android/bluetooth/BluetoothPan.java
@@ -19,7 +19,6 @@
import android.Manifest;
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
@@ -30,7 +29,6 @@
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
-import android.util.CloseGuard;
import android.util.Log;
import java.lang.annotation.Retention;
@@ -51,11 +49,10 @@
* @hide
*/
@SystemApi
-public final class BluetoothPan implements BluetoothProfile, AutoCloseable {
+public final class BluetoothPan implements BluetoothProfile {
private static final String TAG = "BluetoothPan";
private static final boolean DBG = true;
private static final boolean VDBG = false;
- private CloseGuard mCloseGuard;
/**
* Intent used to broadcast the change in connection state of the Pan
@@ -168,15 +165,13 @@
mAdapter = BluetoothAdapter.getDefaultAdapter();
mContext = context;
mProfileConnector.connect(context, listener);
- mCloseGuard = new CloseGuard();
- mCloseGuard.open("close");
}
/**
* Closes the connection to the service and unregisters callbacks
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH)
- public void close() {
+ @UnsupportedAppUsage
+ void close() {
if (VDBG) log("close()");
mProfileConnector.disconnect();
}
@@ -185,11 +180,8 @@
return mProfileConnector.getService();
}
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ /** @hide */
protected void finalize() {
- if (mCloseGuard != null) {
- mCloseGuard.warnIfOpen();
- }
close();
}
@@ -203,9 +195,6 @@
* the state. Users can get the connection state of the profile
* from this intent.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
- * permission.
- *
* @param device Remote Bluetooth Device
* @return false on immediate error, true otherwise
* @hide
@@ -244,9 +233,6 @@
* {@link #STATE_DISCONNECTING} can be used to distinguish between the
* two scenarios.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
- * permission.
- *
* @param device Remote Bluetooth Device
* @return false on immediate error, true otherwise
* @hide
@@ -280,7 +266,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setConnectionPolicy(@NonNull BluetoothDevice device,
@ConnectionPolicy int connectionPolicy) {
if (DBG) log("setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
@@ -304,8 +290,11 @@
/**
* {@inheritDoc}
+ * @hide
*/
+ @SystemApi
@Override
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public @NonNull List<BluetoothDevice> getConnectedDevices() {
if (VDBG) log("getConnectedDevices()");
final IBluetoothPan service = getService();
@@ -344,10 +333,12 @@
/**
* {@inheritDoc}
+ * @hide
*/
+ @SystemApi
@Override
- @RequiresPermission(Manifest.permission.BLUETOOTH)
- public int getConnectionState(@Nullable BluetoothDevice device) {
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public int getConnectionState(@NonNull BluetoothDevice device) {
if (VDBG) log("getState(" + device + ")");
final IBluetoothPan service = getService();
if (service != null && isEnabled() && isValidDevice(device)) {
@@ -366,8 +357,10 @@
* Turns on/off bluetooth tethering
*
* @param value is whether to enable or disable bluetooth tethering
+ * @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @SystemApi
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public void setBluetoothTethering(boolean value) {
String pkgName = mContext.getOpPackageName();
if (DBG) log("setBluetoothTethering(" + value + "), calling package:" + pkgName);
@@ -385,8 +378,10 @@
* Determines whether tethering is enabled
*
* @return true if tethering is on, false if not or some error occurred
+ * @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @SystemApi
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean isTetheringOn() {
if (VDBG) log("isTetheringOn()");
final IBluetoothPan service = getService();
diff --git a/core/java/android/bluetooth/BluetoothPbap.java b/core/java/android/bluetooth/BluetoothPbap.java
index 277a5a8..d58a893 100644
--- a/core/java/android/bluetooth/BluetoothPbap.java
+++ b/core/java/android/bluetooth/BluetoothPbap.java
@@ -18,7 +18,6 @@
import android.Manifest;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SuppressLint;
@@ -239,7 +238,7 @@
@SystemApi
@Override
@RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
- public @BtProfileState int getConnectionState(@Nullable BluetoothDevice device) {
+ public @BtProfileState int getConnectionState(@NonNull BluetoothDevice device) {
log("getConnectionState: device=" + device);
try {
final IBluetoothPbap service = mService;
diff --git a/core/java/android/bluetooth/BluetoothPbapClient.java b/core/java/android/bluetooth/BluetoothPbapClient.java
index 9563c68..d3452ff 100644
--- a/core/java/android/bluetooth/BluetoothPbapClient.java
+++ b/core/java/android/bluetooth/BluetoothPbapClient.java
@@ -17,6 +17,7 @@
package android.bluetooth;
import android.Manifest;
+import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.content.Context;
@@ -101,7 +102,10 @@
* @param device a remote device we want connect to
* @return <code>true</code> if command has been issued successfully; <code>false</code>
* otherwise;
+ *
+ * @hide
*/
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean connect(BluetoothDevice device) {
if (DBG) {
log("connect(" + device + ") for PBAP Client.");
@@ -126,7 +130,10 @@
*
* @param device Remote Bluetooth Device
* @return false on error, true otherwise
+ *
+ * @hide
*/
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean disconnect(BluetoothDevice device) {
if (DBG) {
log("disconnect(" + device + ")" + new Exception());
@@ -251,7 +258,7 @@
* @return true if priority is set, false on error
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
return setConnectionPolicy(device, BluetoothAdapter.priorityToConnectionPolicy(priority));
@@ -270,8 +277,8 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
- public boolean setConnectionPolicy(BluetoothDevice device,
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public boolean setConnectionPolicy(@NonNull BluetoothDevice device,
@ConnectionPolicy int connectionPolicy) {
if (DBG) {
log("setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
@@ -305,7 +312,7 @@
* @return priority of the device
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
@@ -323,8 +330,8 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
- public @ConnectionPolicy int getConnectionPolicy(BluetoothDevice device) {
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) {
if (VDBG) {
log("getConnectionPolicy(" + device + ")");
}
diff --git a/core/java/android/bluetooth/BluetoothSap.java b/core/java/android/bluetooth/BluetoothSap.java
index bfc3a4d..6e03481 100644
--- a/core/java/android/bluetooth/BluetoothSap.java
+++ b/core/java/android/bluetooth/BluetoothSap.java
@@ -310,7 +310,7 @@
* @return true if priority is set, false on error
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
return setConnectionPolicy(device, BluetoothAdapter.priorityToConnectionPolicy(priority));
@@ -329,7 +329,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public boolean setConnectionPolicy(BluetoothDevice device,
@ConnectionPolicy int connectionPolicy) {
if (DBG) log("setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
@@ -360,7 +360,7 @@
* @return priority of the device
* @hide
*/
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
return BluetoothAdapter.connectionPolicyToPriority(getConnectionPolicy(device));
@@ -378,7 +378,7 @@
* @hide
*/
@SystemApi
- @RequiresPermission(Manifest.permission.BLUETOOTH)
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
public @ConnectionPolicy int getConnectionPolicy(BluetoothDevice device) {
if (VDBG) log("getConnectionPolicy(" + device + ")");
final IBluetoothSap service = getService();
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index d8e8b27..65eb642 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -1585,6 +1585,10 @@
* This method is typically used when the provider implements more dynamic
* access controls that cannot be expressed with {@code <path-permission>}
* style static rules.
+ * <p>
+ * Because validation of these dynamic access controls has significant
+ * system health impact, this feature is only available to providers that
+ * are built into the system.
*
* @param uri the {@link Uri} to perform an access check on.
* @param uid the UID to check the permission for.
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index b134c37..7510ce7 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -1357,8 +1357,28 @@
}
}
- /** {@hide} */
+ /**
+ * Perform a detailed internal check on a {@link Uri} to determine if a UID
+ * is able to access it with specific mode flags.
+ * <p>
+ * This method is typically used when the provider implements more dynamic
+ * access controls that cannot be expressed with {@code <path-permission>}
+ * style static rules.
+ * <p>
+ * Because validation of these dynamic access controls has significant
+ * system health impact, this feature is only available to providers that
+ * are built into the system.
+ *
+ * @param uri the {@link Uri} to perform an access check on.
+ * @param uid the UID to check the permission for.
+ * @param modeFlags the access flags to use for the access check, such as
+ * {@link Intent#FLAG_GRANT_READ_URI_PERMISSION}.
+ * @return {@link PackageManager#PERMISSION_GRANTED} if access is allowed,
+ * otherwise {@link PackageManager#PERMISSION_DENIED}.
+ * @hide
+ */
@Override
+ @SystemApi
public int checkUriPermission(@NonNull Uri uri, int uid, @Intent.AccessUriMode int modeFlags) {
Objects.requireNonNull(uri, "uri");
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 6f46066..2fe935e 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3987,10 +3987,10 @@
public static final String NETWORK_STACK_SERVICE = "network_stack";
/**
- * Use with {@link android.os.ServiceManager.getService()} to retrieve a
- * {@link ITetheringConnector} IBinder for communicating with the tethering service
+ * Use with {@link #getSystemService(String)} to retrieve a {@link android.net.TetheringManager}
+ * for managing tethering functions.
* @hide
- * @see TetheringClient
+ * @see android.net.TetheringManager
*/
@SystemApi
public static final String TETHERING_SERVICE = "tethering";
@@ -4065,8 +4065,6 @@
*/
public static final String NETWORK_STATS_SERVICE = "netstats";
/** {@hide} */
- @SystemApi
- @SuppressLint("ServiceName")
public static final String NETWORK_POLICY_SERVICE = "netpolicy";
/** {@hide} */
public static final String NETWORK_WATCHLIST_SERVICE = "network_watchlist";
@@ -5104,7 +5102,6 @@
* {@link TelephonyRegistryManager}.
* @hide
*/
- @SystemApi
public static final String TELEPHONY_REGISTRY_SERVICE = "telephony_registry";
/**
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index b52034f..5bad055 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -743,8 +743,6 @@
void setMimeGroup(String packageName, String group, in List<String> mimeTypes);
- void clearMimeGroup(String packageName, String group);
-
List<String> getMimeGroup(String packageName, String group);
boolean isAutoRevokeWhitelisted(String packageName);
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 2c79022..9f151cf 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -3399,6 +3399,7 @@
* @hide
*/
@SystemApi
+ @TestApi
public static final int FLAG_PERMISSION_ONE_TIME = 1 << 16;
/**
@@ -7894,10 +7895,14 @@
}
/**
- * Sets MIME group's MIME types
+ * Sets MIME group's MIME types.
*
- * @param mimeGroup MIME group to modify
- * @param mimeTypes new MIME types contained by MIME group
+ * Libraries should use a reverse-DNS prefix followed by a ':' character and library-specific
+ * group name to avoid namespace collisions, e.g. "com.example:myFeature".
+ *
+ * @param mimeGroup MIME group to modify.
+ * @param mimeTypes new MIME types contained by MIME group.
+ * @throws IllegalArgumentException if the MIME group was not declared in the manifest.
*/
public void setMimeGroup(@NonNull String mimeGroup, @NonNull Set<String> mimeTypes) {
throw new UnsupportedOperationException(
@@ -7905,22 +7910,16 @@
}
/**
- * Clears MIME group by removing all MIME types from it
+ * Gets all MIME types contained by MIME group.
*
- * @param mimeGroup MIME group to clear
- */
- public void clearMimeGroup(@NonNull String mimeGroup) {
- throw new UnsupportedOperationException(
- "clearMimeGroup not implemented in subclass");
- }
-
- /**
- * Gets all MIME types that MIME group contains
+ * Libraries should use a reverse-DNS prefix followed by a ':' character and library-specific
+ * group name to avoid namespace collisions, e.g. "com.example:myFeature".
*
- * @return MIME types contained by the MIME group,
- * or null if the MIME group was not declared in the manifest.
+ * @param mimeGroup MIME group to retrieve.
+ * @return MIME types contained by the MIME group.
+ * @throws IllegalArgumentException if the MIME group was not declared in the manifest.
*/
- @Nullable
+ @NonNull
public Set<String> getMimeGroup(@NonNull String mimeGroup) {
throw new UnsupportedOperationException(
"getMimeGroup not implemented in subclass");
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 18f1343..20ddba4 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -1443,7 +1443,7 @@
try {
try {
apkAssets = fd != null
- ? ApkAssets.loadFromFd(fd, debugPathName, false, false)
+ ? ApkAssets.loadFromFd(fd, debugPathName, 0 /* flags */, null /* assets */)
: ApkAssets.loadFromPath(apkPath);
} catch (IOException e) {
throw new PackageParserException(INSTALL_PARSE_FAILED_NOT_APK,
diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
index 4c6da03..27399e4 100644
--- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
+++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java
@@ -220,7 +220,7 @@
try {
try {
apkAssets = fd != null
- ? ApkAssets.loadFromFd(fd, debugPathName, false, false)
+ ? ApkAssets.loadFromFd(fd, debugPathName, 0 /* flags */, null /* assets */)
: ApkAssets.loadFromPath(apkPath);
} catch (IOException e) {
throw new PackageParser.PackageParserException(
diff --git a/core/java/android/content/res/ApkAssets.java b/core/java/android/content/res/ApkAssets.java
index 8db2785..bc41806 100644
--- a/core/java/android/content/res/ApkAssets.java
+++ b/core/java/android/content/res/ApkAssets.java
@@ -15,17 +15,20 @@
*/
package android.content.res;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.om.OverlayableInfo;
+import android.content.res.loader.AssetsProvider;
import android.content.res.loader.ResourcesProvider;
-import android.text.TextUtils;
import com.android.internal.annotations.GuardedBy;
import java.io.FileDescriptor;
import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.Objects;
/**
@@ -39,14 +42,79 @@
* @hide
*/
public final class ApkAssets {
- @GuardedBy("this") private final long mNativePtr;
+
+ /**
+ * The apk assets contains framework resource values specified by the system.
+ * This allows some functions to filter out this package when computing what
+ * configurations/resources are available.
+ */
+ public static final int PROPERTY_SYSTEM = 1 << 0;
+
+ /**
+ * The apk assets is a shared library or was loaded as a shared library by force.
+ * The package ids of dynamic apk assets are assigned at runtime instead of compile time.
+ */
+ public static final int PROPERTY_DYNAMIC = 1 << 1;
+
+ /**
+ * The apk assets has been loaded dynamically using a {@link ResourcesProvider}.
+ * Loader apk assets overlay resources like RROs except they are not backed by an idmap.
+ */
+ public static final int PROPERTY_LOADER = 1 << 2;
+
+ /**
+ * The apk assets is a RRO.
+ * An RRO overlays resource values of its target package.
+ */
+ private static final int PROPERTY_OVERLAY = 1 << 3;
+
+ /** Flags that change the behavior of loaded apk assets. */
+ @IntDef(prefix = { "PROPERTY_" }, value = {
+ PROPERTY_SYSTEM,
+ PROPERTY_DYNAMIC,
+ PROPERTY_LOADER,
+ PROPERTY_OVERLAY,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface PropertyFlags {}
+
+ /** The path used to load the apk assets represents an APK file. */
+ private static final int FORMAT_APK = 0;
+
+ /** The path used to load the apk assets represents an idmap file. */
+ private static final int FORMAT_IDMAP = 1;
+
+ /** The path used to load the apk assets represents an resources.arsc file. */
+ private static final int FORMAT_ARSC = 2;
+
+ /** the path used to load the apk assets represents a directory. */
+ private static final int FORMAT_DIR = 3;
+
+ // Format types that change how the apk assets are loaded.
+ @IntDef(prefix = { "FORMAT_" }, value = {
+ FORMAT_APK,
+ FORMAT_IDMAP,
+ FORMAT_ARSC,
+ FORMAT_DIR
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface FormatType {}
+
+ @GuardedBy("this")
+ private final long mNativePtr;
@Nullable
- @GuardedBy("this") private final StringBlock mStringBlock;
+ @GuardedBy("this")
+ private final StringBlock mStringBlock;
- @GuardedBy("this") private boolean mOpen = true;
+ @GuardedBy("this")
+ private boolean mOpen = true;
- private final boolean mForLoader;
+ @PropertyFlags
+ private final int mFlags;
+
+ @Nullable
+ private final AssetsProvider mAssets;
/**
* Creates a new ApkAssets instance from the given path on disk.
@@ -56,59 +124,77 @@
* @throws IOException if a disk I/O error or parsing error occurred.
*/
public static @NonNull ApkAssets loadFromPath(@NonNull String path) throws IOException {
- return new ApkAssets(path, false /*system*/, false /*forceSharedLib*/, false /*overlay*/,
- false /*arscOnly*/, false /*forLoader*/);
+ return loadFromPath(path, 0 /* flags */);
}
/**
* Creates a new ApkAssets instance from the given path on disk.
*
* @param path The path to an APK on disk.
- * @param system When true, the APK is loaded as a system APK (framework).
+ * @param flags flags that change the behavior of loaded apk assets
* @return a new instance of ApkAssets.
* @throws IOException if a disk I/O error or parsing error occurred.
*/
- public static @NonNull ApkAssets loadFromPath(@NonNull String path, boolean system)
+ public static @NonNull ApkAssets loadFromPath(@NonNull String path, @PropertyFlags int flags)
throws IOException {
- return new ApkAssets(path, system, false /*forceSharedLib*/, false /*overlay*/,
- false /*arscOnly*/, false /*forLoader*/);
+ return new ApkAssets(FORMAT_APK, path, flags, null /* assets */);
}
/**
* Creates a new ApkAssets instance from the given path on disk.
*
* @param path The path to an APK on disk.
- * @param system When true, the APK is loaded as a system APK (framework).
- * @param forceSharedLibrary When true, any packages within the APK with package ID 0x7f are
- * loaded as a shared library.
+ * @param flags flags that change the behavior of loaded apk assets
+ * @param assets The assets provider that overrides the loading of file-based resources
* @return a new instance of ApkAssets.
* @throws IOException if a disk I/O error or parsing error occurred.
*/
- public static @NonNull ApkAssets loadFromPath(@NonNull String path, boolean system,
- boolean forceSharedLibrary) throws IOException {
- return new ApkAssets(path, system, forceSharedLibrary, false /*overlay*/,
- false /*arscOnly*/, false /*forLoader*/);
+ public static @NonNull ApkAssets loadFromPath(@NonNull String path, @PropertyFlags int flags,
+ @Nullable AssetsProvider assets) throws IOException {
+ return new ApkAssets(FORMAT_APK, path, flags, assets);
}
/**
- * Creates a new ApkAssets instance from the given file descriptor. Not for use by applications.
+ * Creates a new ApkAssets instance from the given file descriptor.
*
* Performs a dup of the underlying fd, so you must take care of still closing
* the FileDescriptor yourself (and can do that whenever you want).
*
* @param fd The FileDescriptor of an open, readable APK.
* @param friendlyName The friendly name used to identify this ApkAssets when logging.
- * @param system When true, the APK is loaded as a system APK (framework).
- * @param forceSharedLibrary When true, any packages within the APK with package ID 0x7f are
- * loaded as a shared library.
+ * @param flags flags that change the behavior of loaded apk assets
+ * @param assets The assets provider that overrides the loading of file-based resources
* @return a new instance of ApkAssets.
* @throws IOException if a disk I/O error or parsing error occurred.
*/
public static @NonNull ApkAssets loadFromFd(@NonNull FileDescriptor fd,
- @NonNull String friendlyName, boolean system, boolean forceSharedLibrary)
+ @NonNull String friendlyName, @PropertyFlags int flags,
+ @Nullable AssetsProvider assets) throws IOException {
+ return new ApkAssets(FORMAT_APK, fd, friendlyName, flags, assets);
+ }
+
+ /**
+ * Creates a new ApkAssets instance from the given file descriptor.
+ *
+ * Performs a dup of the underlying fd, so you must take care of still closing
+ * the FileDescriptor yourself (and can do that whenever you want).
+ *
+ * @param fd The FileDescriptor of an open, readable APK.
+ * @param friendlyName The friendly name used to identify this ApkAssets when logging.
+ * @param offset The location within the file that the apk starts. This must be 0 if length is
+ * {@link AssetFileDescriptor#UNKNOWN_LENGTH}.
+ * @param length The number of bytes of the apk, or {@link AssetFileDescriptor#UNKNOWN_LENGTH}
+ * if it extends to the end of the file.
+ * @param flags flags that change the behavior of loaded apk assets
+ * @param assets The assets provider that overrides the loading of file-based resources
+ * @return a new instance of ApkAssets.
+ * @throws IOException if a disk I/O error or parsing error occurred.
+ */
+ public static @NonNull ApkAssets loadFromFd(@NonNull FileDescriptor fd,
+ @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags,
+ @Nullable AssetsProvider assets)
throws IOException {
- return new ApkAssets(fd, friendlyName, system, forceSharedLibrary, false /*arscOnly*/,
- false /*forLoader*/);
+ return new ApkAssets(FORMAT_APK, fd, friendlyName, offset, length, flags, assets);
}
/**
@@ -116,97 +202,124 @@
* is encoded within the IDMAP.
*
* @param idmapPath Path to the IDMAP of an overlay APK.
- * @param system When true, the APK is loaded as a system APK (framework).
+ * @param flags flags that change the behavior of loaded apk assets
* @return a new instance of ApkAssets.
* @throws IOException if a disk I/O error or parsing error occurred.
*/
- public static @NonNull ApkAssets loadOverlayFromPath(@NonNull String idmapPath, boolean system)
- throws IOException {
- return new ApkAssets(idmapPath, system, false /*forceSharedLibrary*/, true /*overlay*/,
- false /*arscOnly*/, false /*forLoader*/);
+ public static @NonNull ApkAssets loadOverlayFromPath(@NonNull String idmapPath,
+ @PropertyFlags int flags) throws IOException {
+ return new ApkAssets(FORMAT_IDMAP, idmapPath, flags, null /* assets */);
}
/**
- * Creates a new ApkAssets instance from the given path on disk for use with a
- * {@link ResourcesProvider}.
- *
- * @param path The path to an APK on disk.
- * @return a new instance of ApkAssets.
- * @throws IOException if a disk I/O error or parsing error occurred.
- */
- public static @NonNull ApkAssets loadApkForLoader(@NonNull String path)
- throws IOException {
- return new ApkAssets(path, false /*system*/, false /*forceSharedLibrary*/,
- false /*overlay*/, false /*arscOnly*/, true /*forLoader*/);
- }
-
- /**
- * Creates a new ApkAssets instance from the given file descriptor for use with a
- * {@link ResourcesProvider}.
- *
- * Performs a dup of the underlying fd, so you must take care of still closing
- * the FileDescriptor yourself (and can do that whenever you want).
- *
- * @param fd The FileDescriptor of an open, readable APK.
- * @return a new instance of ApkAssets.
- * @throws IOException if a disk I/O error or parsing error occurred.
- */
- @NonNull
- public static ApkAssets loadApkForLoader(@NonNull FileDescriptor fd) throws IOException {
- return new ApkAssets(fd, TextUtils.emptyIfNull(fd.toString()),
- false /*system*/, false /*forceSharedLib*/, false /*arscOnly*/, true /*forLoader*/);
- }
-
- /**
- * Creates a new ApkAssets instance from the given file descriptor representing an ARSC
+ * Creates a new ApkAssets instance from the given file descriptor representing a resources.arsc
* for use with a {@link ResourcesProvider}.
*
* Performs a dup of the underlying fd, so you must take care of still closing
* the FileDescriptor yourself (and can do that whenever you want).
*
- * @param fd The FileDescriptor of an open, readable .arsc.
+ * @param fd The FileDescriptor of an open, readable resources.arsc.
+ * @param friendlyName The friendly name used to identify this ApkAssets when logging.
+ * @param flags flags that change the behavior of loaded apk assets
+ * @param assets The assets provider that overrides the loading of file-based resources
* @return a new instance of ApkAssets.
* @throws IOException if a disk I/O error or parsing error occurred.
*/
- public static @NonNull ApkAssets loadArscForLoader(@NonNull FileDescriptor fd)
- throws IOException {
- return new ApkAssets(fd, TextUtils.emptyIfNull(fd.toString()),
- false /*system*/, false /*forceSharedLib*/, true /*arscOnly*/, true /*forLoader*/);
+ public static @NonNull ApkAssets loadTableFromFd(@NonNull FileDescriptor fd,
+ @NonNull String friendlyName, @PropertyFlags int flags,
+ @Nullable AssetsProvider assets) throws IOException {
+ return new ApkAssets(FORMAT_ARSC, fd, friendlyName, flags, assets);
+ }
+
+ /**
+ * Creates a new ApkAssets instance from the given file descriptor representing a resources.arsc
+ * for use with a {@link ResourcesProvider}.
+ *
+ * Performs a dup of the underlying fd, so you must take care of still closing
+ * the FileDescriptor yourself (and can do that whenever you want).
+ *
+ * @param fd The FileDescriptor of an open, readable resources.arsc.
+ * @param friendlyName The friendly name used to identify this ApkAssets when logging.
+ * @param offset The location within the file that the table starts. This must be 0 if length is
+ * {@link AssetFileDescriptor#UNKNOWN_LENGTH}.
+ * @param length The number of bytes of the table, or {@link AssetFileDescriptor#UNKNOWN_LENGTH}
+ * if it extends to the end of the file.
+ * @param flags flags that change the behavior of loaded apk assets
+ * @param assets The assets provider that overrides the loading of file-based resources
+ * @return a new instance of ApkAssets.
+ * @throws IOException if a disk I/O error or parsing error occurred.
+ */
+ public static @NonNull ApkAssets loadTableFromFd(@NonNull FileDescriptor fd,
+ @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags,
+ @Nullable AssetsProvider assets) throws IOException {
+ return new ApkAssets(FORMAT_ARSC, fd, friendlyName, offset, length, flags, assets);
+ }
+
+ /**
+ * Creates a new ApkAssets instance from the given directory path. The directory should have the
+ * file structure of an APK.
+ *
+ * @param path The path to a directory on disk.
+ * @param flags flags that change the behavior of loaded apk assets
+ * @param assets The assets provider that overrides the loading of file-based resources
+ * @return a new instance of ApkAssets.
+ * @throws IOException if a disk I/O error or parsing error occurred.
+ */
+ public static @NonNull ApkAssets loadFromDir(@NonNull String path,
+ @PropertyFlags int flags, @Nullable AssetsProvider assets) throws IOException {
+ return new ApkAssets(FORMAT_DIR, path, flags, assets);
}
/**
* Generates an entirely empty ApkAssets. Needed because the ApkAssets instance and presence
* is required for a lot of APIs, and it's easier to have a non-null reference rather than
* tracking a separate identifier.
+ *
+ * @param flags flags that change the behavior of loaded apk assets
+ * @param assets The assets provider that overrides the loading of file-based resources
*/
@NonNull
- public static ApkAssets loadEmptyForLoader() {
- return new ApkAssets(true);
+ public static ApkAssets loadEmptyForLoader(@PropertyFlags int flags,
+ @Nullable AssetsProvider assets) {
+ return new ApkAssets(flags, assets);
}
- private ApkAssets(boolean forLoader) {
- mForLoader = forLoader;
- mNativePtr = nativeLoadEmpty(forLoader);
- mStringBlock = null;
- }
-
- private ApkAssets(@NonNull String path, boolean system, boolean forceSharedLib, boolean overlay,
- boolean arscOnly, boolean forLoader) throws IOException {
- mForLoader = forLoader;
+ private ApkAssets(@FormatType int format, @NonNull String path, @PropertyFlags int flags,
+ @Nullable AssetsProvider assets) throws IOException {
Objects.requireNonNull(path, "path");
- mNativePtr = arscOnly ? nativeLoadArsc(path, forLoader)
- : nativeLoad(path, system, forceSharedLib, overlay, forLoader);
+ mFlags = flags;
+ mNativePtr = nativeLoad(format, path, flags, assets);
mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/);
+ mAssets = assets;
}
- private ApkAssets(@NonNull FileDescriptor fd, @NonNull String friendlyName, boolean system,
- boolean forceSharedLib, boolean arscOnly, boolean forLoader) throws IOException {
- mForLoader = forLoader;
+ private ApkAssets(@FormatType int format, @NonNull FileDescriptor fd,
+ @NonNull String friendlyName, @PropertyFlags int flags, @Nullable AssetsProvider assets)
+ throws IOException {
Objects.requireNonNull(fd, "fd");
Objects.requireNonNull(friendlyName, "friendlyName");
- mNativePtr = arscOnly ? nativeLoadArscFromFd(fd, friendlyName, forLoader)
- : nativeLoadFromFd(fd, friendlyName, system, forceSharedLib, forLoader);
+ mFlags = flags;
+ mNativePtr = nativeLoadFd(format, fd, friendlyName, flags, assets);
mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/);
+ mAssets = assets;
+ }
+
+ private ApkAssets(@FormatType int format, @NonNull FileDescriptor fd,
+ @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags,
+ @Nullable AssetsProvider assets) throws IOException {
+ Objects.requireNonNull(fd, "fd");
+ Objects.requireNonNull(friendlyName, "friendlyName");
+ mFlags = flags;
+ mNativePtr = nativeLoadFdOffsets(format, fd, friendlyName, offset, length, flags, assets);
+ mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/);
+ mAssets = assets;
+ }
+
+ private ApkAssets(@PropertyFlags int flags, @Nullable AssetsProvider assets) {
+ mFlags = flags;
+ mNativePtr = nativeLoadEmpty(flags, assets);
+ mStringBlock = null;
+ mAssets = assets;
}
@UnsupportedAppUsage
@@ -226,8 +339,17 @@
}
}
+ /** Returns whether this apk assets was loaded using a {@link ResourcesProvider}. */
public boolean isForLoader() {
- return mForLoader;
+ return (mFlags & PROPERTY_LOADER) != 0;
+ }
+
+ /**
+ * Returns the assets provider that overrides the loading of assets present in this apk assets.
+ */
+ @Nullable
+ public AssetsProvider getAssetsProvider() {
+ return mAssets;
}
/**
@@ -300,18 +422,16 @@
}
}
- private static native long nativeLoad(@NonNull String path, boolean system,
- boolean forceSharedLib, boolean overlay, boolean forLoader)
- throws IOException;
- private static native long nativeLoadFromFd(@NonNull FileDescriptor fd,
- @NonNull String friendlyName, boolean system, boolean forceSharedLib,
- boolean forLoader)
- throws IOException;
- private static native long nativeLoadArsc(@NonNull String path, boolean forLoader)
- throws IOException;
- private static native long nativeLoadArscFromFd(@NonNull FileDescriptor fd,
- @NonNull String friendlyName, boolean forLoader) throws IOException;
- private static native long nativeLoadEmpty(boolean forLoader);
+ private static native long nativeLoad(@FormatType int format, @NonNull String path,
+ @PropertyFlags int flags, @Nullable AssetsProvider asset) throws IOException;
+ private static native long nativeLoadEmpty(@PropertyFlags int flags,
+ @Nullable AssetsProvider asset);
+ private static native long nativeLoadFd(@FormatType int format, @NonNull FileDescriptor fd,
+ @NonNull String friendlyName, @PropertyFlags int flags,
+ @Nullable AssetsProvider asset) throws IOException;
+ private static native long nativeLoadFdOffsets(@FormatType int format,
+ @NonNull FileDescriptor fd, @NonNull String friendlyName, long offset, long length,
+ @PropertyFlags int flags, @Nullable AssetsProvider asset) throws IOException;
private static native void nativeDestroy(long ptr);
private static native @NonNull String nativeGetAssetPath(long ptr);
private static native long nativeGetStringBlock(long ptr);
diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java
index f295f8c..d2103af 100644
--- a/core/java/android/content/res/AssetManager.java
+++ b/core/java/android/content/res/AssetManager.java
@@ -27,9 +27,7 @@
import android.compat.annotation.UnsupportedAppUsage;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration.NativeConfig;
-import android.content.res.loader.AssetsProvider;
import android.content.res.loader.ResourcesLoader;
-import android.content.res.loader.ResourcesProvider;
import android.os.ParcelFileDescriptor;
import android.util.ArraySet;
import android.util.Log;
@@ -44,7 +42,6 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
-import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -151,12 +148,9 @@
final List<ApkAssets> currentLoaderApkAssets = mLoaders.get(i).getApkAssets();
for (int j = currentLoaderApkAssets.size() - 1; j >= 0; j--) {
final ApkAssets apkAssets = currentLoaderApkAssets.get(j);
- if (uniqueLoaderApkAssets.contains(apkAssets)) {
- continue;
+ if (uniqueLoaderApkAssets.add(apkAssets)) {
+ loaderApkAssets.add(0, apkAssets);
}
-
- uniqueLoaderApkAssets.add(apkAssets);
- loaderApkAssets.add(0, apkAssets);
}
}
@@ -242,12 +236,12 @@
try {
final ArrayList<ApkAssets> apkAssets = new ArrayList<>();
- apkAssets.add(ApkAssets.loadFromPath(frameworkPath, true /*system*/));
+ apkAssets.add(ApkAssets.loadFromPath(frameworkPath, ApkAssets.PROPERTY_SYSTEM));
final String[] systemIdmapPaths =
OverlayConfig.getZygoteInstance().createImmutableFrameworkIdmapsInZygote();
for (String idmapPath : systemIdmapPaths) {
- apkAssets.add(ApkAssets.loadOverlayFromPath(idmapPath, true /*system*/));
+ apkAssets.add(ApkAssets.loadOverlayFromPath(idmapPath, ApkAssets.PROPERTY_SYSTEM));
}
sSystemApkAssetsSet = new ArraySet<>(apkAssets);
@@ -332,6 +326,42 @@
}
/**
+ * Changes the {@link ResourcesLoader ResourcesLoaders} used in this AssetManager.
+ * @hide
+ */
+ void setLoaders(@NonNull List<ResourcesLoader> newLoaders) {
+ Objects.requireNonNull(newLoaders, "newLoaders");
+
+ final ArrayList<ApkAssets> apkAssets = new ArrayList<>();
+ for (int i = 0; i < mApkAssets.length; i++) {
+ // Filter out the previous loader apk assets.
+ if (!mApkAssets[i].isForLoader()) {
+ apkAssets.add(mApkAssets[i]);
+ }
+ }
+
+ if (!newLoaders.isEmpty()) {
+ // Filter so that assets provided by multiple loaders are only included once
+ // in the final assets list. The last appearance of the ApkAssets dictates its load
+ // order.
+ final int loaderStartIndex = apkAssets.size();
+ final ArraySet<ApkAssets> uniqueLoaderApkAssets = new ArraySet<>();
+ for (int i = newLoaders.size() - 1; i >= 0; i--) {
+ final List<ApkAssets> currentLoaderApkAssets = newLoaders.get(i).getApkAssets();
+ for (int j = currentLoaderApkAssets.size() - 1; j >= 0; j--) {
+ final ApkAssets loaderApkAssets = currentLoaderApkAssets.get(j);
+ if (uniqueLoaderApkAssets.add(loaderApkAssets)) {
+ apkAssets.add(loaderStartIndex, loaderApkAssets);
+ }
+ }
+ }
+ }
+
+ mLoaders = newLoaders.toArray(new ResourcesLoader[0]);
+ setApkAssets(apkAssets.toArray(new ApkAssets[0]), true /* invalidate_caches */);
+ }
+
+ /**
* Invalidates the caches in this AssetManager according to the bitmask `diff`.
*
* @param diff The bitmask of changes generated by {@link Configuration#diff(Configuration)}.
@@ -443,9 +473,10 @@
final String idmapPath = "/data/resource-cache/"
+ path.substring(1).replace('/', '@')
+ "@idmap";
- assets = ApkAssets.loadOverlayFromPath(idmapPath, false /*system*/);
+ assets = ApkAssets.loadOverlayFromPath(idmapPath, 0 /* flags */);
} else {
- assets = ApkAssets.loadFromPath(path, false /*system*/, appAsLib);
+ assets = ApkAssets.loadFromPath(path,
+ appAsLib ? ApkAssets.PROPERTY_DYNAMIC : 0);
}
} catch (IOException e) {
return 0;
@@ -827,13 +858,6 @@
Objects.requireNonNull(fileName, "fileName");
synchronized (this) {
ensureOpenLocked();
-
- String path = Paths.get("assets", fileName).toString();
- InputStream inputStream = searchLoaders(0, path, accessMode);
- if (inputStream != null) {
- return inputStream;
- }
-
final long asset = nativeOpenAsset(mObject, fileName, accessMode);
if (asset == 0) {
throw new FileNotFoundException("Asset file: " + fileName);
@@ -858,13 +882,6 @@
Objects.requireNonNull(fileName, "fileName");
synchronized (this) {
ensureOpenLocked();
-
- String path = Paths.get("assets", fileName).toString();
- AssetFileDescriptor fileDescriptor = searchLoadersFd(0, path);
- if (fileDescriptor != null) {
- return fileDescriptor;
- }
-
final ParcelFileDescriptor pfd = nativeOpenAssetFd(mObject, fileName, mOffsets);
if (pfd == null) {
throw new FileNotFoundException("Asset file: " + fileName);
@@ -958,12 +975,6 @@
Objects.requireNonNull(fileName, "fileName");
synchronized (this) {
ensureOpenLocked();
-
- InputStream inputStream = searchLoaders(cookie, fileName, accessMode);
- if (inputStream != null) {
- return inputStream;
- }
-
final long asset = nativeOpenNonAsset(mObject, cookie, fileName, accessMode);
if (asset == 0) {
throw new FileNotFoundException("Asset absolute file: " + fileName);
@@ -1003,12 +1014,6 @@
Objects.requireNonNull(fileName, "fileName");
synchronized (this) {
ensureOpenLocked();
-
- AssetFileDescriptor fileDescriptor = searchLoadersFd(cookie, fileName);
- if (fileDescriptor != null) {
- return fileDescriptor;
- }
-
final ParcelFileDescriptor pfd =
nativeOpenNonAssetFd(mObject, cookie, fileName, mOffsets);
if (pfd == null) {
@@ -1071,15 +1076,7 @@
synchronized (this) {
ensureOpenLocked();
- final long xmlBlock;
- AssetFileDescriptor fileDescriptor = searchLoadersFd(cookie, fileName);
- if (fileDescriptor != null) {
- xmlBlock = nativeOpenXmlAssetFd(mObject, cookie,
- fileDescriptor.getFileDescriptor());
- } else {
- xmlBlock = nativeOpenXmlAsset(mObject, cookie, fileName);
- }
-
+ final long xmlBlock = nativeOpenXmlAsset(mObject, cookie, fileName);
if (xmlBlock == 0) {
throw new FileNotFoundException("Asset XML file: " + fileName);
}
@@ -1089,122 +1086,6 @@
}
}
- private ResourcesProvider findResourcesProvider(int assetCookie) {
- if (mLoaders == null) {
- return null;
- }
-
- int apkAssetsIndex = assetCookie - 1;
- if (apkAssetsIndex >= mApkAssets.length || apkAssetsIndex < 0) {
- return null;
- }
-
- final ApkAssets apkAssets = mApkAssets[apkAssetsIndex];
- if (!apkAssets.isForLoader()) {
- return null;
- }
-
- for (int i = mLoaders.length - 1; i >= 0; i--) {
- final ResourcesLoader loader = mLoaders[i];
- for (int j = 0, n = loader.getProviders().size(); j < n; j++) {
- final ResourcesProvider provider = loader.getProviders().get(j);
- if (apkAssets == provider.getApkAssets()) {
- return provider;
- }
- }
- }
-
- return null;
- }
-
- private InputStream searchLoaders(int cookie, @NonNull String fileName, int accessMode)
- throws IOException {
- if (mLoaders == null) {
- return null;
- }
-
- if (cookie == 0) {
- // A cookie of 0 means no specific ApkAssets, so search everything
- for (int i = mLoaders.length - 1; i >= 0; i--) {
- final ResourcesLoader loader = mLoaders[i];
- final List<ResourcesProvider> providers = loader.getProviders();
- for (int j = providers.size() - 1; j >= 0; j--) {
- final AssetsProvider assetsProvider = providers.get(j).getAssetsProvider();
- if (assetsProvider == null) {
- continue;
- }
-
- try {
- final InputStream inputStream = assetsProvider.loadAsset(
- fileName, accessMode);
- if (inputStream != null) {
- return inputStream;
- }
- } catch (IOException ignored) {
- // When searching, ignore read failures
- }
- }
- }
-
- return null;
- }
-
- final ResourcesProvider provider = findResourcesProvider(cookie);
- if (provider != null && provider.getAssetsProvider() != null) {
- return provider.getAssetsProvider().loadAsset(
- fileName, accessMode);
- }
-
- return null;
- }
-
- private AssetFileDescriptor searchLoadersFd(int cookie, @NonNull String fileName)
- throws IOException {
- if (mLoaders == null) {
- return null;
- }
-
- if (cookie == 0) {
- // A cookie of 0 means no specific ApkAssets, so search everything
- for (int i = mLoaders.length - 1; i >= 0; i--) {
- final ResourcesLoader loader = mLoaders[i];
- final List<ResourcesProvider> providers = loader.getProviders();
- for (int j = providers.size() - 1; j >= 0; j--) {
- final AssetsProvider assetsProvider = providers.get(j).getAssetsProvider();
- if (assetsProvider == null) {
- continue;
- }
-
- try {
- final ParcelFileDescriptor fileDescriptor = assetsProvider
- .loadAssetParcelFd(fileName);
- if (fileDescriptor != null) {
- return new AssetFileDescriptor(fileDescriptor, 0,
- AssetFileDescriptor.UNKNOWN_LENGTH);
- }
- } catch (IOException ignored) {
- // When searching, ignore read failures
- }
- }
- }
-
- return null;
- }
-
- final ResourcesProvider provider = findResourcesProvider(cookie);
- if (provider != null && provider.getAssetsProvider() != null) {
- final ParcelFileDescriptor fileDescriptor = provider.getAssetsProvider()
- .loadAssetParcelFd(fileName);
- if (fileDescriptor != null) {
- return new AssetFileDescriptor(fileDescriptor, 0,
- AssetFileDescriptor.UNKNOWN_LENGTH);
- }
- return null;
- }
-
- return null;
- }
-
void xmlBlockGone(int id) {
synchronized (this) {
decRefsLocked(id);
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index cb809da..d6a9f69 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -66,6 +66,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.GrowingArrayUtils;
+import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
import org.xmlpull.v1.XmlPullParser;
@@ -244,7 +245,36 @@
* @param resources the instance being updated
* @param newLoaders the new set of loaders for the instance
*/
- void onLoadersChanged(Resources resources, List<ResourcesLoader> newLoaders);
+ void onLoadersChanged(@NonNull Resources resources,
+ @NonNull List<ResourcesLoader> newLoaders);
+ }
+
+ /**
+ * Handler that propagates updates of the {@link Resources} instance to the underlying
+ * {@link AssetManager} when the Resources is not registered with a
+ * {@link android.app.ResourcesManager}.
+ * @hide
+ */
+ public class AssetManagerUpdateHandler implements UpdateCallbacks{
+
+ @Override
+ public void onLoadersChanged(@NonNull Resources resources,
+ @NonNull List<ResourcesLoader> newLoaders) {
+ Preconditions.checkArgument(Resources.this == resources);
+ final ResourcesImpl impl = mResourcesImpl;
+ impl.clearAllCaches();
+ impl.getAssets().setLoaders(newLoaders);
+ }
+
+ @Override
+ public void onLoaderUpdated(@NonNull ResourcesLoader loader) {
+ final ResourcesImpl impl = mResourcesImpl;
+ final AssetManager assets = impl.getAssets();
+ if (assets.getLoaders().contains(loader)) {
+ impl.clearAllCaches();
+ assets.setLoaders(assets.getLoaders());
+ }
+ }
}
/**
@@ -2367,8 +2397,9 @@
private void checkCallbacksRegistered() {
if (mCallbacks == null) {
- throw new IllegalArgumentException("Cannot modify resource loaders of Resources"
- + " instances created outside of ResourcesManager");
+ // Fallback to updating the underlying AssetManager if the Resources is not associated
+ // with a ResourcesManager.
+ mCallbacks = new AssetManagerUpdateHandler();
}
}
@@ -2388,6 +2419,9 @@
* Adds a loader to the list of loaders. If the loader is already present in the list, the list
* will not be modified.
*
+ * <p>This should only be called from the UI thread to avoid lock contention when propagating
+ * loader changes.
+ *
* @param loaders the loaders to add
*/
public void addLoaders(@NonNull ResourcesLoader... loaders) {
@@ -2419,6 +2453,9 @@
* Removes loaders from the list of loaders. If the loader is not present in the list, the list
* will not be modified.
*
+ * <p>This should only be called from the UI thread to avoid lock contention when propagating
+ * loader changes.
+ *
* @param loaders the loaders to remove
*/
public void removeLoaders(@NonNull ResourcesLoader... loaders) {
@@ -2448,6 +2485,9 @@
/**
* Removes all {@link ResourcesLoader ResourcesLoader(s)}.
+ *
+ * <p>This should only be called from the UI thread to avoid lock contention when propagating
+ * loader changes.
* @hide
*/
@VisibleForTesting
diff --git a/core/java/android/content/res/loader/AssetsProvider.java b/core/java/android/content/res/loader/AssetsProvider.java
index c315494..0f8f1d1 100644
--- a/core/java/android/content/res/loader/AssetsProvider.java
+++ b/core/java/android/content/res/loader/AssetsProvider.java
@@ -18,12 +18,10 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.os.ParcelFileDescriptor;
-import java.io.IOException;
-import java.io.InputStream;
-
/**
* Provides callbacks that allow for the value of a file-based resources or assets of a
* {@link ResourcesProvider} to be specified or overridden.
@@ -34,6 +32,10 @@
* Callback that allows the value of a file-based resources or asset to be specified or
* overridden.
*
+ * <p>The system will take ownership of the file descriptor returned from this method, so
+ * {@link ParcelFileDescriptor#dup() dup} the file descriptor before returning if the system
+ * should not own it.
+ *
* <p>There are two situations in which this method will be called:
* <ul>
* <li>AssetManager is queried for an InputStream of an asset using APIs like
@@ -52,17 +54,7 @@
* @see AssetManager#open
*/
@Nullable
- default InputStream loadAsset(@NonNull String path, int accessMode) throws IOException {
- return null;
- }
-
- /**
- * {@link ParcelFileDescriptor} variant of {@link #loadAsset(String, int)}.
- *
- * @param path the asset path being loaded
- */
- @Nullable
- default ParcelFileDescriptor loadAssetParcelFd(@NonNull String path) throws IOException {
+ default AssetFileDescriptor loadAssetFd(@NonNull String path, int accessMode) {
return null;
}
}
diff --git a/core/java/android/content/res/loader/DirectoryAssetsProvider.java b/core/java/android/content/res/loader/DirectoryAssetsProvider.java
deleted file mode 100644
index 81c2a4c..0000000
--- a/core/java/android/content/res/loader/DirectoryAssetsProvider.java
+++ /dev/null
@@ -1,80 +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 android.content.res.loader;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.ParcelFileDescriptor;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A {@link AssetsProvider} that searches a directory for assets.
- * Assumes that resource paths are resolvable child paths of the root directory passed in.
- */
-public class DirectoryAssetsProvider implements AssetsProvider {
-
- @NonNull
- private final File mDirectory;
-
- /**
- * Creates a DirectoryAssetsProvider with given root directory.
- *
- * @param directory the root directory to resolve files from
- */
- public DirectoryAssetsProvider(@NonNull File directory) {
- this.mDirectory = directory;
- }
-
- @Nullable
- @Override
- public InputStream loadAsset(@NonNull String path, int accessMode) throws IOException {
- final File file = findFile(path);
- if (file == null || !file.exists()) {
- return null;
- }
- return new FileInputStream(file);
- }
-
- @Nullable
- @Override
- public ParcelFileDescriptor loadAssetParcelFd(@NonNull String path) throws IOException {
- final File file = findFile(path);
- if (file == null || !file.exists()) {
- return null;
- }
- return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
- }
-
- /**
- * Finds the file relative to the root directory.
- *
- * @param path the relative path of the file
- */
- @Nullable
- public File findFile(@NonNull String path) {
- return mDirectory.toPath().resolve(path).toFile();
- }
-
- @NonNull
- public File getDirectory() {
- return mDirectory;
- }
-}
diff --git a/core/java/android/content/res/loader/ResourcesLoader.java b/core/java/android/content/res/loader/ResourcesLoader.java
index 58fec60..c308400 100644
--- a/core/java/android/content/res/loader/ResourcesLoader.java
+++ b/core/java/android/content/res/loader/ResourcesLoader.java
@@ -45,6 +45,11 @@
*
* <p>Providers retrieved with {@link #getProviders()} are listed in increasing precedence order. A
* provider will override the resources and assets of providers listed before itself.
+ *
+ * <p>Modifying the list of providers a loader contains or the list of loaders a Resources object
+ * contains can cause lock contention with the UI thread. APIs that modify the lists of loaders or
+ * providers should only be used on the UI thread. Providers can be instantiated on any thread
+ * without causing lock contention.
*/
public class ResourcesLoader {
private final Object mLock = new Object();
@@ -88,6 +93,9 @@
* Appends a provider to the end of the provider list. If the provider is already present in the
* loader list, the list will not be modified.
*
+ * <p>This should only be called from the UI thread to avoid lock contention when propagating
+ * provider changes.
+ *
* @param resourcesProvider the provider to add
*/
public void addProvider(@NonNull ResourcesProvider resourcesProvider) {
@@ -102,6 +110,9 @@
* Removes a provider from the provider list. If the provider is not present in the provider
* list, the list will not be modified.
*
+ * <p>This should only be called from the UI thread to avoid lock contention when propagating
+ * provider changes.
+ *
* @param resourcesProvider the provider to remove
*/
public void removeProvider(@NonNull ResourcesProvider resourcesProvider) {
@@ -115,6 +126,9 @@
/**
* Sets the list of providers.
*
+ * <p>This should only be called from the UI thread to avoid lock contention when propagating
+ * provider changes.
+ *
* @param resourcesProviders the new providers
*/
public void setProviders(@NonNull List<ResourcesProvider> resourcesProviders) {
@@ -124,7 +138,12 @@
}
}
- /** Removes all {@link ResourcesProvider ResourcesProvider(s)}. */
+ /**
+ * Removes all {@link ResourcesProvider ResourcesProvider(s)}.
+ *
+ * <p>This should only be called from the UI thread to avoid lock contention when propagating
+ * provider changes.
+ */
public void clearProviders() {
synchronized (mLock) {
mProviders = null;
@@ -206,7 +225,6 @@
return true;
}
-
/**
* Invokes registered callbacks when the list of {@link ResourcesProvider} instances this loader
* uses changes.
diff --git a/core/java/android/content/res/loader/ResourcesProvider.java b/core/java/android/content/res/loader/ResourcesProvider.java
index 419ec78..0a698d1 100644
--- a/core/java/android/content/res/loader/ResourcesProvider.java
+++ b/core/java/android/content/res/loader/ResourcesProvider.java
@@ -21,19 +21,21 @@
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.res.ApkAssets;
+import android.content.res.AssetFileDescriptor;
import android.os.ParcelFileDescriptor;
-import android.os.SharedMemory;
import android.util.Log;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import java.io.Closeable;
+import java.io.File;
import java.io.IOException;
/**
* Provides methods to load resources data from APKs ({@code .apk}) and resources tables
- * {@code .arsc} for use with {@link ResourcesLoader ResourcesLoader(s)}.
+ * (eg. {@code resources.arsc}) for use with {@link ResourcesLoader ResourcesLoader(s)}.
*/
public class ResourcesProvider implements AutoCloseable, Closeable {
private static final String TAG = "ResourcesProvider";
@@ -48,73 +50,111 @@
@GuardedBy("mLock")
private final ApkAssets mApkAssets;
- private final AssetsProvider mAssetsProvider;
-
/**
- * Creates an empty ResourcesProvider with no resource data. This is useful for loading assets
- * that are not associated with resource identifiers.
+ * Creates an empty ResourcesProvider with no resource data. This is useful for loading
+ * file-based assets not associated with resource identifiers.
*
- * @param assetsProvider the assets provider that overrides the loading of file-based resources
+ * @param assetsProvider the assets provider that implements the loading of file-based resources
*/
@NonNull
public static ResourcesProvider empty(@NonNull AssetsProvider assetsProvider) {
- return new ResourcesProvider(ApkAssets.loadEmptyForLoader(), assetsProvider);
+ return new ResourcesProvider(ApkAssets.loadEmptyForLoader(ApkAssets.PROPERTY_LOADER,
+ assetsProvider));
}
/**
* Creates a ResourcesProvider from an APK ({@code .apk}) file descriptor.
*
- * The file descriptor is duplicated and the original may be closed by the application at any
+ * <p>The file descriptor is duplicated and the original may be closed by the application at any
* time without affecting the ResourcesProvider.
*
* @param fileDescriptor the file descriptor of the APK to load
+ *
+ * @see ParcelFileDescriptor#open(File, int)
+ * @see android.system.Os#memfd_create(String, int)
*/
@NonNull
public static ResourcesProvider loadFromApk(@NonNull ParcelFileDescriptor fileDescriptor)
throws IOException {
- return loadFromApk(fileDescriptor, null);
+ return loadFromApk(fileDescriptor, null /* assetsProvider */);
}
/**
* Creates a ResourcesProvider from an APK ({@code .apk}) file descriptor.
*
- * The file descriptor is duplicated and the original may be closed by the application at any
+ * <p>The file descriptor is duplicated and the original may be closed by the application at any
* time without affecting the ResourcesProvider.
*
+ * <p>The assets provider can override the loading of files within the APK and can provide
+ * entirely new files that do not exist in the APK.
+ *
* @param fileDescriptor the file descriptor of the APK to load
* @param assetsProvider the assets provider that overrides the loading of file-based resources
+ *
+ * @see ParcelFileDescriptor#open(File, int)
+ * @see android.system.Os#memfd_create(String, int)
*/
@NonNull
public static ResourcesProvider loadFromApk(@NonNull ParcelFileDescriptor fileDescriptor,
@Nullable AssetsProvider assetsProvider)
throws IOException {
- return new ResourcesProvider(
- ApkAssets.loadApkForLoader(fileDescriptor.getFileDescriptor()), assetsProvider);
+ return new ResourcesProvider(ApkAssets.loadFromFd(fileDescriptor.getFileDescriptor(),
+ fileDescriptor.toString(), ApkAssets.PROPERTY_LOADER, assetsProvider));
}
/**
- * Creates a ResourcesProvider from an {@code .apk} file representation in memory.
+ * Creates a ResourcesProvider from an APK ({@code .apk}) file descriptor.
*
- * @param sharedMemory the shared memory containing the data of the APK to load
+ * <p>The file descriptor is duplicated and the original may be closed by the application at any
+ * time without affecting the ResourcesProvider.
+ *
+ * <p>The assets provider can override the loading of files within the APK and can provide
+ * entirely new files that do not exist in the APK.
+ *
+ * @param fileDescriptor the file descriptor of the APK to load
+ * @param offset The location within the file that the apk starts. This must be 0 if length is
+ * {@link AssetFileDescriptor#UNKNOWN_LENGTH}.
+ * @param length The number of bytes of the apk, or {@link AssetFileDescriptor#UNKNOWN_LENGTH}
+ * if it extends to the end of the file.
+ * @param assetsProvider the assets provider that overrides the loading of file-based resources
+ *
+ * @see ParcelFileDescriptor#open(File, int)
+ * @see android.system.Os#memfd_create(String, int)
+ * @hide
*/
+ @VisibleForTesting
@NonNull
- public static ResourcesProvider loadFromApk(@NonNull SharedMemory sharedMemory)
+ public static ResourcesProvider loadFromApk(@NonNull ParcelFileDescriptor fileDescriptor,
+ long offset, long length, @Nullable AssetsProvider assetsProvider)
throws IOException {
- return loadFromApk(sharedMemory, null);
+ return new ResourcesProvider(ApkAssets.loadFromFd(fileDescriptor.getFileDescriptor(),
+ fileDescriptor.toString(), offset, length, ApkAssets.PROPERTY_LOADER,
+ assetsProvider));
}
/**
- * Creates a ResourcesProvider from an {@code .apk} file representation in memory.
+ * Creates a ResourcesProvider from a resources table ({@code .arsc}) file descriptor.
*
- * @param sharedMemory the shared memory containing the data of the APK to load
+ * <p>The file descriptor is duplicated and the original may be closed by the application at any
+ * time without affecting the ResourcesProvider.
+ *
+ * <p>The resources table format is not an archive format and therefore cannot asset files
+ * within itself. The assets provider can instead provide files that are potentially referenced
+ * by path in the resources table.
+ *
+ * @param fileDescriptor the file descriptor of the resources table to load
* @param assetsProvider the assets provider that implements the loading of file-based resources
+ *
+ * @see ParcelFileDescriptor#open(File, int)
+ * @see android.system.Os#memfd_create(String, int)
*/
@NonNull
- public static ResourcesProvider loadFromApk(@NonNull SharedMemory sharedMemory,
+ public static ResourcesProvider loadFromTable(@NonNull ParcelFileDescriptor fileDescriptor,
@Nullable AssetsProvider assetsProvider)
throws IOException {
return new ResourcesProvider(
- ApkAssets.loadApkForLoader(sharedMemory.getFileDescriptor()), assetsProvider);
+ ApkAssets.loadTableFromFd(fileDescriptor.getFileDescriptor(),
+ fileDescriptor.toString(), ApkAssets.PROPERTY_LOADER, assetsProvider));
}
/**
@@ -123,30 +163,30 @@
* The file descriptor is duplicated and the original may be closed by the application at any
* time without affecting the ResourcesProvider.
*
+ * <p>The resources table format is not an archive format and therefore cannot asset files
+ * within itself. The assets provider can instead provide files that are potentially referenced
+ * by path in the resources table.
+ *
* @param fileDescriptor the file descriptor of the resources table to load
- * @param assetsProvider the assets provider that implements the loading of file-based resources
+ * @param offset The location within the file that the table starts. This must be 0 if length is
+ * {@link AssetFileDescriptor#UNKNOWN_LENGTH}.
+ * @param length The number of bytes of the table, or {@link AssetFileDescriptor#UNKNOWN_LENGTH}
+ * if it extends to the end of the file.
+ * @param assetsProvider the assets provider that overrides the loading of file-based resources
+ *
+ * @see ParcelFileDescriptor#open(File, int)
+ * @see android.system.Os#memfd_create(String, int)
+ * @hide
*/
+ @VisibleForTesting
@NonNull
public static ResourcesProvider loadFromTable(@NonNull ParcelFileDescriptor fileDescriptor,
- @Nullable AssetsProvider assetsProvider)
+ long offset, long length, @Nullable AssetsProvider assetsProvider)
throws IOException {
return new ResourcesProvider(
- ApkAssets.loadArscForLoader(fileDescriptor.getFileDescriptor()), assetsProvider);
- }
-
- /**
- * Creates a ResourcesProvider from a resources table ({@code .arsc}) file representation in
- * memory.
- *
- * @param sharedMemory the shared memory containing the data of the resources table to load
- * @param assetsProvider the assets provider that overrides the loading of file-based resources
- */
- @NonNull
- public static ResourcesProvider loadFromTable(@NonNull SharedMemory sharedMemory,
- @Nullable AssetsProvider assetsProvider)
- throws IOException {
- return new ResourcesProvider(
- ApkAssets.loadArscForLoader(sharedMemory.getFileDescriptor()), assetsProvider);
+ ApkAssets.loadTableFromFd(fileDescriptor.getFileDescriptor(),
+ fileDescriptor.toString(), offset, length, ApkAssets.PROPERTY_LOADER,
+ assetsProvider));
}
/**
@@ -166,18 +206,28 @@
}
String splitPath = appInfo.getSplitCodePaths()[splitIndex];
- return new ResourcesProvider(ApkAssets.loadApkForLoader(splitPath), null);
+ return new ResourcesProvider(ApkAssets.loadFromPath(splitPath, ApkAssets.PROPERTY_LOADER,
+ null /* assetsProvider */));
}
- private ResourcesProvider(@NonNull ApkAssets apkAssets,
- @Nullable AssetsProvider assetsProvider) {
+ /**
+ * Creates a ResourcesProvider from a directory path.
+ *
+ * File-based resources will be resolved within the directory as if the directory is an APK.
+ *
+ * @param path the path of the directory to treat as an APK
+ * @param assetsProvider the assets provider that overrides the loading of file-based resources
+ */
+ @NonNull
+ public static ResourcesProvider loadFromDirectory(@NonNull String path,
+ @Nullable AssetsProvider assetsProvider) throws IOException {
+ return new ResourcesProvider(ApkAssets.loadFromDir(path, ApkAssets.PROPERTY_LOADER,
+ assetsProvider));
+ }
+
+
+ private ResourcesProvider(@NonNull ApkAssets apkAssets) {
this.mApkAssets = apkAssets;
- this.mAssetsProvider = assetsProvider;
- }
-
- @Nullable
- public AssetsProvider getAssetsProvider() {
- return mAssetsProvider;
}
/** @hide */
diff --git a/core/java/android/hardware/biometrics/BiometricNativeHandleUtils.java b/core/java/android/hardware/biometrics/BiometricNativeHandleUtils.java
deleted file mode 100644
index 5544eae..0000000
--- a/core/java/android/hardware/biometrics/BiometricNativeHandleUtils.java
+++ /dev/null
@@ -1,79 +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 android.hardware.biometrics;
-
-import android.os.NativeHandle;
-import android.os.ParcelFileDescriptor;
-
-import java.io.IOException;
-
-/**
- * A class that contains utilities for IBiometricNativeHandle.
- *
- * @hide
- */
-public final class BiometricNativeHandleUtils {
-
- private BiometricNativeHandleUtils() {
- }
-
- /**
- * Converts a {@link NativeHandle} into an {@link IBiometricNativeHandle} by duplicating the
- * underlying file descriptors.
- *
- * Both the original and new handle must be closed after use.
- *
- * @param h {@link NativeHandle}. Usually used to identify a WindowManager window. Can be null.
- * @return A {@link IBiometricNativeHandle} representation of {@code h}. Will be null if
- * {@code h} or its raw file descriptors are null.
- */
- public static IBiometricNativeHandle dup(NativeHandle h) {
- IBiometricNativeHandle handle = null;
- if (h != null && h.getFileDescriptors() != null && h.getInts() != null) {
- handle = new IBiometricNativeHandle();
- handle.ints = h.getInts().clone();
- handle.fds = new ParcelFileDescriptor[h.getFileDescriptors().length];
- for (int i = 0; i < h.getFileDescriptors().length; ++i) {
- try {
- handle.fds[i] = ParcelFileDescriptor.dup(h.getFileDescriptors()[i]);
- } catch (IOException e) {
- return null;
- }
- }
- }
- return handle;
- }
-
- /**
- * Closes the handle's file descriptors.
- *
- * @param h {@link IBiometricNativeHandle} handle.
- */
- public static void close(IBiometricNativeHandle h) {
- if (h != null) {
- for (ParcelFileDescriptor fd : h.fds) {
- if (fd != null) {
- try {
- fd.close();
- } catch (IOException e) {
- // do nothing.
- }
- }
- }
- }
- }
-}
diff --git a/core/java/android/hardware/biometrics/IBiometricNativeHandle.aidl b/core/java/android/hardware/biometrics/IBiometricNativeHandle.aidl
deleted file mode 100644
index 6dcdc1b..0000000
--- a/core/java/android/hardware/biometrics/IBiometricNativeHandle.aidl
+++ /dev/null
@@ -1,26 +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 android.hardware.biometrics;
-
-/**
- * Representation of a native handle.
- * Copied from /common/aidl/android/hardware/common/NativeHandle.aidl
- * @hide
- */
-parcelable IBiometricNativeHandle {
- ParcelFileDescriptor[] fds;
- int[] ints;
-}
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index 6539c68..34a40ae 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -1125,42 +1125,43 @@
new Key<android.util.Range<Integer>>("android.control.postRawSensitivityBoostRange", new TypeReference<android.util.Range<Integer>>() {{ }});
/**
- * <p>The list of bokeh modes for {@link CaptureRequest#CONTROL_BOKEH_MODE android.control.bokehMode} that are supported by this camera
- * device, and each bokeh mode's maximum streaming (non-stall) size with bokeh effect.</p>
- * <p>For OFF mode, the camera behaves normally with no bokeh effect.</p>
- * <p>For STILL_CAPTURE mode, the maximum streaming dimension specifies the limit under which
- * bokeh is effective when capture intent is PREVIEW. Note that when capture intent is
- * PREVIEW, the bokeh effect may not be as high quality compared to STILL_CAPTURE intent
- * in order to maintain reasonable frame rate. The maximum streaming dimension must be one
- * of the YUV_420_888 or PRIVATE resolutions in availableStreamConfigurations, or (0, 0)
- * if preview bokeh is not supported. If the application configures a stream larger than
- * the maximum streaming dimension, bokeh effect may not be applied for this stream for
- * PREVIEW intent.</p>
- * <p>For CONTINUOUS mode, the maximum streaming dimension specifies the limit under which
- * bokeh is effective. This dimension must be one of the YUV_420_888 or PRIVATE resolutions
- * in availableStreamConfigurations, and if the sensor maximum resolution is larger than or
- * equal to 1080p, the maximum streaming dimension must be at least 1080p. If the
- * application configures a stream with larger dimension, the stream may not have bokeh
- * effect applied.</p>
+ * <p>The list of extended scene modes for {@link CaptureRequest#CONTROL_EXTENDED_SCENE_MODE android.control.extendedSceneMode} that are supported
+ * by this camera device, and each extended scene mode's maximum streaming (non-stall) size
+ * with effect.</p>
+ * <p>For DISABLED mode, the camera behaves normally with no extended scene mode enabled.</p>
+ * <p>For BOKEH_STILL_CAPTURE mode, the maximum streaming dimension specifies the limit
+ * under which bokeh is effective when capture intent is PREVIEW. Note that when capture
+ * intent is PREVIEW, the bokeh effect may not be as high in quality compared to
+ * STILL_CAPTURE intent in order to maintain reasonable frame rate. The maximum streaming
+ * dimension must be one of the YUV_420_888 or PRIVATE resolutions in
+ * availableStreamConfigurations, or (0, 0) if preview bokeh is not supported. If the
+ * application configures a stream larger than the maximum streaming dimension, bokeh
+ * effect may not be applied for this stream for PREVIEW intent.</p>
+ * <p>For BOKEH_CONTINUOUS mode, the maximum streaming dimension specifies the limit under
+ * which bokeh is effective. This dimension must be one of the YUV_420_888 or PRIVATE
+ * resolutions in availableStreamConfigurations, and if the sensor maximum resolution is
+ * larger than or equal to 1080p, the maximum streaming dimension must be at least 1080p.
+ * If the application configures a stream with larger dimension, the stream may not have
+ * bokeh effect applied.</p>
* <p><b>Units</b>: (mode, width, height)</p>
* <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
* <p><b>Limited capability</b> -
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
*
- * @see CaptureRequest#CONTROL_BOKEH_MODE
+ * @see CaptureRequest#CONTROL_EXTENDED_SCENE_MODE
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
* @hide
*/
- public static final Key<int[]> CONTROL_AVAILABLE_BOKEH_MAX_SIZES =
- new Key<int[]>("android.control.availableBokehMaxSizes", int[].class);
+ public static final Key<int[]> CONTROL_AVAILABLE_EXTENDED_SCENE_MODE_MAX_SIZES =
+ new Key<int[]>("android.control.availableExtendedSceneModeMaxSizes", int[].class);
/**
- * <p>The ranges of supported zoom ratio for non-OFF {@link CaptureRequest#CONTROL_BOKEH_MODE android.control.bokehMode}.</p>
- * <p>When bokeh mode is enabled, the camera device may have limited range of zoom ratios
- * compared to when bokeh mode is disabled. This tag lists the zoom ratio ranges for all
- * supported non-OFF bokeh modes, in the same order as in
- * {@link CameraCharacteristics#CONTROL_AVAILABLE_BOKEH_CAPABILITIES android.control.availableBokehCapabilities}.</p>
+ * <p>The ranges of supported zoom ratio for non-DISABLED {@link CaptureRequest#CONTROL_EXTENDED_SCENE_MODE android.control.extendedSceneMode}.</p>
+ * <p>When extended scene mode is set, the camera device may have limited range of zoom ratios
+ * compared to when extended scene mode is DISABLED. This tag lists the zoom ratio ranges
+ * for all supported non-DISABLED extended scene modes, in the same order as in
+ * android.control.availableExtended.</p>
* <p>Range [1.0, 1.0] means that no zoom (optical or digital) is supported.</p>
* <p><b>Units</b>: (minZoom, maxZoom)</p>
* <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
@@ -1168,46 +1169,45 @@
* Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the
* {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p>
*
- * @see CameraCharacteristics#CONTROL_AVAILABLE_BOKEH_CAPABILITIES
- * @see CaptureRequest#CONTROL_BOKEH_MODE
+ * @see CaptureRequest#CONTROL_EXTENDED_SCENE_MODE
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
* @hide
*/
- public static final Key<float[]> CONTROL_AVAILABLE_BOKEH_ZOOM_RATIO_RANGES =
- new Key<float[]>("android.control.availableBokehZoomRatioRanges", float[].class);
+ public static final Key<float[]> CONTROL_AVAILABLE_EXTENDED_SCENE_MODE_ZOOM_RATIO_RANGES =
+ new Key<float[]>("android.control.availableExtendedSceneModeZoomRatioRanges", float[].class);
/**
- * <p>The list of bokeh modes for {@link CaptureRequest#CONTROL_BOKEH_MODE android.control.bokehMode} that are supported by
- * this camera device, and each bokeh mode's capabilities such as maximum streaming size
- * with bokeh effect, and supported zoom ratio ranges.</p>
- * <p>For OFF mode, the camera behaves normally with no bokeh effect.</p>
- * <p>For STILL_CAPTURE mode, the maximum streaming dimension specifies the limit under which
- * bokeh is effective when capture intent is PREVIEW. Note that when capture intent is
- * PREVIEW, the bokeh effect may not be as high quality compared to STILL_CAPTURE intent
- * in order to maintain reasonable frame rate. The maximum streaming dimension must be one
- * of the YUV_420_888 or PRIVATE resolutions in availableStreamConfigurations, or (0, 0)
- * if preview bokeh is not supported. If the application configures a stream larger than
- * the maximum streaming dimension, bokeh effect may not be applied for this stream for
- * PREVIEW intent.</p>
- * <p>For CONTINUOUS mode, the maximum streaming dimension specifies the limit under which
- * bokeh is effective. This dimension must be one of the YUV_420_888 or PRIVATE resolutions
- * in availableStreamConfigurations, and if the sensor maximum resolution is larger than or
- * equal to 1080p, the maximum streaming dimension must be at least 1080p. If the
- * application configures a stream with larger dimension, the stream may not have bokeh
- * effect applied.</p>
- * <p>When bokeh mode is enabled, the camera device may have limited range of zoom ratios
- * compared to when bokeh mode is disabled. availableBokehCapabilities lists the zoom
- * ranges for all supported bokeh modes. A range of (1.0, 1.0) means that no zoom
+ * <p>The list of extended scene modes for {@link CaptureRequest#CONTROL_EXTENDED_SCENE_MODE android.control.extendedSceneMode} that
+ * are supported by this camera device, and each extended scene mode's capabilities such
+ * as maximum streaming size, and supported zoom ratio ranges.</p>
+ * <p>For DISABLED mode, the camera behaves normally with no extended scene mdoe enabled.</p>
+ * <p>For BOKEH_STILL_CAPTURE mode, the maximum streaming dimension specifies the limit
+ * under which bokeh is effective when capture intent is PREVIEW. Note that when capture
+ * intent is PREVIEW, the bokeh effect may not be as high quality compared to STILL_CAPTURE
+ * intent in order to maintain reasonable frame rate. The maximum streaming dimension must
+ * be one of the YUV_420_888 or PRIVATE resolutions in availableStreamConfigurations, or
+ * (0, 0) if preview bokeh is not supported. If the application configures a stream
+ * larger than the maximum streaming dimension, bokeh effect may not be applied for this
+ * stream for PREVIEW intent.</p>
+ * <p>For BOKEH_CONTINUOUS mode, the maximum streaming dimension specifies the limit under
+ * which bokeh is effective. This dimension must be one of the YUV_420_888 or PRIVATE
+ * resolutions in availableStreamConfigurations, and if the sensor maximum resolution is
+ * larger than or equal to 1080p, the maximum streaming dimension must be at least 1080p.
+ * If the application configures a stream with larger dimension, the stream may not have
+ * bokeh effect applied.</p>
+ * <p>When extended scene mode is set, the camera device may have limited range of zoom ratios
+ * compared to when the mode is DISABLED. availableExtendedSceneModeCapabilities lists the
+ * zoom ranges for all supported extended modes. A range of (1.0, 1.0) means that no zoom
* (optical or digital) is supported.</p>
* <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
- * @see CaptureRequest#CONTROL_BOKEH_MODE
+ * @see CaptureRequest#CONTROL_EXTENDED_SCENE_MODE
*/
@PublicKey
@NonNull
@SyntheticKey
- public static final Key<android.hardware.camera2.params.Capability[]> CONTROL_AVAILABLE_BOKEH_CAPABILITIES =
- new Key<android.hardware.camera2.params.Capability[]>("android.control.availableBokehCapabilities", android.hardware.camera2.params.Capability[].class);
+ public static final Key<android.hardware.camera2.params.Capability[]> CONTROL_AVAILABLE_EXTENDED_SCENE_MODE_CAPABILITIES =
+ new Key<android.hardware.camera2.params.Capability[]>("android.control.availableExtendedSceneModeCapabilities", android.hardware.camera2.params.Capability[].class);
/**
* <p>Minimum and maximum zoom ratios supported by this camera device.</p>
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index 7bf819f..91dae66 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -2190,6 +2190,7 @@
* This setting can only be used if scene mode is supported (i.e.
* {@link CameraCharacteristics#CONTROL_AVAILABLE_SCENE_MODES android.control.availableSceneModes}
* contain some modes other than DISABLED).</p>
+ * <p>For extended scene modes such as BOKEH, please use USE_EXTENDED_SCENE_MODE instead.</p>
*
* @see CameraCharacteristics#CONTROL_AVAILABLE_SCENE_MODES
* @see CaptureRequest#CONTROL_MODE
@@ -2209,6 +2210,19 @@
*/
public static final int CONTROL_MODE_OFF_KEEP_STATE = 3;
+ /**
+ * <p>Use a specific extended scene mode.</p>
+ * <p>When extended scene mode is on, the camera device may override certain control
+ * parameters, such as targetFpsRange, AE, AWB, and AF modes, to achieve best power and
+ * quality tradeoffs. Only the mandatory stream combinations of LIMITED hardware level
+ * are guaranteed.</p>
+ * <p>This setting can only be used if extended scene mode is supported (i.e.
+ * android.control.availableExtendedSceneModes
+ * contains some modes other than DISABLED).</p>
+ * @see CaptureRequest#CONTROL_MODE
+ */
+ public static final int CONTROL_MODE_USE_EXTENDED_SCENE_MODE = 4;
+
//
// Enumeration values for CaptureRequest#CONTROL_SCENE_MODE
//
@@ -2540,32 +2554,39 @@
public static final int CONTROL_VIDEO_STABILIZATION_MODE_ON = 1;
//
- // Enumeration values for CaptureRequest#CONTROL_BOKEH_MODE
+ // Enumeration values for CaptureRequest#CONTROL_EXTENDED_SCENE_MODE
//
/**
- * <p>Bokeh mode is disabled.</p>
- * @see CaptureRequest#CONTROL_BOKEH_MODE
+ * <p>Extended scene mode is disabled.</p>
+ * @see CaptureRequest#CONTROL_EXTENDED_SCENE_MODE
*/
- public static final int CONTROL_BOKEH_MODE_OFF = 0;
+ public static final int CONTROL_EXTENDED_SCENE_MODE_DISABLED = 0;
/**
* <p>High quality bokeh mode is enabled for all non-raw streams (including YUV,
* JPEG, and IMPLEMENTATION_DEFINED) when capture intent is STILL_CAPTURE. Due to the
* extra image processing, this mode may introduce additional stall to non-raw streams.
* This mode should be used in high quality still capture use case.</p>
- * @see CaptureRequest#CONTROL_BOKEH_MODE
+ * @see CaptureRequest#CONTROL_EXTENDED_SCENE_MODE
*/
- public static final int CONTROL_BOKEH_MODE_STILL_CAPTURE = 1;
+ public static final int CONTROL_EXTENDED_SCENE_MODE_BOKEH_STILL_CAPTURE = 1;
/**
* <p>Bokeh effect must not slow down capture rate relative to sensor raw output,
* and the effect is applied to all processed streams no larger than the maximum
* streaming dimension. This mode should be used if performance and power are a
* priority, such as video recording.</p>
- * @see CaptureRequest#CONTROL_BOKEH_MODE
+ * @see CaptureRequest#CONTROL_EXTENDED_SCENE_MODE
*/
- public static final int CONTROL_BOKEH_MODE_CONTINUOUS = 2;
+ public static final int CONTROL_EXTENDED_SCENE_MODE_BOKEH_CONTINUOUS = 2;
+
+ /**
+ * <p>Vendor defined extended scene modes. These depend on vendor implementation.</p>
+ * @see CaptureRequest#CONTROL_EXTENDED_SCENE_MODE
+ * @hide
+ */
+ public static final int CONTROL_EXTENDED_SCENE_MODE_VENDOR_START = 0x40;
//
// Enumeration values for CaptureRequest#EDGE_MODE
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index c1554af..0ee7482 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -1911,10 +1911,10 @@
* capture parameters itself.</p>
* <p>When set to AUTO, the individual algorithm controls in
* android.control.* are in effect, such as {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode}.</p>
- * <p>When set to USE_SCENE_MODE, the individual controls in
+ * <p>When set to USE_SCENE_MODE or USE_EXTENDED_SCENE_MODE, the individual controls in
* android.control.* are mostly disabled, and the camera device
- * implements one of the scene mode settings (such as ACTION,
- * SUNSET, or PARTY) as it wishes. The camera device scene mode
+ * implements one of the scene mode or extended scene mode settings (such as ACTION,
+ * SUNSET, PARTY, or BOKEH) as it wishes. The camera device scene mode
* 3A settings are provided by {@link android.hardware.camera2.CaptureResult capture results}.</p>
* <p>When set to OFF_KEEP_STATE, it is similar to OFF mode, the only difference
* is that this frame will not be used by camera device background 3A statistics
@@ -1927,6 +1927,7 @@
* <li>{@link #CONTROL_MODE_AUTO AUTO}</li>
* <li>{@link #CONTROL_MODE_USE_SCENE_MODE USE_SCENE_MODE}</li>
* <li>{@link #CONTROL_MODE_OFF_KEEP_STATE OFF_KEEP_STATE}</li>
+ * <li>{@link #CONTROL_MODE_USE_EXTENDED_SCENE_MODE USE_EXTENDED_SCENE_MODE}</li>
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#CONTROL_AVAILABLE_MODES android.control.availableModes}</p>
@@ -1938,6 +1939,7 @@
* @see #CONTROL_MODE_AUTO
* @see #CONTROL_MODE_USE_SCENE_MODE
* @see #CONTROL_MODE_OFF_KEEP_STATE
+ * @see #CONTROL_MODE_USE_EXTENDED_SCENE_MODE
*/
@PublicKey
@NonNull
@@ -2127,52 +2129,49 @@
new Key<Boolean>("android.control.enableZsl", boolean.class);
/**
- * <p>Whether bokeh mode is enabled for a particular capture request.</p>
+ * <p>Whether extended scene mode is enabled for a particular capture request.</p>
* <p>With bokeh mode, the camera device may blur out the parts of scene that are not in
* focus, creating a bokeh (or shallow depth of field) effect for people or objects.</p>
- * <p>When set to STILL_CAPTURE bokeh mode with STILL_CAPTURE capture intent, due to the extra
+ * <p>When set to BOKEH_STILL_CAPTURE mode with STILL_CAPTURE capture intent, due to the extra
* processing needed for high quality bokeh effect, the stall may be longer than when
* capture intent is not STILL_CAPTURE.</p>
- * <p>When set to STILL_CAPTURE bokeh mode with PREVIEW capture intent,</p>
+ * <p>When set to BOKEH_STILL_CAPTURE mode with PREVIEW capture intent,</p>
* <ul>
* <li>If the camera device has BURST_CAPTURE capability, the frame rate requirement of
* BURST_CAPTURE must still be met.</li>
- * <li>All streams not larger than the maximum streaming dimension for STILL_CAPTURE mode
- * (queried via {@link android.hardware.camera2.CameraCharacteristics#CONTROL_AVAILABLE_BOKEH_CAPABILITIES })
+ * <li>All streams not larger than the maximum streaming dimension for BOKEH_STILL_CAPTURE mode
+ * (queried via {@link android.hardware.camera2.CameraCharacteristics#CONTROL_AVAILABLE_EXTENDED_SCENE_MODE_CAPABILITIES })
* will have preview bokeh effect applied.</li>
* </ul>
- * <p>When set to CONTINUOUS mode, configured streams dimension should not exceed this mode's
+ * <p>When set to BOKEH_CONTINUOUS mode, configured streams dimension should not exceed this mode's
* maximum streaming dimension in order to have bokeh effect applied. Bokeh effect may not
* be available for streams larger than the maximum streaming dimension.</p>
- * <p>Switching between different bokeh modes may involve reconfiguration of the camera
+ * <p>Switching between different extended scene modes may involve reconfiguration of the camera
* pipeline, resulting in long latency. The application should check this key against the
* available session keys queried via
* {@link android.hardware.camera2.CameraCharacteristics#getAvailableSessionKeys }.</p>
- * <p>When bokeh mode is on, the camera device may override certain control parameters, such as
- * reduce frame rate or use face priority scene mode, to achieve best power and quality
- * tradeoffs. When turned on, AE, AWB, and AF run in auto modes, and only the mandatory
- * stream combinations of LIMITED hardware level are guaranteed.</p>
* <p>For a logical multi-camera, bokeh may be implemented by stereo vision from sub-cameras
* with different field of view. As a result, when bokeh mode is enabled, the camera device
- * may override {@link CaptureRequest#SCALER_CROP_REGION android.scaler.cropRegion}, and the field of view will be smaller than when
- * bokeh mode is off.</p>
+ * may override {@link CaptureRequest#SCALER_CROP_REGION android.scaler.cropRegion} or {@link CaptureRequest#CONTROL_ZOOM_RATIO android.control.zoomRatio}, and the field of
+ * view may be smaller than when bokeh mode is off.</p>
* <p><b>Possible values:</b>
* <ul>
- * <li>{@link #CONTROL_BOKEH_MODE_OFF OFF}</li>
- * <li>{@link #CONTROL_BOKEH_MODE_STILL_CAPTURE STILL_CAPTURE}</li>
- * <li>{@link #CONTROL_BOKEH_MODE_CONTINUOUS CONTINUOUS}</li>
+ * <li>{@link #CONTROL_EXTENDED_SCENE_MODE_DISABLED DISABLED}</li>
+ * <li>{@link #CONTROL_EXTENDED_SCENE_MODE_BOKEH_STILL_CAPTURE BOKEH_STILL_CAPTURE}</li>
+ * <li>{@link #CONTROL_EXTENDED_SCENE_MODE_BOKEH_CONTINUOUS BOKEH_CONTINUOUS}</li>
* </ul></p>
* <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
+ * @see CaptureRequest#CONTROL_ZOOM_RATIO
* @see CaptureRequest#SCALER_CROP_REGION
- * @see #CONTROL_BOKEH_MODE_OFF
- * @see #CONTROL_BOKEH_MODE_STILL_CAPTURE
- * @see #CONTROL_BOKEH_MODE_CONTINUOUS
+ * @see #CONTROL_EXTENDED_SCENE_MODE_DISABLED
+ * @see #CONTROL_EXTENDED_SCENE_MODE_BOKEH_STILL_CAPTURE
+ * @see #CONTROL_EXTENDED_SCENE_MODE_BOKEH_CONTINUOUS
*/
@PublicKey
@NonNull
- public static final Key<Integer> CONTROL_BOKEH_MODE =
- new Key<Integer>("android.control.bokehMode", int.class);
+ public static final Key<Integer> CONTROL_EXTENDED_SCENE_MODE =
+ new Key<Integer>("android.control.extendedSceneMode", int.class);
/**
* <p>The desired zoom ratio</p>
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index b4c1d72..096aa0c 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -2118,10 +2118,10 @@
* capture parameters itself.</p>
* <p>When set to AUTO, the individual algorithm controls in
* android.control.* are in effect, such as {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode}.</p>
- * <p>When set to USE_SCENE_MODE, the individual controls in
+ * <p>When set to USE_SCENE_MODE or USE_EXTENDED_SCENE_MODE, the individual controls in
* android.control.* are mostly disabled, and the camera device
- * implements one of the scene mode settings (such as ACTION,
- * SUNSET, or PARTY) as it wishes. The camera device scene mode
+ * implements one of the scene mode or extended scene mode settings (such as ACTION,
+ * SUNSET, PARTY, or BOKEH) as it wishes. The camera device scene mode
* 3A settings are provided by {@link android.hardware.camera2.CaptureResult capture results}.</p>
* <p>When set to OFF_KEEP_STATE, it is similar to OFF mode, the only difference
* is that this frame will not be used by camera device background 3A statistics
@@ -2134,6 +2134,7 @@
* <li>{@link #CONTROL_MODE_AUTO AUTO}</li>
* <li>{@link #CONTROL_MODE_USE_SCENE_MODE USE_SCENE_MODE}</li>
* <li>{@link #CONTROL_MODE_OFF_KEEP_STATE OFF_KEEP_STATE}</li>
+ * <li>{@link #CONTROL_MODE_USE_EXTENDED_SCENE_MODE USE_EXTENDED_SCENE_MODE}</li>
* </ul></p>
* <p><b>Available values for this device:</b><br>
* {@link CameraCharacteristics#CONTROL_AVAILABLE_MODES android.control.availableModes}</p>
@@ -2145,6 +2146,7 @@
* @see #CONTROL_MODE_AUTO
* @see #CONTROL_MODE_USE_SCENE_MODE
* @see #CONTROL_MODE_OFF_KEEP_STATE
+ * @see #CONTROL_MODE_USE_EXTENDED_SCENE_MODE
*/
@PublicKey
@NonNull
@@ -2357,52 +2359,49 @@
new Key<Integer>("android.control.afSceneChange", int.class);
/**
- * <p>Whether bokeh mode is enabled for a particular capture request.</p>
+ * <p>Whether extended scene mode is enabled for a particular capture request.</p>
* <p>With bokeh mode, the camera device may blur out the parts of scene that are not in
* focus, creating a bokeh (or shallow depth of field) effect for people or objects.</p>
- * <p>When set to STILL_CAPTURE bokeh mode with STILL_CAPTURE capture intent, due to the extra
+ * <p>When set to BOKEH_STILL_CAPTURE mode with STILL_CAPTURE capture intent, due to the extra
* processing needed for high quality bokeh effect, the stall may be longer than when
* capture intent is not STILL_CAPTURE.</p>
- * <p>When set to STILL_CAPTURE bokeh mode with PREVIEW capture intent,</p>
+ * <p>When set to BOKEH_STILL_CAPTURE mode with PREVIEW capture intent,</p>
* <ul>
* <li>If the camera device has BURST_CAPTURE capability, the frame rate requirement of
* BURST_CAPTURE must still be met.</li>
- * <li>All streams not larger than the maximum streaming dimension for STILL_CAPTURE mode
- * (queried via {@link android.hardware.camera2.CameraCharacteristics#CONTROL_AVAILABLE_BOKEH_CAPABILITIES })
+ * <li>All streams not larger than the maximum streaming dimension for BOKEH_STILL_CAPTURE mode
+ * (queried via {@link android.hardware.camera2.CameraCharacteristics#CONTROL_AVAILABLE_EXTENDED_SCENE_MODE_CAPABILITIES })
* will have preview bokeh effect applied.</li>
* </ul>
- * <p>When set to CONTINUOUS mode, configured streams dimension should not exceed this mode's
+ * <p>When set to BOKEH_CONTINUOUS mode, configured streams dimension should not exceed this mode's
* maximum streaming dimension in order to have bokeh effect applied. Bokeh effect may not
* be available for streams larger than the maximum streaming dimension.</p>
- * <p>Switching between different bokeh modes may involve reconfiguration of the camera
+ * <p>Switching between different extended scene modes may involve reconfiguration of the camera
* pipeline, resulting in long latency. The application should check this key against the
* available session keys queried via
* {@link android.hardware.camera2.CameraCharacteristics#getAvailableSessionKeys }.</p>
- * <p>When bokeh mode is on, the camera device may override certain control parameters, such as
- * reduce frame rate or use face priority scene mode, to achieve best power and quality
- * tradeoffs. When turned on, AE, AWB, and AF run in auto modes, and only the mandatory
- * stream combinations of LIMITED hardware level are guaranteed.</p>
* <p>For a logical multi-camera, bokeh may be implemented by stereo vision from sub-cameras
* with different field of view. As a result, when bokeh mode is enabled, the camera device
- * may override {@link CaptureRequest#SCALER_CROP_REGION android.scaler.cropRegion}, and the field of view will be smaller than when
- * bokeh mode is off.</p>
+ * may override {@link CaptureRequest#SCALER_CROP_REGION android.scaler.cropRegion} or {@link CaptureRequest#CONTROL_ZOOM_RATIO android.control.zoomRatio}, and the field of
+ * view may be smaller than when bokeh mode is off.</p>
* <p><b>Possible values:</b>
* <ul>
- * <li>{@link #CONTROL_BOKEH_MODE_OFF OFF}</li>
- * <li>{@link #CONTROL_BOKEH_MODE_STILL_CAPTURE STILL_CAPTURE}</li>
- * <li>{@link #CONTROL_BOKEH_MODE_CONTINUOUS CONTINUOUS}</li>
+ * <li>{@link #CONTROL_EXTENDED_SCENE_MODE_DISABLED DISABLED}</li>
+ * <li>{@link #CONTROL_EXTENDED_SCENE_MODE_BOKEH_STILL_CAPTURE BOKEH_STILL_CAPTURE}</li>
+ * <li>{@link #CONTROL_EXTENDED_SCENE_MODE_BOKEH_CONTINUOUS BOKEH_CONTINUOUS}</li>
* </ul></p>
* <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
*
+ * @see CaptureRequest#CONTROL_ZOOM_RATIO
* @see CaptureRequest#SCALER_CROP_REGION
- * @see #CONTROL_BOKEH_MODE_OFF
- * @see #CONTROL_BOKEH_MODE_STILL_CAPTURE
- * @see #CONTROL_BOKEH_MODE_CONTINUOUS
+ * @see #CONTROL_EXTENDED_SCENE_MODE_DISABLED
+ * @see #CONTROL_EXTENDED_SCENE_MODE_BOKEH_STILL_CAPTURE
+ * @see #CONTROL_EXTENDED_SCENE_MODE_BOKEH_CONTINUOUS
*/
@PublicKey
@NonNull
- public static final Key<Integer> CONTROL_BOKEH_MODE =
- new Key<Integer>("android.control.bokehMode", int.class);
+ public static final Key<Integer> CONTROL_EXTENDED_SCENE_MODE =
+ new Key<Integer>("android.control.extendedSceneMode", int.class);
/**
* <p>The desired zoom ratio</p>
diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
index df77f52..786db6e 100644
--- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
+++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
@@ -714,12 +714,12 @@
}
});
sGetCommandMap.put(
- CameraCharacteristics.CONTROL_AVAILABLE_BOKEH_CAPABILITIES.getNativeKey(),
+ CameraCharacteristics.CONTROL_AVAILABLE_EXTENDED_SCENE_MODE_CAPABILITIES.getNativeKey(),
new GetCommand() {
@Override
@SuppressWarnings("unchecked")
public <T> T getValue(CameraMetadataNative metadata, Key<T> key) {
- return (T) metadata.getBokehCapabilities();
+ return (T) metadata.getExtendedSceneModeCapabilities();
}
});
}
@@ -1442,53 +1442,55 @@
return samples;
}
- private Capability[] getBokehCapabilities() {
- int[] bokehMaxSizes = getBase(CameraCharacteristics.CONTROL_AVAILABLE_BOKEH_MAX_SIZES);
- float[] bokehZoomRanges = getBase(
- CameraCharacteristics.CONTROL_AVAILABLE_BOKEH_ZOOM_RATIO_RANGES);
+ private Capability[] getExtendedSceneModeCapabilities() {
+ int[] maxSizes =
+ getBase(CameraCharacteristics.CONTROL_AVAILABLE_EXTENDED_SCENE_MODE_MAX_SIZES);
+ float[] zoomRanges = getBase(
+ CameraCharacteristics.CONTROL_AVAILABLE_EXTENDED_SCENE_MODE_ZOOM_RATIO_RANGES);
Range<Float> zoomRange = getBase(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE);
float maxDigitalZoom = getBase(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
- if (bokehMaxSizes == null) {
+ if (maxSizes == null) {
return null;
}
- if (bokehMaxSizes.length % 3 != 0) {
- throw new AssertionError("availableBokehMaxSizes must be tuples of " +
- "[mode, width, height]");
+ if (maxSizes.length % 3 != 0) {
+ throw new AssertionError("availableExtendedSceneModeMaxSizes must be tuples of "
+ + "[mode, width, height]");
}
- int numBokehModes = bokehMaxSizes.length / 3;
- int numBokehZoomRanges = 0;
- if (bokehZoomRanges != null) {
- if (bokehZoomRanges.length % 2 != 0) {
- throw new AssertionError("availableBokehZoomRanges must be tuples of " +
- "[minZoom, maxZoom]");
+ int numExtendedSceneModes = maxSizes.length / 3;
+ int numExtendedSceneModeZoomRanges = 0;
+ if (zoomRanges != null) {
+ if (zoomRanges.length % 2 != 0) {
+ throw new AssertionError("availableExtendedSceneModeZoomRanges must be tuples of "
+ + "[minZoom, maxZoom]");
}
- numBokehZoomRanges = bokehZoomRanges.length / 2;
- if (numBokehModes - numBokehZoomRanges != 1) {
- throw new AssertionError("Number of bokeh zoom ranges must be 1 less than " +
- "number of supported bokeh modes");
+ numExtendedSceneModeZoomRanges = zoomRanges.length / 2;
+ if (numExtendedSceneModes - numExtendedSceneModeZoomRanges != 1) {
+ throw new AssertionError("Number of extended scene mode zoom ranges must be 1 "
+ + "less than number of supported modes");
}
}
- float bokehOffMinZoomRatio = 1.0f;
- float bokehOffMaxZoomRatio = maxDigitalZoom;
+ float modeOffMinZoomRatio = 1.0f;
+ float modeOffMaxZoomRatio = maxDigitalZoom;
if (zoomRange != null) {
- bokehOffMinZoomRatio = zoomRange.getLower();
- bokehOffMaxZoomRatio = zoomRange.getUpper();
+ modeOffMinZoomRatio = zoomRange.getLower();
+ modeOffMaxZoomRatio = zoomRange.getUpper();
}
- Capability[] capabilities = new Capability[numBokehModes];
- for (int i = 0, j = 0; i < numBokehModes; i++) {
- int mode = bokehMaxSizes[3 * i];
- int width = bokehMaxSizes[3 * i + 1];
- int height = bokehMaxSizes[3 * i + 2];
- if (mode != CameraMetadata.CONTROL_BOKEH_MODE_OFF && j < numBokehZoomRanges) {
- capabilities[i] = new Capability(mode, width, height, bokehZoomRanges[2 * j],
- bokehZoomRanges[2 * j + 1]);
+ Capability[] capabilities = new Capability[numExtendedSceneModes];
+ for (int i = 0, j = 0; i < numExtendedSceneModes; i++) {
+ int mode = maxSizes[3 * i];
+ int width = maxSizes[3 * i + 1];
+ int height = maxSizes[3 * i + 2];
+ if (mode != CameraMetadata.CONTROL_EXTENDED_SCENE_MODE_DISABLED
+ && j < numExtendedSceneModeZoomRanges) {
+ capabilities[i] = new Capability(mode, width, height, zoomRanges[2 * j],
+ zoomRanges[2 * j + 1]);
j++;
} else {
- capabilities[i] = new Capability(mode, width, height, bokehOffMinZoomRatio,
- bokehOffMaxZoomRatio);
+ capabilities[i] = new Capability(mode, width, height, modeOffMinZoomRatio,
+ modeOffMaxZoomRatio);
}
}
diff --git a/core/java/android/hardware/camera2/params/Capability.java b/core/java/android/hardware/camera2/params/Capability.java
index 367690c..6f59c5f 100644
--- a/core/java/android/hardware/camera2/params/Capability.java
+++ b/core/java/android/hardware/camera2/params/Capability.java
@@ -30,7 +30,7 @@
* Immutable class to store the camera capability, its corresponding maximum
* streaming dimension and zoom range.
*
- * @see CameraCharacteristics#CONTROL_AVAILABLE_BOKEH_CAPABILITIES
+ * @see CameraCharacteristics#CONTROL_AVAILABLE_EXTENDED_SCENE_MODE_CAPABILITIES
*/
public final class Capability {
@@ -72,10 +72,10 @@
/**
* Return the supported mode for this capability.
*
- * @return One of supported modes for the capability. For example, for available bokeh modes,
- * this will be one of {@link CameraMetadata#CONTROL_BOKEH_MODE_OFF},
- * {@link CameraMetadata#CONTROL_BOKEH_MODE_STILL_CAPTURE}, and
- * {@link CameraMetadata#CONTROL_BOKEH_MODE_CONTINUOUS}.
+ * @return One of supported modes for the capability. For example, for available extended
+ * scene modes, this will be one of {@link CameraMetadata#CONTROL_EXTENDED_SCENE_MODE_DISABLED},
+ * {@link CameraMetadata#CONTROL_EXTENDED_SCENE_MODE_BOKEH_STILL_CAPTURE}, and
+ * {@link CameraMetadata#CONTROL_EXTENDED_SCENE_MODE_BOKEH_CONTINUOUS}.
*/
public int getMode() {
return mMode;
diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java
index b422252..23e38ae 100644
--- a/core/java/android/hardware/face/FaceManager.java
+++ b/core/java/android/hardware/face/FaceManager.java
@@ -29,9 +29,7 @@
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricFaceConstants;
-import android.hardware.biometrics.BiometricNativeHandleUtils;
import android.hardware.biometrics.CryptoObject;
-import android.hardware.biometrics.IBiometricNativeHandle;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.os.Binder;
import android.os.CancellationSignal;
@@ -40,7 +38,6 @@
import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.Looper;
-import android.os.NativeHandle;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.Trace;
@@ -250,19 +247,6 @@
}
/**
- * Defaults to {@link FaceManager#enroll(int, byte[], CancellationSignal, EnrollmentCallback,
- * int[], NativeHandle)} with {@code windowId} set to null.
- *
- * @see FaceManager#enroll(int, byte[], CancellationSignal, EnrollmentCallback, int[],
- * NativeHandle)
- */
- @RequiresPermission(MANAGE_BIOMETRIC)
- public void enroll(int userId, byte[] token, CancellationSignal cancel,
- EnrollmentCallback callback, int[] disabledFeatures) {
- enroll(userId, token, cancel, callback, disabledFeatures, null /* windowId */);
- }
-
- /**
* Request face authentication enrollment. This call operates the face authentication hardware
* and starts capturing images. Progress will be indicated by callbacks to the
* {@link EnrollmentCallback} object. It terminates when
@@ -277,13 +261,11 @@
* @param flags optional flags
* @param userId the user to whom this face will belong to
* @param callback an object to receive enrollment events
- * @param windowId optional ID of a camera preview window for a single-camera device. Must be
- * null if not used.
* @hide
*/
@RequiresPermission(MANAGE_BIOMETRIC)
public void enroll(int userId, byte[] token, CancellationSignal cancel,
- EnrollmentCallback callback, int[] disabledFeatures, @Nullable NativeHandle windowId) {
+ EnrollmentCallback callback, int[] disabledFeatures) {
if (callback == null) {
throw new IllegalArgumentException("Must supply an enrollment callback");
}
@@ -298,72 +280,20 @@
}
if (mService != null) {
- IBiometricNativeHandle handle = BiometricNativeHandleUtils.dup(windowId);
try {
mEnrollmentCallback = callback;
Trace.beginSection("FaceManager#enroll");
mService.enroll(userId, mToken, token, mServiceReceiver,
- mContext.getOpPackageName(), disabledFeatures, handle);
- } catch (RemoteException e) {
- Log.w(TAG, "Remote exception in enroll: ", e);
- // Though this may not be a hardware issue, it will cause apps to give up or
- // try again later.
- callback.onEnrollmentError(FACE_ERROR_HW_UNAVAILABLE,
- getErrorString(mContext, FACE_ERROR_HW_UNAVAILABLE,
- 0 /* vendorCode */));
- } finally {
- Trace.endSection();
- BiometricNativeHandleUtils.close(handle);
- }
- }
- }
-
- /**
- * Request face authentication enrollment for a remote client, for example Android Auto.
- * This call operates the face authentication hardware and starts capturing images.
- * Progress will be indicated by callbacks to the
- * {@link EnrollmentCallback} object. It terminates when
- * {@link EnrollmentCallback#onEnrollmentError(int, CharSequence)} or
- * {@link EnrollmentCallback#onEnrollmentProgress(int) is called with remaining == 0, at
- * which point the object is no longer valid. The operation can be canceled by using the
- * provided cancel object.
- *
- * @param token a unique token provided by a recent creation or verification of device
- * credentials (e.g. pin, pattern or password).
- * @param cancel an object that can be used to cancel enrollment
- * @param userId the user to whom this face will belong to
- * @param callback an object to receive enrollment events
- * @hide
- */
- @RequiresPermission(MANAGE_BIOMETRIC)
- public void enrollRemotely(int userId, byte[] token, CancellationSignal cancel,
- EnrollmentCallback callback, int[] disabledFeatures) {
- if (callback == null) {
- throw new IllegalArgumentException("Must supply an enrollment callback");
- }
-
- if (cancel != null) {
- if (cancel.isCanceled()) {
- Log.w(TAG, "enrollRemotely is already canceled.");
- return;
- } else {
- cancel.setOnCancelListener(new OnEnrollCancelListener());
- }
- }
-
- if (mService != null) {
- try {
- mEnrollmentCallback = callback;
- Trace.beginSection("FaceManager#enrollRemotely");
- mService.enrollRemotely(userId, mToken, token, mServiceReceiver,
mContext.getOpPackageName(), disabledFeatures);
} catch (RemoteException e) {
- Log.w(TAG, "Remote exception in enrollRemotely: ", e);
- // Though this may not be a hardware issue, it will cause apps to give up or
- // try again later.
- callback.onEnrollmentError(FACE_ERROR_HW_UNAVAILABLE,
- getErrorString(mContext, FACE_ERROR_HW_UNAVAILABLE,
+ Log.w(TAG, "Remote exception in enroll: ", e);
+ if (callback != null) {
+ // Though this may not be a hardware issue, it will cause apps to give up or
+ // try again later.
+ callback.onEnrollmentError(FACE_ERROR_HW_UNAVAILABLE,
+ getErrorString(mContext, FACE_ERROR_HW_UNAVAILABLE,
0 /* vendorCode */));
+ }
} finally {
Trace.endSection();
}
diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl
index 37b7456..03937e0 100644
--- a/core/java/android/hardware/face/IFaceService.aidl
+++ b/core/java/android/hardware/face/IFaceService.aidl
@@ -15,7 +15,6 @@
*/
package android.hardware.face;
-import android.hardware.biometrics.IBiometricNativeHandle;
import android.hardware.biometrics.IBiometricServiceReceiverInternal;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.face.IFaceServiceReceiver;
@@ -52,10 +51,6 @@
// Start face enrollment
void enroll(int userId, IBinder token, in byte [] cryptoToken, IFaceServiceReceiver receiver,
- String opPackageName, in int [] disabledFeatures, in IBiometricNativeHandle windowId);
-
- // Start remote face enrollment
- void enrollRemotely(int userId, IBinder token, in byte [] cryptoToken, IFaceServiceReceiver receiver,
String opPackageName, in int [] disabledFeatures);
// Cancel enrollment in progress
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index 9145142..d57a7e4b 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -32,9 +32,7 @@
import android.content.pm.PackageManager;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricFingerprintConstants;
-import android.hardware.biometrics.BiometricNativeHandleUtils;
import android.hardware.biometrics.BiometricPrompt;
-import android.hardware.biometrics.IBiometricNativeHandle;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.os.Binder;
import android.os.CancellationSignal;
@@ -43,7 +41,6 @@
import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.Looper;
-import android.os.NativeHandle;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -415,33 +412,15 @@
}
/**
- * Defaults to {@link FingerprintManager#authenticate(CryptoObject, CancellationSignal, int,
- * AuthenticationCallback, Handler, int, NativeHandle)} with {@code windowId} set to null.
- *
- * @see FingerprintManager#authenticate(CryptoObject, CancellationSignal, int,
- * AuthenticationCallback, Handler, int, NativeHandle)
- *
+ * Per-user version, see {@link FingerprintManager#authenticate(CryptoObject,
+ * CancellationSignal, int, AuthenticationCallback, Handler)}. This version does not
+ * display the BiometricPrompt.
+ * @param userId the user ID that the fingerprint hardware will authenticate for.
* @hide
*/
@RequiresPermission(anyOf = {USE_BIOMETRIC, USE_FINGERPRINT})
public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel,
int flags, @NonNull AuthenticationCallback callback, Handler handler, int userId) {
- authenticate(crypto, cancel, flags, callback, handler, userId, null /* windowId */);
- }
-
- /**
- * Per-user version, see {@link FingerprintManager#authenticate(CryptoObject,
- * CancellationSignal, int, AuthenticationCallback, Handler)}. This version does not
- * display the BiometricPrompt.
- * @param userId the user ID that the fingerprint hardware will authenticate for.
- * @param windowId for optical fingerprint sensors that require active illumination by the OLED
- * display. Should be null for devices that don't require illumination.
- * @hide
- */
- @RequiresPermission(anyOf = {USE_BIOMETRIC, USE_FINGERPRINT})
- public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel,
- int flags, @NonNull AuthenticationCallback callback, Handler handler, int userId,
- @Nullable NativeHandle windowId) {
if (callback == null) {
throw new IllegalArgumentException("Must supply an authentication callback");
}
@@ -455,44 +434,26 @@
}
}
- if (mService != null) {
- IBiometricNativeHandle handle = BiometricNativeHandleUtils.dup(windowId);
- try {
- useHandler(handler);
- mAuthenticationCallback = callback;
- mCryptoObject = crypto;
- long sessionId = crypto != null ? crypto.getOpId() : 0;
- mService.authenticate(mToken, sessionId, userId, mServiceReceiver, flags,
- mContext.getOpPackageName(), handle);
- } catch (RemoteException e) {
- Slog.w(TAG, "Remote exception while authenticating: ", e);
+ if (mService != null) try {
+ useHandler(handler);
+ mAuthenticationCallback = callback;
+ mCryptoObject = crypto;
+ long sessionId = crypto != null ? crypto.getOpId() : 0;
+ mService.authenticate(mToken, sessionId, userId, mServiceReceiver, flags,
+ mContext.getOpPackageName());
+ } 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(FINGERPRINT_ERROR_HW_UNAVAILABLE,
getErrorString(mContext, FINGERPRINT_ERROR_HW_UNAVAILABLE,
- 0 /* vendorCode */));
- } finally {
- BiometricNativeHandleUtils.close(handle);
+ 0 /* vendorCode */));
}
}
}
/**
- * Defaults to {@link FingerprintManager#enroll(byte[], CancellationSignal, int, int,
- * EnrollmentCallback, NativeHandle)} with {@code windowId} set to null.
- *
- * @see FingerprintManager#enroll(byte[], CancellationSignal, int, int, EnrollmentCallback,
- * NativeHandle)
- *
- * @hide
- */
- @RequiresPermission(MANAGE_FINGERPRINT)
- public void enroll(byte [] token, CancellationSignal cancel, int flags,
- int userId, EnrollmentCallback callback) {
- enroll(token, cancel, flags, userId, callback, null /* windowId */);
- }
-
- /**
* Request fingerprint enrollment. This call warms up the fingerprint hardware
* and starts scanning for fingerprints. Progress will be indicated by callbacks to the
* {@link EnrollmentCallback} object. It terminates when
@@ -510,7 +471,7 @@
*/
@RequiresPermission(MANAGE_FINGERPRINT)
public void enroll(byte [] token, CancellationSignal cancel, int flags,
- int userId, EnrollmentCallback callback, @Nullable NativeHandle windowId) {
+ int userId, EnrollmentCallback callback) {
if (userId == UserHandle.USER_CURRENT) {
userId = getCurrentUserId();
}
@@ -527,21 +488,18 @@
}
}
- if (mService != null) {
- IBiometricNativeHandle handle = BiometricNativeHandleUtils.dup(windowId);
- try {
- mEnrollmentCallback = callback;
- mService.enroll(mToken, token, userId, mServiceReceiver, flags,
- mContext.getOpPackageName(), handle);
- } catch (RemoteException e) {
- Slog.w(TAG, "Remote exception in enroll: ", e);
+ if (mService != null) try {
+ mEnrollmentCallback = callback;
+ mService.enroll(mToken, token, userId, mServiceReceiver, flags,
+ mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Remote exception in enroll: ", e);
+ if (callback != null) {
// Though this may not be a hardware issue, it will cause apps to give up or try
// again later.
callback.onEnrollmentError(FINGERPRINT_ERROR_HW_UNAVAILABLE,
getErrorString(mContext, FINGERPRINT_ERROR_HW_UNAVAILABLE,
- 0 /* vendorCode */));
- } finally {
- BiometricNativeHandleUtils.close(handle);
+ 0 /* vendorCode */));
}
}
}
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index c33e445..2507c84 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -15,7 +15,6 @@
*/
package android.hardware.fingerprint;
-import android.hardware.biometrics.IBiometricNativeHandle;
import android.hardware.biometrics.IBiometricServiceReceiverInternal;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.fingerprint.IFingerprintClientActiveCallback;
@@ -32,8 +31,7 @@
// USE_FINGERPRINT/USE_BIOMETRIC permission. This is effectively deprecated, since it only comes
// through FingerprintManager now.
void authenticate(IBinder token, long sessionId, int userId,
- IFingerprintServiceReceiver receiver, int flags, String opPackageName,
- in IBiometricNativeHandle windowId);
+ IFingerprintServiceReceiver receiver, int flags, 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
@@ -42,7 +40,7 @@
// startPreparedClient().
void prepareForAuthentication(IBinder token, long sessionId, int userId,
IBiometricServiceReceiverInternal wrapperReceiver, String opPackageName, int cookie,
- int callingUid, int callingPid, int callingUserId, in IBiometricNativeHandle windowId);
+ int callingUid, int callingPid, int callingUserId);
// Starts authentication with the previously prepared client.
void startPreparedClient(int cookie);
@@ -57,7 +55,7 @@
// Start fingerprint enrollment
void enroll(IBinder token, in byte [] cryptoToken, int groupId, IFingerprintServiceReceiver receiver,
- int flags, String opPackageName, in IBiometricNativeHandle windowId);
+ int flags, String opPackageName);
// Cancel enrollment in progress
void cancelEnrollment(IBinder token);
diff --git a/core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java b/core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java
index 1aeb76a3..0593545 100644
--- a/core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java
+++ b/core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java
@@ -43,7 +43,6 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
-import java.util.Set;
/**
* Enrollment information about the different available keyphrases.
@@ -120,11 +119,6 @@
private final KeyphraseMetadata[] mKeyphrases;
/**
- * Set of UIDs associated with the detected enrollment applications.
- */
- private final Set<Integer> mEnrollmentApplicationUids;
-
- /**
* Map between KeyphraseMetadata and the package name of the enrollment app that provides it.
*/
final private Map<KeyphraseMetadata, String> mKeyphrasePackageMap;
@@ -142,13 +136,11 @@
mParseError = "No enrollment applications found";
mKeyphrasePackageMap = Collections.<KeyphraseMetadata, String>emptyMap();
mKeyphrases = null;
- mEnrollmentApplicationUids = Collections.emptySet();
return;
}
List<String> parseErrors = new LinkedList<String>();
mKeyphrasePackageMap = new HashMap<KeyphraseMetadata, String>();
- mEnrollmentApplicationUids = new ArraySet<>();
for (ResolveInfo ri : ris) {
try {
ApplicationInfo ai = pm.getApplicationInfo(
@@ -170,7 +162,6 @@
getKeyphraseMetadataFromApplicationInfo(pm, ai, parseErrors);
if (metadata != null) {
mKeyphrasePackageMap.put(metadata, ai.packageName);
- mEnrollmentApplicationUids.add(ai.uid);
}
} catch (PackageManager.NameNotFoundException e) {
String error = "error parsing voice enrollment meta-data for "
@@ -373,21 +364,9 @@
return null;
}
- /**
- * Tests if the input UID matches a supported enrollment application.
- *
- * @param uid UID of the caller to test against.
- * @return Returns true if input uid matches the uid of a supported enrollment application.
- * False if not.
- */
- public boolean isUidSupportedEnrollmentApplication(int uid) {
- return mEnrollmentApplicationUids.contains(uid);
- }
-
@Override
public String toString() {
return "KeyphraseEnrollmentInfo [KeyphrasePackageMap=" + mKeyphrasePackageMap.toString()
- + ", enrollmentApplicationUids=" + mEnrollmentApplicationUids.toString()
+ ", ParseError=" + mParseError + "]";
}
}
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 2cafcdb..c2ee21d 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -2284,7 +2284,9 @@
// When insets API is enabled, it is responsible for client and server side
// visibility of IME window.
if (isVisibilityAppliedUsingInsetsConsumer()) {
- mInputView.dispatchWindowVisibilityChanged(View.GONE);
+ if (mInputView != null) {
+ mInputView.dispatchWindowVisibilityChanged(View.GONE);
+ }
} else {
mWindow.hide();
}
diff --git a/core/java/android/os/ConfigUpdate.java b/core/java/android/os/ConfigUpdate.java
index a28f5fb..4908919 100644
--- a/core/java/android/os/ConfigUpdate.java
+++ b/core/java/android/os/ConfigUpdate.java
@@ -16,7 +16,6 @@
package android.os;
-import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
@@ -119,14 +118,14 @@
/**
* Update the emergency number database into the devices.
* <p>Extra: {@link #EXTRA_VERSION} the numeric version of the database.
- * <p>Extra: {@link #EXTRA_REQUIRED_HASH} the hash of the database.
+ * <p>Extra: {@link #EXTRA_REQUIRED_HASH} hash of the database, which is encoded by base-16
+ * SHA512.
* <p>Input: {@link android.content.Intent#getData} the URI to download emergency number
* database.
*
* @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.UPDATE_CONFIG)
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_UPDATE_EMERGENCY_NUMBER_DB =
"android.os.action.UPDATE_EMERGENCY_NUMBER_DB";
@@ -141,7 +140,7 @@
public static final String EXTRA_VERSION = "android.os.extra.VERSION";
/**
- * A string to indicate the hash of the data.
+ * Hash of the database, which is encoded by base-16 SHA512.
*
* @hide
*/
diff --git a/core/java/android/os/LimitExceededException.java b/core/java/android/os/LimitExceededException.java
new file mode 100644
index 0000000..d934326
--- /dev/null
+++ b/core/java/android/os/LimitExceededException.java
@@ -0,0 +1,44 @@
+/*
+ * 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 android.os;
+
+import android.annotation.NonNull;
+
+/** Indicates that the app has exceeded a limit set by the System. */
+public class LimitExceededException extends IllegalStateException {
+
+ /**
+ * Constructs a new {@code LimitExceededException} with {@code null} as its
+ * detail message. The cause is not initialized, and may subsequently be
+ * initialized by a call to {@link #initCause}.
+ */
+ public LimitExceededException() {
+ super();
+ }
+
+ /**
+ * Constructs a new {@code LimitExceededException} with the specified detail message.
+ * The cause is not initialized, and may subsequently be initialized by a
+ * call to {@link #initCause}.
+ *
+ * @param message the detail message which is saved for later retrieval
+ * by the {@link #getMessage()} method.
+ */
+ public LimitExceededException(@NonNull String message) {
+ super(message);
+ }
+}
diff --git a/core/java/android/os/TelephonyServiceManager.java b/core/java/android/os/TelephonyServiceManager.java
index 1128f4c..6993671 100644
--- a/core/java/android/os/TelephonyServiceManager.java
+++ b/core/java/android/os/TelephonyServiceManager.java
@@ -17,7 +17,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.SystemApi;
import android.content.Context;
/**
@@ -28,7 +27,6 @@
*
* @hide
*/
-@SystemApi
public class TelephonyServiceManager {
/**
* @hide
@@ -97,7 +95,6 @@
*
* @hide
*/
- @SystemApi
public static class ServiceNotFoundException extends ServiceManager.ServiceNotFoundException {
/**
* Constructor.
diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java
index 1992f1d..aa89b51 100644
--- a/core/java/android/os/VibrationEffect.java
+++ b/core/java/android/os/VibrationEffect.java
@@ -343,6 +343,14 @@
@TestApi
@Nullable
public static VibrationEffect get(Uri uri, Context context) {
+ String[] uris = context.getResources().getStringArray(
+ com.android.internal.R.array.config_ringtoneEffectUris);
+
+ // Skip doing any IPC if we don't have any effects configured.
+ if (uris.length == 0) {
+ return null;
+ }
+
final ContentResolver cr = context.getContentResolver();
Uri uncanonicalUri = cr.uncanonicalize(uri);
if (uncanonicalUri == null) {
@@ -351,8 +359,7 @@
// place.
uncanonicalUri = uri;
}
- String[] uris = context.getResources().getStringArray(
- com.android.internal.R.array.config_ringtoneEffectUris);
+
for (int i = 0; i < uris.length && i < RINGTONES.length; i++) {
if (uris[i] == null) {
continue;
diff --git a/core/java/android/permission/IPermissionManager.aidl b/core/java/android/permission/IPermissionManager.aidl
index 09df72c..235b083 100644
--- a/core/java/android/permission/IPermissionManager.aidl
+++ b/core/java/android/permission/IPermissionManager.aidl
@@ -54,6 +54,8 @@
int checkUidPermission(String permName, int uid);
+ int checkDeviceIdentifierAccess(String packageName, String callingFeatureId, String message, int pid, int uid);
+
void addOnPermissionsChangeListener(in IOnPermissionsChangeListener listener);
void removeOnPermissionsChangeListener(in IOnPermissionsChangeListener listener);
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java
index fc993b8..3dc8e99 100644
--- a/core/java/android/permission/PermissionManager.java
+++ b/core/java/android/permission/PermissionManager.java
@@ -40,6 +40,7 @@
import android.util.Slog;
import com.android.internal.annotations.Immutable;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.CollectionUtils;
import java.util.ArrayList;
@@ -84,10 +85,25 @@
*/
public PermissionManager(@NonNull Context context, IPackageManager packageManager)
throws ServiceManager.ServiceNotFoundException {
+ this(context, packageManager, IPermissionManager.Stub.asInterface(
+ ServiceManager.getServiceOrThrow("permissionmgr")));
+ }
+
+ /**
+ * Creates a new instance with the provided instantiation of the IPermissionManager.
+ *
+ * @param context the current context in which to operate
+ * @param packageManager package manager service to be used for package related permission
+ * requests
+ * @param permissionManager injectable permission manager service
+ * @hide
+ */
+ @VisibleForTesting
+ public PermissionManager(@NonNull Context context, IPackageManager packageManager,
+ IPermissionManager permissionManager) {
mContext = context;
mPackageManager = packageManager;
- mPermissionManager = IPermissionManager.Stub.asInterface(
- ServiceManager.getServiceOrThrow("permissionmgr"));
+ mPermissionManager = permissionManager;
}
/**
@@ -486,6 +502,30 @@
}
}
+ /**
+ * Checks whether the package with the given pid/uid can read device identifiers.
+ *
+ * @param packageName the name of the package to be checked for identifier access
+ * @param message the message to be used for logging during identifier access
+ * verification
+ * @param callingFeatureId the feature in the package
+ * @param pid the process id of the package to be checked
+ * @param uid the uid of the package to be checked
+ * @return {@link PackageManager#PERMISSION_GRANTED} if the package is allowed identifier
+ * access, {@link PackageManager#PERMISSION_DENIED} otherwise
+ * @hide
+ */
+ @SystemApi
+ public int checkDeviceIdentifierAccess(@Nullable String packageName, @Nullable String message,
+ @Nullable String callingFeatureId, int pid, int uid) {
+ try {
+ return mPermissionManager.checkDeviceIdentifierAccess(packageName, message,
+ callingFeatureId, pid, uid);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
/* @hide */
private static int checkPermissionUncached(@Nullable String permission, int pid, int uid) {
final IActivityManager am = ActivityManager.getService();
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index ba3822d..a28ea89 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -8058,8 +8058,11 @@
@RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS)
public static final String SYNC_PARENT_SOUNDS = "sync_parent_sounds";
- /** @hide */
+ /**
+ * @hide
+ */
@UnsupportedAppUsage
+ @TestApi
public static final String IMMERSIVE_MODE_CONFIRMATIONS = "immersive_mode_confirmations";
/**
diff --git a/core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl b/core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl
index 1bcc76b..bed4302 100644
--- a/core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl
+++ b/core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl
@@ -16,6 +16,7 @@
package android.service.autofill;
+import android.content.IntentSender;
import android.os.IBinder;
import android.view.SurfaceControlViewHost;
@@ -30,4 +31,5 @@
void onContent(in SurfaceControlViewHost.SurfacePackage surface);
void onError();
void onTransferTouchFocusToImeWindow(in IBinder sourceInputToken, int displayId);
+ void onStartIntentSender(in IntentSender intentSender);
}
diff --git a/core/java/android/service/autofill/InlineSuggestionRenderService.java b/core/java/android/service/autofill/InlineSuggestionRenderService.java
index 7fbc309..0d4be58 100644
--- a/core/java/android/service/autofill/InlineSuggestionRenderService.java
+++ b/core/java/android/service/autofill/InlineSuggestionRenderService.java
@@ -24,6 +24,7 @@
import android.app.Service;
import android.app.slice.Slice;
import android.content.Intent;
+import android.content.IntentSender;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.Handler;
@@ -60,6 +61,8 @@
private final Handler mHandler = new Handler(Looper.getMainLooper(), null, true);
+ private IInlineSuggestionUiCallback mCallback;
+
private void handleRenderSuggestion(IInlineSuggestionUiCallback callback,
InlinePresentation presentation, int width, int height, IBinder hostInputToken,
int displayId) {
@@ -84,6 +87,7 @@
}
return;
}
+ mCallback = callback;
final InlineSuggestionRoot suggestionRoot = new InlineSuggestionRoot(this, callback);
suggestionRoot.addView(suggestionView);
@@ -155,6 +159,20 @@
}
/**
+ * Starts the {@link IntentSender} from the client app.
+ *
+ * @param intentSender the {@link IntentSender} to start the attribution UI from the client app.
+ */
+ public final void startIntentSender(@NonNull IntentSender intentSender) {
+ if (mCallback == null) return;
+ try {
+ mCallback.onStartIntentSender(intentSender);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Returns the metadata about the renderer. Returns {@code null} if no metadata is provided.
*/
@Nullable
diff --git a/core/java/android/service/storage/ExternalStorageService.java b/core/java/android/service/storage/ExternalStorageService.java
index fe797eb..3b4d84a 100644
--- a/core/java/android/service/storage/ExternalStorageService.java
+++ b/core/java/android/service/storage/ExternalStorageService.java
@@ -25,11 +25,13 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
-import android.os.Looper;
import android.os.ParcelFileDescriptor;
import android.os.ParcelableException;
import android.os.RemoteCallback;
import android.os.RemoteException;
+import android.os.storage.StorageVolume;
+
+import com.android.internal.os.BackgroundThread;
import java.io.File;
import java.io.IOException;
@@ -97,7 +99,7 @@
public @interface SessionFlag {}
private final ExternalStorageServiceWrapper mWrapper = new ExternalStorageServiceWrapper();
- private final Handler mHandler = new Handler(Looper.getMainLooper(), null, true);
+ private final Handler mHandler = BackgroundThread.getHandler();
/**
* Called when the system starts a session associated with {@code deviceFd}
@@ -131,6 +133,20 @@
*/
public abstract void onEndSession(@NonNull String sessionId) throws IOException;
+ /**
+ * Called when any volume's state changes.
+ *
+ * <p> This is required to communicate volume state changes with the Storage Service before
+ * broadcasting to other apps. The Storage Service needs to process any change in the volume
+ * state (before other apps receive a broadcast for the same) to update the database so that
+ * other apps have the correct view of the volume.
+ *
+ * <p> Blocks until the Storage Service processes/scans the volume or fails in doing so.
+ *
+ * @param vol name of the volume that was changed
+ */
+ public abstract void onVolumeStateChanged(@NonNull StorageVolume vol) throws IOException;
+
@Override
@NonNull
public final IBinder onBind(@NonNull Intent intent) {
@@ -154,6 +170,19 @@
}
@Override
+ public void notifyVolumeStateChanged(String sessionId, StorageVolume vol,
+ RemoteCallback callback) {
+ mHandler.post(() -> {
+ try {
+ onVolumeStateChanged(vol);
+ sendResult(sessionId, null /* throwable */, callback);
+ } catch (Throwable t) {
+ sendResult(sessionId, t, callback);
+ }
+ });
+ }
+
+ @Override
public void endSession(String sessionId, RemoteCallback callback) throws RemoteException {
mHandler.post(() -> {
try {
diff --git a/core/java/android/service/storage/IExternalStorageService.aidl b/core/java/android/service/storage/IExternalStorageService.aidl
index ae46f1f..30fefd3 100644
--- a/core/java/android/service/storage/IExternalStorageService.aidl
+++ b/core/java/android/service/storage/IExternalStorageService.aidl
@@ -18,6 +18,7 @@
import android.os.ParcelFileDescriptor;
import android.os.RemoteCallback;
+import android.os.storage.StorageVolume;
/**
* @hide
@@ -27,4 +28,6 @@
void startSession(@utf8InCpp String sessionId, int type, in ParcelFileDescriptor deviceFd,
@utf8InCpp String upperPath, @utf8InCpp String lowerPath, in RemoteCallback callback);
void endSession(@utf8InCpp String sessionId, in RemoteCallback callback);
+ void notifyVolumeStateChanged(@utf8InCpp String sessionId, in StorageVolume vol,
+ in RemoteCallback callback);
}
\ No newline at end of file
diff --git a/core/java/android/telephony/SubscriptionPlan.java b/core/java/android/telephony/SubscriptionPlan.java
index 901957f..d5ac436 100644
--- a/core/java/android/telephony/SubscriptionPlan.java
+++ b/core/java/android/telephony/SubscriptionPlan.java
@@ -372,5 +372,15 @@
plan.networkTypes = Arrays.copyOf(networkTypes, networkTypes.length);
return this;
}
+
+ /**
+ * Reset any network types that were set with {@link #setNetworkTypes(int[])}.
+ * This will make the SubscriptionPlan apply to all network types.
+ */
+ public @NonNull Builder resetNetworkTypes() {
+ plan.networkTypes = Arrays.copyOf(TelephonyManager.getAllNetworkTypes(),
+ TelephonyManager.getAllNetworkTypes().length);
+ return this;
+ }
}
}
diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java
index 21d16f6..0854452 100644
--- a/core/java/android/telephony/TelephonyRegistryManager.java
+++ b/core/java/android/telephony/TelephonyRegistryManager.java
@@ -61,7 +61,6 @@
*
* @hide
*/
-@TestApi
public class TelephonyRegistryManager {
private static final String TAG = "TelephonyRegistryManager";
diff --git a/core/java/android/view/InsetsSource.java b/core/java/android/view/InsetsSource.java
index 719f649..294faaf 100644
--- a/core/java/android/view/InsetsSource.java
+++ b/core/java/android/view/InsetsSource.java
@@ -18,6 +18,7 @@
import static android.view.InsetsState.ITYPE_IME;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.graphics.Insets;
import android.graphics.Rect;
@@ -114,7 +115,7 @@
if (!ignoreVisibility && !mVisible) {
return Insets.NONE;
}
- if (!mTmpFrame.setIntersect(frame, relativeFrame)) {
+ if (!getIntersection(frame, relativeFrame, mTmpFrame)) {
return Insets.NONE;
}
@@ -144,12 +145,33 @@
}
}
+ /**
+ * Outputs the intersection of two rectangles. The shared edges will also be counted in the
+ * intersection.
+ *
+ * @param a The first rectangle being intersected with.
+ * @param b The second rectangle being intersected with.
+ * @param out The rectangle which represents the intersection.
+ * @return {@code true} if there is any intersection.
+ */
+ private static boolean getIntersection(@NonNull Rect a, @NonNull Rect b, @NonNull Rect out) {
+ if (a.left <= b.right && b.left <= a.right && a.top <= b.bottom && b.top <= a.bottom) {
+ out.left = Math.max(a.left, b.left);
+ out.top = Math.max(a.top, b.top);
+ out.right = Math.min(a.right, b.right);
+ out.bottom = Math.min(a.bottom, b.bottom);
+ return true;
+ }
+ out.setEmpty();
+ return false;
+ }
+
public void dump(String prefix, PrintWriter pw) {
pw.print(prefix);
pw.print("InsetsSource type="); pw.print(InsetsState.typeToString(mType));
pw.print(" frame="); pw.print(mFrame.toShortString());
if (mVisibleFrame != null) {
- pw.print(" visibleFrmae="); pw.print(mVisibleFrame.toShortString());
+ pw.print(" visibleFrame="); pw.print(mVisibleFrame.toShortString());
}
pw.print(" visible="); pw.print(mVisible);
pw.println();
diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java
index 47a79bd..04260c4 100644
--- a/core/java/android/view/ViewConfiguration.java
+++ b/core/java/android/view/ViewConfiguration.java
@@ -23,7 +23,6 @@
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.graphics.Point;
import android.os.Build;
import android.os.RemoteException;
import android.provider.Settings;
@@ -66,8 +65,9 @@
/**
* Defines the default duration in milliseconds before a press turns into
* a long press
+ * @hide
*/
- private static final int DEFAULT_LONG_PRESS_TIMEOUT = 500;
+ public static final int DEFAULT_LONG_PRESS_TIMEOUT = 400;
/**
* Defines the default duration in milliseconds between the first tap's up event and the second
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 7f6c0d2..4a27d3a0 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -29,6 +29,7 @@
import android.app.PendingIntent;
import android.app.RemoteInput;
import android.appwidget.AppWidgetHostView;
+import android.appwidget.AppWidgetManager;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.ContextWrapper;
@@ -4130,8 +4131,18 @@
// The NEW_TASK flags are applied through the activity options and not as a part of
// the call to startIntentSender() to ensure that they are consistently applied to
// both mutable and immutable PendingIntents.
+ final IntentSender intentSender = pendingIntent.getIntentSender();
+ final int uid = intentSender.getCreatorUid();
+ final String packageName = intentSender.getCreatorPackage();
+ if (uid != -1 && packageName != null) {
+ final AppWidgetManager appWidgetManager =
+ context.getSystemService(AppWidgetManager.class);
+ if (appWidgetManager != null) {
+ appWidgetManager.noteAppWidgetTapped(uid, packageName);
+ }
+ }
context.startIntentSender(
- pendingIntent.getIntentSender(), options.first,
+ intentSender, options.first,
0, 0, 0, options.second.toBundle());
} catch (IntentSender.SendIntentException e) {
Log.e(LOG_TAG, "Cannot send pending intent: ", e);
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index d142033..2352180 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -1608,6 +1608,8 @@
}
private void resetTabsHeaderStyle(TabWidget tabWidget) {
+ String workContentDescription = getString(R.string.resolver_work_tab_accessibility);
+ String personalContentDescription = getString(R.string.resolver_personal_tab_accessibility);
for (int i = 0; i < tabWidget.getChildCount(); i++) {
View tabView = tabWidget.getChildAt(i);
TextView title = tabView.findViewById(android.R.id.title);
@@ -1615,6 +1617,11 @@
title.setTextColor(getAttrColor(this, android.R.attr.textColorTertiary));
title.setTextSize(TypedValue.COMPLEX_UNIT_PX,
getResources().getDimension(R.dimen.resolver_tab_text_size));
+ if (title.getText().equals(getString(R.string.resolver_personal_tab))) {
+ tabView.setContentDescription(personalContentDescription);
+ } else if (title.getText().equals(getString(R.string.resolver_work_tab))) {
+ tabView.setContentDescription(workContentDescription);
+ }
}
}
diff --git a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl
index 6d1d1ab..9e09cf3 100644
--- a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl
+++ b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl
@@ -77,5 +77,6 @@
boolean requestPinAppWidget(String packageName, in ComponentName providerComponent,
in Bundle extras, in IntentSender resultIntent);
boolean isRequestPinAppWidgetSupported();
+ void noteAppWidgetTapped(int uid, String packageName);
}
diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java
index 67e5927..4e7ae8a 100644
--- a/core/java/com/android/internal/widget/ConversationLayout.java
+++ b/core/java/com/android/internal/widget/ConversationLayout.java
@@ -16,6 +16,9 @@
package com.android.internal.widget;
+import static com.android.internal.widget.MessagingGroup.IMAGE_DISPLAY_LOCATION_EXTERNAL;
+import static com.android.internal.widget.MessagingGroup.IMAGE_DISPLAY_LOCATION_INLINE;
+
import android.annotation.AttrRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -35,6 +38,7 @@
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Gravity;
@@ -46,6 +50,7 @@
import android.view.animation.PathInterpolator;
import android.widget.FrameLayout;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.RemoteViews;
import android.widget.TextView;
@@ -109,13 +114,14 @@
private View mExpandButtonContainer;
private ViewGroup mExpandButtonAndContentContainer;
private NotificationExpandButton mExpandButton;
+ private MessagingLinearLayout mImageMessageContainer;
private int mExpandButtonExpandedTopMargin;
private int mBadgedSideMargins;
private int mIconSizeBadged;
private int mIconSizeCentered;
private CachingIconView mIcon;
+ private View mImportanceRingView;
private int mExpandedGroupTopMargin;
- private int mExpandButtonExpandedSize;
private View mConversationFacePile;
private int mNotificationBackgroundColor;
private CharSequence mFallbackChatName;
@@ -126,6 +132,8 @@
private View mContentContainer;
private boolean mExpandable = true;
private int mContentMarginEnd;
+ private Rect mMessagingClipRect;
+ private TextView mAppName;
public ConversationLayout(@NonNull Context context) {
super(context);
@@ -150,18 +158,20 @@
super.onFinishInflate();
mMessagingLinearLayout = findViewById(R.id.notification_messaging);
mMessagingLinearLayout.setMessagingLayout(this);
+ mImageMessageContainer = findViewById(R.id.conversation_image_message_container);
// We still want to clip, but only on the top, since views can temporarily out of bounds
// during transitions.
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
int size = Math.max(displayMetrics.widthPixels, displayMetrics.heightPixels);
- Rect rect = new Rect(0, 0, size, size);
- mMessagingLinearLayout.setClipBounds(rect);
+ mMessagingClipRect = new Rect(0, 0, size, size);
+ setMessagingClippingDisabled(false);
mTitleView = findViewById(R.id.title);
mAvatarSize = getResources().getDimensionPixelSize(R.dimen.messaging_avatar_size);
mTextPaint.setTextAlign(Paint.Align.CENTER);
mTextPaint.setAntiAlias(true);
mConversationIcon = findViewById(R.id.conversation_icon);
mIcon = findViewById(R.id.icon);
+ mImportanceRingView = findViewById(R.id.conversation_icon_badge_ring);
mConversationIconBadge = findViewById(R.id.conversation_icon_badge);
mIcon.setOnVisibilityChangedListener((visibility) -> {
// Always keep the badge visibility in sync with the icon. This is necessary in cases
@@ -176,8 +186,6 @@
mExpandButton = findViewById(R.id.expand_button);
mExpandButtonExpandedTopMargin = getResources().getDimensionPixelSize(
R.dimen.conversation_expand_button_top_margin_expanded);
- mExpandButtonExpandedSize = getResources().getDimensionPixelSize(
- R.dimen.conversation_expand_button_expanded_size);
mNotificationHeaderExpandedPadding = getResources().getDimensionPixelSize(
R.dimen.conversation_header_expanded_padding_end);
mContentMarginEnd = getResources().getDimensionPixelSize(
@@ -195,6 +203,7 @@
R.string.conversation_title_fallback_one_to_one);
mFallbackGroupChatName = getResources().getString(
R.string.conversation_title_fallback_group_chat);
+ mAppName = findViewById(R.id.app_name_text);
}
@RemotableViewMethod
@@ -208,6 +217,14 @@
}
/**
+ * Sets this conversation as "important", adding some additional UI treatment.
+ */
+ @RemotableViewMethod
+ public void setIsImportantConversation(boolean isImportantConversation) {
+ mImportanceRingView.setVisibility(isImportantConversation ? VISIBLE : GONE);
+ }
+
+ /**
* Set this layout to show the collapsed representation.
*
* @param isCollapsed is it collapsed
@@ -304,14 +321,12 @@
updateTitleAndNamesDisplay();
updateConversationLayout();
-
}
/**
* Update the layout according to the data provided (i.e mIsOneToOne, expanded etc);
*/
private void updateConversationLayout() {
- // TODO: resolve this from shortcuts
// Set avatar and name
CharSequence conversationText = mConversationTitle;
// TODO: display the secondary text somewhere
@@ -370,6 +385,42 @@
messagingGroup.setCanHideSenderIfFirst(canHide);
}
updateIconPositionAndSize();
+ updateImageMessages();
+ updateAppName();
+ }
+
+ private void updateImageMessages() {
+ boolean displayExternalImage = false;
+ ArraySet<View> newMessages = new ArraySet<>();
+ if (mIsCollapsed) {
+
+ // When collapsed, we're displaying all image messages in a dedicated container
+ // on the right of the layout instead of inline. Let's add all isolated images there
+ int imageIndex = 0;
+ for (int i = 0; i < mGroups.size(); i++) {
+ MessagingGroup messagingGroup = mGroups.get(i);
+ MessagingImageMessage isolatedMessage = messagingGroup.getIsolatedMessage();
+ if (isolatedMessage != null) {
+ newMessages.add(isolatedMessage.getView());
+ displayExternalImage = true;
+ if (imageIndex
+ != mImageMessageContainer.indexOfChild(isolatedMessage.getView())) {
+ mImageMessageContainer.removeView(isolatedMessage.getView());
+ mImageMessageContainer.addView(isolatedMessage.getView(), imageIndex);
+ }
+ imageIndex++;
+ }
+ }
+ }
+ // Remove all messages that don't belong into the image layout
+ for (int i = 0; i < mImageMessageContainer.getChildCount(); i++) {
+ View child = mImageMessageContainer.getChildAt(i);
+ if (!newMessages.contains(child)) {
+ mImageMessageContainer.removeView(child);
+ i--;
+ }
+ }
+ mImageMessageContainer.setVisibility(displayExternalImage ? VISIBLE : GONE);
}
private void bindFacePile() {
@@ -414,6 +465,14 @@
topView.setImageIcon(secondLastIcon);
}
+ private void updateAppName() {
+ mAppName.setVisibility(mIsCollapsed ? GONE : VISIBLE);
+ }
+
+ public boolean shouldHideAppName() {
+ return mIsCollapsed;
+ }
+
/**
* update the icon position and sizing
*/
@@ -423,7 +482,7 @@
int marginTop;
int iconSize;
if (mIsOneToOne || mIsCollapsed) {
- // Baded format
+ // Badged format
gravity = Gravity.LEFT;
marginStart = mBadgedSideMargins;
marginTop = mBadgedSideMargins;
@@ -439,11 +498,9 @@
layoutParams.gravity = gravity;
layoutParams.topMargin = marginTop;
layoutParams.setMarginStart(marginStart);
+ layoutParams.width = iconSize;
+ layoutParams.height = iconSize;
mConversationIconBadge.setLayoutParams(layoutParams);
- ViewGroup.LayoutParams iconParams = mIcon.getLayoutParams();
- iconParams.width = iconSize;
- iconParams.height = iconSize;
- mIcon.setLayoutParams(iconParams);
}
@RemotableViewMethod
@@ -662,7 +719,9 @@
newGroup = MessagingGroup.createGroup(mMessagingLinearLayout);
mAddedGroups.add(newGroup);
}
- newGroup.setDisplayImagesAtEnd(mIsCollapsed);
+ newGroup.setImageDisplayLocation(mIsCollapsed
+ ? IMAGE_DISPLAY_LOCATION_EXTERNAL
+ : IMAGE_DISPLAY_LOCATION_INLINE);
newGroup.setIsInConversation(true);
newGroup.setLayoutColor(mLayoutColor);
newGroup.setTextColors(mSenderTextColor, mMessageTextColor);
@@ -817,6 +876,10 @@
return mMessagingLinearLayout;
}
+ public @NonNull ViewGroup getImageMessageContainer() {
+ return mImageMessageContainer;
+ }
+
public ArrayList<MessagingGroup> getMessagingGroups() {
return mGroups;
}
@@ -827,20 +890,17 @@
int gravity;
int topMargin = 0;
ViewGroup newContainer;
- int newContainerHeight;
if (mIsCollapsed) {
drawableId = R.drawable.ic_expand_notification;
contentDescriptionId = R.string.expand_button_content_description_collapsed;
gravity = Gravity.CENTER;
newContainer = mExpandButtonAndContentContainer;
- newContainerHeight = LayoutParams.MATCH_PARENT;
} else {
drawableId = R.drawable.ic_collapse_notification;
contentDescriptionId = R.string.expand_button_content_description_expanded;
gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
topMargin = mExpandButtonExpandedTopMargin;
newContainer = this;
- newContainerHeight = mExpandButtonExpandedSize;
}
mExpandButton.setImageDrawable(getContext().getDrawable(drawableId));
mExpandButton.setColorFilter(mExpandButton.getOriginalNotificationColor());
@@ -850,14 +910,11 @@
if (newContainer != mExpandButtonContainer.getParent()) {
((ViewGroup) mExpandButtonContainer.getParent()).removeView(mExpandButtonContainer);
newContainer.addView(mExpandButtonContainer);
- MarginLayoutParams layoutParams =
- (MarginLayoutParams) mExpandButtonContainer.getLayoutParams();
- layoutParams.height = newContainerHeight;
- mExpandButtonContainer.setLayoutParams(layoutParams);
}
// update if the expand button is centered
- FrameLayout.LayoutParams layoutParams = (LayoutParams) mExpandButton.getLayoutParams();
+ LinearLayout.LayoutParams layoutParams =
+ (LinearLayout.LayoutParams) mExpandButton.getLayoutParams();
layoutParams.gravity = gravity;
layoutParams.topMargin = topMargin;
mExpandButton.setLayoutParams(layoutParams);
@@ -905,4 +962,9 @@
}
updateContentPaddings();
}
+
+ @Override
+ public void setMessagingClippingDisabled(boolean clippingDisabled) {
+ mMessagingLinearLayout.setClipBounds(clippingDisabled ? null : mMessagingClipRect);
+ }
}
diff --git a/core/java/com/android/internal/widget/IMessagingLayout.java b/core/java/com/android/internal/widget/IMessagingLayout.java
index 149d056..b72c081 100644
--- a/core/java/com/android/internal/widget/IMessagingLayout.java
+++ b/core/java/com/android/internal/widget/IMessagingLayout.java
@@ -39,4 +39,9 @@
* @return the list of messaging groups
*/
ArrayList<MessagingGroup> getMessagingGroups();
+
+ /**
+ * Disable the clipping of the messaging container.
+ */
+ void setMessagingClippingDisabled(boolean clippingDisabled);
}
diff --git a/core/java/com/android/internal/widget/MessagingGroup.java b/core/java/com/android/internal/widget/MessagingGroup.java
index c68da97..53272f7 100644
--- a/core/java/com/android/internal/widget/MessagingGroup.java
+++ b/core/java/com/android/internal/widget/MessagingGroup.java
@@ -17,6 +17,7 @@
package com.android.internal.widget;
import android.annotation.AttrRes;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StyleRes;
@@ -44,6 +45,8 @@
import com.android.internal.R;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
@@ -54,6 +57,23 @@
public class MessagingGroup extends LinearLayout implements MessagingLinearLayout.MessagingChild {
private static Pools.SimplePool<MessagingGroup> sInstancePool
= new Pools.SynchronizedPool<>(10);
+
+ /**
+ * Images are displayed inline.
+ */
+ public static final int IMAGE_DISPLAY_LOCATION_INLINE = 0;
+
+ /**
+ * Images are displayed at the end of the group.
+ */
+ public static final int IMAGE_DISPLAY_LOCATION_AT_END = 1;
+
+ /**
+ * Images are displayed externally.
+ */
+ public static final int IMAGE_DISPLAY_LOCATION_EXTERNAL = 2;
+
+
private MessagingLinearLayout mMessageContainer;
ImageFloatingTextView mSenderView;
private ImageView mAvatarView;
@@ -70,7 +90,7 @@
private boolean mIsHidingAnimated;
private boolean mNeedsGeneratedAvatar;
private Person mSender;
- private boolean mImagesAtEnd;
+ private @ImageDisplayLocation int mImageDisplayLocation;
private ViewGroup mImageContainer;
private MessagingImageMessage mIsolatedMessage;
private boolean mClippingDisabled;
@@ -476,7 +496,7 @@
mAddedMessages.add(message);
}
boolean isImage = message instanceof MessagingImageMessage;
- if (mImagesAtEnd && isImage) {
+ if (mImageDisplayLocation != IMAGE_DISPLAY_LOCATION_INLINE && isImage) {
isolatedMessage = (MessagingImageMessage) message;
} else {
if (removeFromParentIfDifferent(message, mMessageContainer)) {
@@ -500,9 +520,12 @@
}
}
if (isolatedMessage != null) {
- if (removeFromParentIfDifferent(isolatedMessage, mImageContainer)) {
+ if (mImageDisplayLocation == IMAGE_DISPLAY_LOCATION_AT_END
+ && removeFromParentIfDifferent(isolatedMessage, mImageContainer)) {
mImageContainer.removeAllViews();
mImageContainer.addView(isolatedMessage.getView());
+ } else if (mImageDisplayLocation == IMAGE_DISPLAY_LOCATION_EXTERNAL) {
+ mImageContainer.removeAllViews();
}
isolatedMessage.setIsolated(true);
} else if (mIsolatedMessage != null) {
@@ -515,7 +538,8 @@
}
private void updateImageContainerVisibility() {
- mImageContainer.setVisibility(mIsolatedMessage != null && mImagesAtEnd
+ mImageContainer.setVisibility(mIsolatedMessage != null
+ && mImageDisplayLocation == IMAGE_DISPLAY_LOCATION_AT_END
? View.VISIBLE : View.GONE);
}
@@ -620,9 +644,9 @@
mClippingDisabled = disabled;
}
- public void setDisplayImagesAtEnd(boolean atEnd) {
- if (mImagesAtEnd != atEnd) {
- mImagesAtEnd = atEnd;
+ public void setImageDisplayLocation(@ImageDisplayLocation int displayLocation) {
+ if (mImageDisplayLocation != displayLocation) {
+ mImageDisplayLocation = displayLocation;
updateImageContainerVisibility();
}
}
@@ -670,4 +694,13 @@
mMessagingIconContainer.setLayoutParams(layoutParams);
}
}
+
+ @IntDef(prefix = {"IMAGE_DISPLAY_LOCATION_"}, value = {
+ IMAGE_DISPLAY_LOCATION_INLINE,
+ IMAGE_DISPLAY_LOCATION_AT_END,
+ IMAGE_DISPLAY_LOCATION_EXTERNAL
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ private @interface ImageDisplayLocation {
+ }
}
diff --git a/core/java/com/android/internal/widget/MessagingImageMessage.java b/core/java/com/android/internal/widget/MessagingImageMessage.java
index c243f3b..27689d4 100644
--- a/core/java/com/android/internal/widget/MessagingImageMessage.java
+++ b/core/java/com/android/internal/widget/MessagingImageMessage.java
@@ -149,10 +149,16 @@
protected void onDraw(Canvas canvas) {
canvas.save();
canvas.clipPath(getRoundedRectPath());
- int width = (int) Math.max(getActualWidth(), getActualHeight() * mAspectRatio);
- int height = (int) (width / mAspectRatio);
+ // Calculate the right sizing ensuring that the image is nicely centered in the layout
+ // during transitions
+ int width = (int) Math.max((Math.min(getHeight(), getActualHeight()) * mAspectRatio),
+ getActualWidth());
+ int height = (int) Math.max((Math.min(getWidth(), getActualWidth()) / mAspectRatio),
+ getActualHeight());
+ height = (int) Math.max(height, width / mAspectRatio);
int left = (int) ((getActualWidth() - width) / 2.0f);
- mDrawable.setBounds(left, 0, left + width, height);
+ int top = (int) ((getActualHeight() - height) / 2.0f);
+ mDrawable.setBounds(left, top, left + width, top + height);
mDrawable.draw(canvas);
canvas.restore();
}
@@ -222,8 +228,17 @@
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mIsIsolated) {
+ // When isolated we have a fixed size, let's use that sizing.
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
MeasureSpec.getSize(heightMeasureSpec));
+ } else {
+ // If we are displaying inline, we never want to go wider than actual size of the
+ // image, otherwise it will look quite blurry.
+ int width = Math.min(MeasureSpec.getSize(widthMeasureSpec),
+ mDrawable.getIntrinsicWidth());
+ int height = (int) Math.min(MeasureSpec.getSize(heightMeasureSpec), width
+ / mAspectRatio);
+ setMeasuredDimension(width, height);
}
}
@@ -231,7 +246,7 @@
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
// TODO: ensure that this isn't called when transforming
- setActualWidth(getStaticWidth());
+ setActualWidth(getWidth());
setActualHeight(getHeight());
}
@@ -258,13 +273,6 @@
return mActualHeight;
}
- public int getStaticWidth() {
- if (mIsIsolated) {
- return getWidth();
- }
- return (int) (getHeight() * mAspectRatio);
- }
-
public void setIsolated(boolean isolated) {
if (mIsIsolated != isolated) {
mIsIsolated = isolated;
diff --git a/core/java/com/android/internal/widget/MessagingLayout.java b/core/java/com/android/internal/widget/MessagingLayout.java
index 3fb5d43..a162e4e 100644
--- a/core/java/com/android/internal/widget/MessagingLayout.java
+++ b/core/java/com/android/internal/widget/MessagingLayout.java
@@ -16,6 +16,9 @@
package com.android.internal.widget;
+import static com.android.internal.widget.MessagingGroup.IMAGE_DISPLAY_LOCATION_AT_END;
+import static com.android.internal.widget.MessagingGroup.IMAGE_DISPLAY_LOCATION_INLINE;
+
import android.annotation.AttrRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -447,7 +450,9 @@
newGroup = MessagingGroup.createGroup(mMessagingLinearLayout);
mAddedGroups.add(newGroup);
}
- newGroup.setDisplayImagesAtEnd(mDisplayImagesAtEnd);
+ newGroup.setImageDisplayLocation(mDisplayImagesAtEnd
+ ? IMAGE_DISPLAY_LOCATION_AT_END
+ : IMAGE_DISPLAY_LOCATION_INLINE);
newGroup.setIsInConversation(false);
newGroup.setLayoutColor(mLayoutColor);
newGroup.setTextColors(mSenderTextColor, mMessageTextColor);
@@ -599,4 +604,9 @@
public ArrayList<MessagingGroup> getMessagingGroups() {
return mGroups;
}
+
+ @Override
+ public void setMessagingClippingDisabled(boolean clippingDisabled) {
+ // Don't do anything, this is only used for the ConversationLayout
+ }
}
diff --git a/core/jni/android_content_res_ApkAssets.cpp b/core/jni/android_content_res_ApkAssets.cpp
index b55dc68..fbdd406 100644
--- a/core/jni/android_content_res_ApkAssets.cpp
+++ b/core/jni/android_content_res_ApkAssets.cpp
@@ -37,8 +37,128 @@
jmethodID constructor;
} gOverlayableInfoOffsets;
-static jlong NativeLoad(JNIEnv* env, jclass /*clazz*/, jstring java_path, jboolean system,
- jboolean force_shared_lib, jboolean overlay, jboolean for_loader) {
+static struct assetfiledescriptor_offsets_t {
+ jfieldID mFd;
+ jfieldID mStartOffset;
+ jfieldID mLength;
+} gAssetFileDescriptorOffsets;
+
+static struct assetsprovider_offsets_t {
+ jclass classObject;
+ jmethodID loadAssetFd;
+} gAssetsProviderOffsets;
+
+static struct {
+ jmethodID detachFd;
+} gParcelFileDescriptorOffsets;
+
+// Keep in sync with f/b/android/content/res/ApkAssets.java
+using format_type_t = jint;
+enum : format_type_t {
+ // The path used to load the apk assets represents an APK file.
+ FORMAT_APK = 0,
+
+ // The path used to load the apk assets represents an idmap file.
+ FORMAT_IDMAP = 1,
+
+ // The path used to load the apk assets represents an resources.arsc file.
+ FORMAT_ARSC = 2,
+
+ // The path used to load the apk assets represents the a directory.
+ FORMAT_DIRECTORY = 3,
+};
+
+class LoaderAssetsProvider : public AssetsProvider {
+ public:
+ static std::unique_ptr<AssetsProvider> Create(JNIEnv* env, jobject assets_provider) {
+ return (!assets_provider) ? nullptr
+ : std::unique_ptr<AssetsProvider>(new LoaderAssetsProvider(
+ env->NewGlobalRef(assets_provider)));
+ }
+
+ ~LoaderAssetsProvider() override {
+ const auto env = AndroidRuntime::getJNIEnv();
+ CHECK(env != nullptr) << "Current thread not attached to a Java VM."
+ << " Failed to close LoaderAssetsProvider.";
+ env->DeleteGlobalRef(assets_provider_);
+ }
+
+ protected:
+ std::unique_ptr<Asset> OpenInternal(const std::string& path,
+ Asset::AccessMode mode,
+ bool* file_exists) const override {
+ const auto env = AndroidRuntime::getJNIEnv();
+ CHECK(env != nullptr) << "Current thread not attached to a Java VM."
+ << " ResourcesProvider assets cannot be retrieved on current thread.";
+
+ jstring java_string = env->NewStringUTF(path.c_str());
+ if (env->ExceptionCheck()) {
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ return nullptr;
+ }
+
+ // Check if the AssetsProvider provides a value for the path.
+ jobject asset_fd = env->CallObjectMethod(assets_provider_,
+ gAssetsProviderOffsets.loadAssetFd,
+ java_string, static_cast<jint>(mode));
+ env->DeleteLocalRef(java_string);
+ if (env->ExceptionCheck()) {
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ return nullptr;
+ }
+
+ if (!asset_fd) {
+ if (file_exists) {
+ *file_exists = false;
+ }
+ return nullptr;
+ }
+
+ const jlong mOffset = env->GetLongField(asset_fd, gAssetFileDescriptorOffsets.mStartOffset);
+ const jlong mLength = env->GetLongField(asset_fd, gAssetFileDescriptorOffsets.mLength);
+ jobject mFd = env->GetObjectField(asset_fd, gAssetFileDescriptorOffsets.mFd);
+ env->DeleteLocalRef(asset_fd);
+
+ if (!mFd) {
+ jniThrowException(env, "java/lang/NullPointerException", nullptr);
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ return nullptr;
+ }
+
+ // Gain ownership of the file descriptor.
+ const jint fd = env->CallIntMethod(mFd, gParcelFileDescriptorOffsets.detachFd);
+ env->DeleteLocalRef(mFd);
+ if (env->ExceptionCheck()) {
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ return nullptr;
+ }
+
+ if (file_exists) {
+ *file_exists = true;
+ }
+
+ return ApkAssets::CreateAssetFromFd(base::unique_fd(fd),
+ nullptr /* path */,
+ static_cast<off64_t>(mOffset),
+ static_cast<off64_t>(mLength));
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(LoaderAssetsProvider);
+
+ explicit LoaderAssetsProvider(jobject assets_provider)
+ : assets_provider_(assets_provider) { }
+
+ // The global reference to the AssetsProvider
+ jobject assets_provider_;
+};
+
+static jlong NativeLoad(JNIEnv* env, jclass /*clazz*/, const format_type_t format,
+ jstring java_path, const jint property_flags, jobject assets_provider) {
ScopedUtfChars path(env, java_path);
if (path.c_str() == nullptr) {
return 0;
@@ -46,26 +166,38 @@
ATRACE_NAME(base::StringPrintf("LoadApkAssets(%s)", path.c_str()).c_str());
+ auto loader_assets = LoaderAssetsProvider::Create(env, assets_provider);
std::unique_ptr<const ApkAssets> apk_assets;
- if (overlay) {
- apk_assets = ApkAssets::LoadOverlay(path.c_str(), system);
- } else if (force_shared_lib) {
- apk_assets = ApkAssets::LoadAsSharedLibrary(path.c_str(), system);
- } else {
- apk_assets = ApkAssets::Load(path.c_str(), system, for_loader);
+ switch (format) {
+ case FORMAT_APK:
+ apk_assets = ApkAssets::Load(path.c_str(), property_flags, std::move(loader_assets));
+ break;
+ case FORMAT_IDMAP:
+ apk_assets = ApkAssets::LoadOverlay(path.c_str(), property_flags);
+ break;
+ case FORMAT_ARSC:
+ apk_assets = ApkAssets::LoadTable(path.c_str(), property_flags, std::move(loader_assets));
+ break;
+ case FORMAT_DIRECTORY:
+ apk_assets = ApkAssets::LoadFromDir(path.c_str(), property_flags, std::move(loader_assets));
+ break;
+ default:
+ const std::string error_msg = base::StringPrintf("Unsupported format type %d", format);
+ jniThrowException(env, "java/lang/IllegalArgumentException", error_msg.c_str());
+ return 0;
}
if (apk_assets == nullptr) {
- std::string error_msg = base::StringPrintf("Failed to load asset path %s", path.c_str());
+ const std::string error_msg = base::StringPrintf("Failed to load asset path %s", path.c_str());
jniThrowException(env, "java/io/IOException", error_msg.c_str());
return 0;
}
return reinterpret_cast<jlong>(apk_assets.release());
}
-static jlong NativeLoadFromFd(JNIEnv* env, jclass /*clazz*/, jobject file_descriptor,
- jstring friendly_name, jboolean system, jboolean force_shared_lib,
- jboolean for_loader) {
+static jlong NativeLoadFromFd(JNIEnv* env, jclass /*clazz*/, const format_type_t format,
+ jobject file_descriptor, jstring friendly_name,
+ const jint property_flags, jobject assets_provider) {
ScopedUtfChars friendly_name_utf8(env, friendly_name);
if (friendly_name_utf8.c_str() == nullptr) {
return 0;
@@ -85,48 +217,56 @@
return 0;
}
- std::unique_ptr<const ApkAssets> apk_assets = ApkAssets::LoadFromFd(std::move(dup_fd),
- friendly_name_utf8.c_str(),
- system, force_shared_lib,
- for_loader);
+ auto loader_assets = LoaderAssetsProvider::Create(env, assets_provider);
+ std::unique_ptr<const ApkAssets> apk_assets;
+ switch (format) {
+ case FORMAT_APK:
+ apk_assets = ApkAssets::LoadFromFd(std::move(dup_fd), friendly_name_utf8.c_str(),
+ property_flags, std::move(loader_assets));
+ break;
+ case FORMAT_ARSC:
+ apk_assets = ApkAssets::LoadTableFromFd(std::move(dup_fd), friendly_name_utf8.c_str(),
+ property_flags, std::move(loader_assets));
+ break;
+ default:
+ const std::string error_msg = base::StringPrintf("Unsupported format type %d", format);
+ jniThrowException(env, "java/lang/IllegalArgumentException", error_msg.c_str());
+ return 0;
+ }
if (apk_assets == nullptr) {
std::string error_msg = base::StringPrintf("Failed to load asset path %s from fd %d",
- friendly_name_utf8.c_str(), dup_fd.get());
+ friendly_name_utf8.c_str(), fd);
jniThrowException(env, "java/io/IOException", error_msg.c_str());
return 0;
}
return reinterpret_cast<jlong>(apk_assets.release());
}
-static jlong NativeLoadArsc(JNIEnv* env, jclass /*clazz*/, jstring java_path,
- jboolean for_loader) {
- ScopedUtfChars path(env, java_path);
- if (path.c_str() == nullptr) {
- return 0;
- }
-
- ATRACE_NAME(base::StringPrintf("LoadApkAssetsArsc(%s)", path.c_str()).c_str());
-
- std::unique_ptr<const ApkAssets> apk_assets = ApkAssets::LoadArsc(path.c_str(), for_loader);
-
- if (apk_assets == nullptr) {
- std::string error_msg = base::StringPrintf("Failed to load asset path %s", path.c_str());
- jniThrowException(env, "java/io/IOException", error_msg.c_str());
- return 0;
- }
- return reinterpret_cast<jlong>(apk_assets.release());
-}
-
-static jlong NativeLoadArscFromFd(JNIEnv* env, jclass /*clazz*/, jobject file_descriptor,
- jstring friendly_name, jboolean for_loader) {
+static jlong NativeLoadFromFdOffset(JNIEnv* env, jclass /*clazz*/, const format_type_t format,
+ jobject file_descriptor, jstring friendly_name,
+ const jlong offset, const jlong length,
+ const jint property_flags, jobject assets_provider) {
ScopedUtfChars friendly_name_utf8(env, friendly_name);
if (friendly_name_utf8.c_str() == nullptr) {
return 0;
}
+ ATRACE_NAME(base::StringPrintf("LoadApkAssetsFd(%s)", friendly_name_utf8.c_str()).c_str());
+
+ if (offset < 0) {
+ jniThrowException(env, "java/lang/IllegalArgumentException",
+ "offset cannot be negative");
+ return 0;
+ }
+
+ if (length < 0) {
+ jniThrowException(env, "java/lang/IllegalArgumentException",
+ "length cannot be negative");
+ return 0;
+ }
+
int fd = jniGetFDFromFileDescriptor(env, file_descriptor);
- ATRACE_NAME(base::StringPrintf("LoadApkAssetsArscFd(%d)", fd).c_str());
if (fd < 0) {
jniThrowException(env, "java/lang/IllegalArgumentException", "Bad FileDescriptor");
return 0;
@@ -138,18 +278,39 @@
return 0;
}
- std::unique_ptr<const ApkAssets> apk_assets =
- ApkAssets::LoadArsc(std::move(dup_fd), friendly_name_utf8.c_str(), for_loader);
+ auto loader_assets = LoaderAssetsProvider::Create(env, assets_provider);
+ std::unique_ptr<const ApkAssets> apk_assets;
+ switch (format) {
+ case FORMAT_APK:
+ apk_assets = ApkAssets::LoadFromFd(std::move(dup_fd), friendly_name_utf8.c_str(),
+ property_flags, std::move(loader_assets),
+ static_cast<off64_t>(offset),
+ static_cast<off64_t>(length));
+ break;
+ case FORMAT_ARSC:
+ apk_assets = ApkAssets::LoadTableFromFd(std::move(dup_fd), friendly_name_utf8.c_str(),
+ property_flags, std::move(loader_assets),
+ static_cast<off64_t>(offset),
+ static_cast<off64_t>(length));
+ break;
+ default:
+ const std::string error_msg = base::StringPrintf("Unsupported format type %d", format);
+ jniThrowException(env, "java/lang/IllegalArgumentException", error_msg.c_str());
+ return 0;
+ }
+
if (apk_assets == nullptr) {
- std::string error_msg = base::StringPrintf("Failed to load asset path from fd %d", fd);
+ std::string error_msg = base::StringPrintf("Failed to load asset path %s from fd %d",
+ friendly_name_utf8.c_str(), fd);
jniThrowException(env, "java/io/IOException", error_msg.c_str());
return 0;
}
return reinterpret_cast<jlong>(apk_assets.release());
}
-static jlong NativeLoadEmpty(JNIEnv* env, jclass /*clazz*/, jboolean for_loader) {
- std::unique_ptr<const ApkAssets> apk_assets = ApkAssets::LoadEmpty(for_loader);
+static jlong NativeLoadEmpty(JNIEnv* env, jclass /*clazz*/, jint flags, jobject assets_provider) {
+ auto loader_assets = LoaderAssetsProvider::Create(env, assets_provider);
+ auto apk_assets = ApkAssets::LoadEmpty(flags, std::move(loader_assets));
return reinterpret_cast<jlong>(apk_assets.release());
}
@@ -179,8 +340,8 @@
}
const ApkAssets* apk_assets = reinterpret_cast<const ApkAssets*>(ptr);
- std::unique_ptr<Asset> asset = apk_assets->Open(path_utf8.c_str(),
- Asset::AccessMode::ACCESS_RANDOM);
+ std::unique_ptr<Asset> asset = apk_assets->GetAssetsProvider()->Open(
+ path_utf8.c_str(),Asset::AccessMode::ACCESS_RANDOM);
if (asset == nullptr) {
jniThrowException(env, "java/io/FileNotFoundException", path_utf8.c_str());
return 0;
@@ -251,13 +412,15 @@
// JNI registration.
static const JNINativeMethod gApkAssetsMethods[] = {
- {"nativeLoad", "(Ljava/lang/String;ZZZZ)J", (void*)NativeLoad},
- {"nativeLoadFromFd", "(Ljava/io/FileDescriptor;Ljava/lang/String;ZZZ)J",
- (void*)NativeLoadFromFd},
- {"nativeLoadArsc", "(Ljava/lang/String;Z)J", (void*)NativeLoadArsc},
- {"nativeLoadArscFromFd", "(Ljava/io/FileDescriptor;Ljava/lang/String;Z)J",
- (void*)NativeLoadArscFromFd},
- {"nativeLoadEmpty", "(Z)J", (void*)NativeLoadEmpty},
+ {"nativeLoad", "(ILjava/lang/String;ILandroid/content/res/loader/AssetsProvider;)J",
+ (void*)NativeLoad},
+ {"nativeLoadEmpty", "(ILandroid/content/res/loader/AssetsProvider;)J", (void*)NativeLoadEmpty},
+ {"nativeLoadFd",
+ "(ILjava/io/FileDescriptor;Ljava/lang/String;ILandroid/content/res/loader/AssetsProvider;)J",
+ (void*)NativeLoadFromFd},
+ {"nativeLoadFdOffsets",
+ "(ILjava/io/FileDescriptor;Ljava/lang/String;JJILandroid/content/res/loader/AssetsProvider;)J",
+ (void*)NativeLoadFromFdOffset},
{"nativeDestroy", "(J)V", (void*)NativeDestroy},
{"nativeGetAssetPath", "(J)Ljava/lang/String;", (void*)NativeGetAssetPath},
{"nativeGetStringBlock", "(J)J", (void*)NativeGetStringBlock},
@@ -274,6 +437,21 @@
gOverlayableInfoOffsets.constructor = GetMethodIDOrDie(env, gOverlayableInfoOffsets.classObject,
"<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
+ jclass assetFd = FindClassOrDie(env, "android/content/res/AssetFileDescriptor");
+ gAssetFileDescriptorOffsets.mFd =
+ GetFieldIDOrDie(env, assetFd, "mFd", "Landroid/os/ParcelFileDescriptor;");
+ gAssetFileDescriptorOffsets.mStartOffset = GetFieldIDOrDie(env, assetFd, "mStartOffset", "J");
+ gAssetFileDescriptorOffsets.mLength = GetFieldIDOrDie(env, assetFd, "mLength", "J");
+
+ jclass assetsProvider = FindClassOrDie(env, "android/content/res/loader/AssetsProvider");
+ gAssetsProviderOffsets.classObject = MakeGlobalRefOrDie(env, assetsProvider);
+ gAssetsProviderOffsets.loadAssetFd = GetMethodIDOrDie(
+ env, gAssetsProviderOffsets.classObject, "loadAssetFd",
+ "(Ljava/lang/String;I)Landroid/content/res/AssetFileDescriptor;");
+
+ jclass parcelFd = FindClassOrDie(env, "android/os/ParcelFileDescriptor");
+ gParcelFileDescriptorOffsets.detachFd = GetMethodIDOrDie(env, parcelFd, "detachFd", "()I");
+
return RegisterMethodsOrDie(env, "android/content/res/ApkAssets", gApkAssetsMethods,
arraysize(gApkAssetsMethods));
}
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index 062b886..cb5a332 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -75,12 +75,6 @@
jfieldID mDensity;
} gTypedValueOffsets;
-static struct assetfiledescriptor_offsets_t {
- jfieldID mFd;
- jfieldID mStartOffset;
- jfieldID mLength;
-} gAssetFileDescriptorOffsets;
-
// This is also used by asset_manager.cpp.
assetmanager_offsets_t gAssetManagerOffsets;
@@ -1596,12 +1590,6 @@
GetFieldIDOrDie(env, typedValue, "changingConfigurations", "I");
gTypedValueOffsets.mDensity = GetFieldIDOrDie(env, typedValue, "density", "I");
- jclass assetFd = FindClassOrDie(env, "android/content/res/AssetFileDescriptor");
- gAssetFileDescriptorOffsets.mFd =
- GetFieldIDOrDie(env, assetFd, "mFd", "Landroid/os/ParcelFileDescriptor;");
- gAssetFileDescriptorOffsets.mStartOffset = GetFieldIDOrDie(env, assetFd, "mStartOffset", "J");
- gAssetFileDescriptorOffsets.mLength = GetFieldIDOrDie(env, assetFd, "mLength", "J");
-
jclass assetManager = FindClassOrDie(env, "android/content/res/AssetManager");
gAssetManagerOffsets.mObject = GetFieldIDOrDie(env, assetManager, "mObject", "J");
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 1f2f569..84d9ce2 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -734,7 +734,7 @@
<!-- ====================================================================== -->
<eat-comment />
- <!-- @SystemApi Allows accessing the messages on ICC
+ <!-- Allows accessing the messages on ICC
@hide Used internally. -->
<permission android:name="android.permission.ACCESS_MESSAGES_ON_ICC"
android:protectionLevel="signature" />
@@ -3447,12 +3447,25 @@
<permission android:name="android.permission.BIND_AUGMENTED_AUTOFILL_SERVICE"
android:protectionLevel="signature" />
- <!-- Must be required by hotword enrollment application,
- to ensure that only the system can interact with it.
- @hide <p>Not for use by third-party applications.</p> -->
+ <!-- Must be required by a {@link android.service.voice.VoiceInteractionService} implementation
+ to enroll its own sound models. This is a more restrictive permission than the higher-level
+ permission KEYPHRASE_ENROLLMENT_APPLICATION. For the caller to enroll sound models with
+ this permission, it must hold the permission and be the active VoiceInteractionService in
+ the system.
+ {@see Settings.Secure.VOICE_INTERACTION_SERVICE}
+ @hide -->
<permission android:name="android.permission.MANAGE_VOICE_KEYPHRASES"
android:protectionLevel="signature|privileged" />
+ <!-- Must be required by a keyphrase enrollment application, to enroll sound models. This is
+ treated as a higher-level permission to MANAGE_VOICE_KEYPHRASES as a caller can enroll
+ sound models at any time. This permission should be reserved for system enrollment
+ applications detected by {@link android.hardware.soundtrigger.KeyphraseEnrollmentInfo}
+ only.
+ @hide <p>Not for use by third-party applications.</p> -->
+ <permission android:name="android.permission.KEYPHRASE_ENROLLMENT_APPLICATION"
+ android:protectionLevel="signature|privileged" />
+
<!-- Must be required by a {@link com.android.media.remotedisplay.RemoteDisplayProvider},
to ensure that only the system can bind to it.
@hide -->
diff --git a/core/tests/ResourceLoaderTests/splits/SplitFour/AndroidManifest.xml b/core/res/res/drawable/conversation_badge_ring.xml
similarity index 62%
copy from core/tests/ResourceLoaderTests/splits/SplitFour/AndroidManifest.xml
copy to core/res/res/drawable/conversation_badge_ring.xml
index 24a0a2a..11ba8ad 100644
--- a/core/tests/ResourceLoaderTests/splits/SplitFour/AndroidManifest.xml
+++ b/core/res/res/drawable/conversation_badge_ring.xml
@@ -12,16 +12,21 @@
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
- ~ limitations under the License.
+ ~ limitations under the License
-->
-<manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.content.res.loader.test"
- split="split_four"
- >
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
- <uses-sdk android:minSdkVersion="1" android:targetSdkVersion="1" />
- <application android:hasCode="false" />
+ <solid
+ android:color="@color/transparent"/>
-</manifest>
+ <stroke
+ android:color="@color/conversation_important_highlight"
+ android:width="2dp"/>
+
+ <size
+ android:width="26dp"
+ android:height="26dp"/>
+</shape>
+
diff --git a/core/res/res/layout/notification_template_material_conversation.xml b/core/res/res/layout/notification_template_material_conversation.xml
index 2348dee..7bf13ec 100644
--- a/core/res/res/layout/notification_template_material_conversation.xml
+++ b/core/res/res/layout/notification_template_material_conversation.xml
@@ -31,6 +31,7 @@
android:clipChildren="false"
android:clipToPadding="false"
android:paddingTop="12dp"
+ android:paddingBottom="12dp"
>
<FrameLayout
@@ -57,18 +58,31 @@
<FrameLayout
android:id="@+id/conversation_icon_badge"
- android:layout_width="20dp"
- android:layout_height="20dp"
+ android:layout_width="@dimen/conversation_icon_size_badged"
+ android:layout_height="@dimen/conversation_icon_size_badged"
android:layout_marginLeft="@dimen/conversation_badge_side_margin"
android:layout_marginTop="@dimen/conversation_badge_side_margin"
- android:background="@drawable/conversation_badge_background" >
- <!-- Badge: 20x20, 48dp padding left + top -->
+ >
+ <ImageView
+ android:id="@+id/conversation_icon_badge_bg"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:src="@drawable/conversation_badge_background"
+ />
<com.android.internal.widget.CachingIconView
android:id="@+id/icon"
- android:layout_width="@dimen/conversation_icon_size_badged"
- android:layout_height="@dimen/conversation_icon_size_badged"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_margin="4dp"
android:layout_gravity="center"
/>
+ <ImageView
+ android:id="@+id/conversation_icon_badge_ring"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:src="@drawable/conversation_badge_ring"
+ android:visibility="gone"
+ />
</FrameLayout>
</FrameLayout>
</FrameLayout>
@@ -107,6 +121,7 @@
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="16dp"
+ android:layout_marginBottom="2dp"
android:paddingStart="@dimen/conversation_content_start"
>
<TextView
@@ -159,12 +174,22 @@
/>
</LinearLayout>
+ <!-- App Name -->
+ <TextView
+ android:id="@+id/app_name_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/conversation_content_start"
+ android:textSize="12sp"
+ android:layout_marginBottom="16dp"
+ android:textAppearance="@style/TextAppearance.DeviceDefault.Notification"
+ />
+
<!-- Messages -->
<com.android.internal.widget.MessagingLinearLayout
android:id="@+id/notification_messaging"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="2dp"
android:spacing="@dimen/notification_messaging_spacing"
android:clipToPadding="false"
android:clipChildren="false"
@@ -186,13 +211,29 @@
</com.android.internal.widget.RemeasuringLinearLayout>
<!--This is dynamically placed between here and at the end of the layout-->
- <FrameLayout
+ <LinearLayout
android:id="@+id/expand_button_container"
android:layout_width="wrap_content"
- android:layout_height="@dimen/conversation_expand_button_expanded_size"
+ android:layout_height="@dimen/conversation_expand_button_size"
android:layout_gravity="end|top"
android:paddingStart="16dp"
- android:paddingEnd="@dimen/notification_content_margin_end">
+ android:orientation="horizontal"
+ android:paddingEnd="@dimen/notification_content_margin_end"
+ android:clipToPadding="false"
+ android:clipChildren="false"
+ >
+ <!-- Images -->
+ <com.android.internal.widget.MessagingLinearLayout
+ android:id="@+id/conversation_image_message_container"
+ android:forceHasOverlappingRendering="false"
+ android:layout_width="40dp"
+ android:layout_height="40dp"
+ android:layout_marginEnd="11dp"
+ android:spacing="0dp"
+ android:layout_gravity="center"
+ android:clipToPadding="false"
+ android:clipChildren="false"
+ />
<com.android.internal.widget.NotificationExpandButton
android:id="@+id/expand_button"
android:layout_width="@dimen/notification_header_expand_icon_size"
@@ -202,5 +243,5 @@
android:clickable="false"
android:importantForAccessibility="no"
/>
- </FrameLayout>
+ </LinearLayout>
</com.android.internal.widget.ConversationLayout>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index aeb6a42..0822447 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Toeganklikheidskortpad het <xliff:g id="SERVICE_NAME">%1$s</xliff:g> aangeskakel"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Toeganklikheidskortpad het <xliff:g id="SERVICE_NAME">%1$s</xliff:g> afgeskakel"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Druk en hou albei volumesleutels drie sekondes lank om <xliff:g id="SERVICE_NAME">%1$s</xliff:g> te gebruik"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Vergroting"</string>
<string name="user_switched" msgid="7249833311585228097">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g> ."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Skakel tans oor na <xliff:g id="NAME">%1$s</xliff:g> …"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Groepsgesprek"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Persoonlik"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Werk"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Persoonlike aansig"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Werkaansig"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Kan nie met werkprogramme deel nie"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Kan nie met persoonlike programme deel nie"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Jou IT-admin het deling tussen persoonlike en werkprofiele geblokkeer"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Kan nie toegang tot werkprogramme kry nie"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Jou IT-admin laat jou nie toe om persoonlike inhoud in werkprogramme te bekyk nie"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Kan nie toegang tot persoonlike programme kry nie"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Jou IT-admin laat jou nie toe om werkinhoud in persoonlike programme te bekyk nie"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Skakel werkprofiel aan om inhoud te deel"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Skakel werkprofiel aan om inhoud te bekyk"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Geen programme beskikbaar nie"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Skakel aan"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Neem oudio in telefonie-oproepe op of speel dit"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Laat hierdie program, indien dit as die verstekbellerprogram aangewys is, toe om oudio in telefonie-oproepe op te neem of te speel."</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index a98e46a..9f0403c 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"የተደራሽነት አቋራጭ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ን አብርቶታል"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"የተደራሽነት አቋራጭ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ን አጥፍቶታል"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>ን ለመጠቀም ለሦስት ሰከንዶች ሁለቱንም የድምፅ ቁልፎች ተጭነው ይያዙ"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ማጉላት"</string>
<string name="user_switched" msgid="7249833311585228097">"የአሁኑ ተጠቃሚ <xliff:g id="NAME">%1$s</xliff:g>።"</string>
<string name="user_switching_message" msgid="1912993630661332336">"ወደ <xliff:g id="NAME">%1$s</xliff:g> በመቀየር ላይ…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"የቡድን ውይይት"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"የግል"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"ሥራ"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"የግል እይታ"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"የስራ እይታ"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"በሥራ መተግበሪያዎች ማጋራት አይቻልም"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"በግል መተግበሪያዎች ማጋራት አይቻልም"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"የእርስዎ አይቲ አስተዳዳሪ በግል እና በሥራ መገለጫዎች መካከል ማጋራትን አግደዋል"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"የሥራ መተግበሪያዎችን መድረስ አልተቻለም"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"የእርስዎ የአይቲ አስተዳዳሪ የግል ይዘትን በስራ መተግበሪያዎች ውስጥ እንዲመለከቱ አልፈቀዱልዎትም"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"የግል መተግበሪያዎችን መድረስ አይቻልም"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"የእርስዎ የአይቲ አስተዳዳሪ የሥራ ይዘትን በግል መተግበሪያዎች ውስጥ እንዲመለከቱ አልፈቀዱልዎትም"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"ይዘትን ለማጋራት የስራ መገለጫን ያብሩ"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"ይዘትን ለመመልከት የስራ መገለጫን ያብሩ"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"ምንም መተግበሪያዎች አይገኙም"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"አብራ"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"በስልክ ጥሪዎች ላይ ኦዲዮን መቅዳት ወይም ማጫወት"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"ይህ መተግበሪያ እንደ ነባሪ የመደወያ መተግበሪያ ሲመደብ በስልክ ጥሪዎች ላይ ኦዲዮን እንዲቀዳ ወይም እንዲያጫውት ያስችለዋል።"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 613d4fec..25dbdd7 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1723,6 +1723,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"شغَّل اختصار إمكانية الوصول خدمة <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"أوقف اختصار إمكانية الوصول خدمة <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"اضغط مع الاستمرار على مفتاحي مستوى الصوت لمدة 3 ثوانٍ لاستخدام <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"التكبير"</string>
<string name="user_switched" msgid="7249833311585228097">"المستخدم الحالي <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"جارٍ التبديل إلى <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2161,19 +2173,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"محادثة جماعية"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"شخصي"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"عمل"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"عرض المحتوى الشخصي"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"عرض محتوى العمل"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"تتعذّر المشاركة مع تطبيقات العمل"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"تتعذّر المشاركة مع التطبيقات الشخصية"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"حظر مشرف تكنولوجيا المعلومات إمكانية المشاركة بين التطبيقات الشخصية وتطبيقات العمل."</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"لا يمكن الوصول إلى تطبيقات العمل"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"لا يسمح لك مشرف تكنولوجيا المعلومات بالاطّلاع على المحتوى الشخصي في تطبيقات العمل."</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"لا يمكن الوصول إلى التطبيقات الشخصية"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"لا يسمح لك مشرف تكنولوجيا المعلومات بالاطّلاع على محتوى العمل في التطبيقات الشخصية."</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"عليك تفعيل الملف الشخصي للعمل لمشاركة المحتوى."</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"عليك تفعيل الملف الشخصي للعمل لعرض المحتوى."</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"ليس هناك تطبيقات متاحة"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"تفعيل"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"تسجيل الصوت أو تشغيله في المكالمات الهاتفية"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"يسمح الإذن لهذا التطبيق بتسجيل الصوت أو تشغيله في المكالمات الهاتفية عندما يتم تخصيصه كالتطبيق التلقائي لبرنامج الاتصال."</string>
</resources>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 1ec26ff..e0c730c 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"দিব্যাংগসকলৰ সুবিধাৰ শ্বৰ্টকাটটোৱে <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ক অন কৰিছে"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"দিব্যাংগসকলৰ সুবিধাৰ শ্বৰ্টকাটটোৱে <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ক অফ কৰিছে"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ব্যৱহাৰ কৰিবলৈ দুয়োটা ভলিউম বুটাম তিনি ছেকেণ্ডৰ বাবে হেঁচি ৰাখক"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"বিবৰ্ধন"</string>
<string name="user_switched" msgid="7249833311585228097">"বৰ্তমানৰ ব্যৱহাৰকাৰী <xliff:g id="NAME">%1$s</xliff:g>।"</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g>লৈ সলনি কৰি থকা হৈছে…"</string>
@@ -2020,27 +2032,38 @@
<string name="accessibility_system_action_accessibility_menu_label" msgid="8436484650391125184">"সাধ্য সুবিধাৰ মেনু"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ কেপশ্বন বাৰ।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ক সীমাবদ্ধ বাকেটটোত ৰখা হৈছে"</string>
- <!-- no translation found for conversation_single_line_name_display (8958948312915255999) -->
- <skip />
- <!-- no translation found for conversation_title_fallback_one_to_one (1980753619726908614) -->
- <skip />
- <!-- no translation found for conversation_title_fallback_group_chat (456073374993104303) -->
- <skip />
+ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
+ <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"বাৰ্তালাপ"</string>
+ <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"গোটত কৰা বাৰ্তালাপ"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"ব্যক্তিগত"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"কৰ্মস্থান"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ব্যক্তিগত ভিউ"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"কৰ্মস্থানৰ ভিউ"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"কৰ্মস্থানৰ এপ্সমূহৰ সৈতে শ্বেয়াৰ কৰিব নোৱাৰি"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"ব্যক্তিগত এপ্সমূহৰ সৈতে শ্বেয়াৰ কৰিব নোৱাৰি"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"আপোনাৰ আইটি প্ৰশাসকে ব্যক্তিগত আৰু কৰ্মস্থানৰ প্ৰ’ফাইলসমূহৰ মাজত শ্বেয়াৰ কৰাটো অৱৰোধ কৰিছে"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"কৰ্মস্থানৰ এপ্সমূহ এক্সেছ কৰিব নোৱাৰি"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"আপোনাৰ আইটি প্ৰশাসকে আপোনাক কৰ্মস্থানৰ এপ্সমূহত ব্যক্তিগত সমল চাবলৈ নিদিয়ে"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"ব্যক্তিগত এপ্সমূহ এক্সেছ কৰিব নোৱাৰি"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"আপোনাৰ আইটি প্ৰশাসকে আপোনাক ব্যক্তিগত এপ্সমূহত কৰ্মস্থানৰ সমল চাবলৈ নিদিয়ে"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"সমল শ্বেয়াৰ কৰিবলৈ কৰ্মস্থানৰ প্ৰ’ফাইল অন কৰক"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"সমল চাবলৈ কৰ্মস্থানৰ প্ৰ’ফাইল অন কৰক"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"কোনো এপ্ উপলব্ধ নহয়"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"অন কৰক"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"টেলিফ’নী কলসমূহত অডিঅ’ ৰেকৰ্ড অথবা প্লে’ কৰক"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"ডিফ’ল্ট ডায়েলাৰ এপ্লিকেশ্বন হিচাপে আবণ্টন কৰিলে, এই এপ্টোক টেলিফ’নী কলসমূহত অডিঅ’ ৰেকৰ্ড অথবা প্লে’ কৰিবলৈ অনুমতি দিয়ে।"</string>
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 0064e25..9f8336b 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Əlçatımlıq Qısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> xidmətini aktiv etdi"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Əlçatımlıq Qısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> xidmətini deaktiv etdi"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> istifadə etmək üçün hər iki səs düyməsini üç saniyə basıb saxlayın"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Böyütmə"</string>
<string name="user_switched" msgid="7249833311585228097">"Cari istifadəçi <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> adına keçirilir…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Qrup Söhbəti"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Şəxsi"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"İş"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Şəxsi məzmuna baxış"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"İş məzmununa baxış"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"İş tətbiqləri ilə paylaşmaq olmur"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Şəxsi tətbiqlərlə paylaşmaq olmur"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"İT admininiz şəxsi və iş profilləri arasında paylaşımı bloklayıb"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"İş tətbiqlərinə giriş mümkün deyil"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"İT admininiz iş tətbiqlərində şəxsi məzmuna baxmanıza icazə vermir"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Fərdi tətbiqlərə giriş mümkün deyil"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"İT admininiz şəxsi tətbiqlərdə iş məzmununa baxmanıza icazə vermir"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Məzmunu paylaşmaq üçün iş profilini aktiv edin"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Məzmuna baxmaq üçün iş profilini aktiv edin"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Heç bir tətbiq əlçatan deyil"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Aktiv edin"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Telefon zənglərində audio yazmaq və ya oxutmaq"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Defolt nömrəyığan tətbiq kimi təyin edildikdə, bu tətbiqə telefon zənglərində audio yazmaq və ya oxutmaq üçün icazə verir."</string>
</resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 65a6cda..b5c0f21 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -1657,6 +1657,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Prečica za pristupačnost je uključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Prečica za pristupačnost je isključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Pritisnite i zadržite oba tastera za jačinu zvuka tri sekunde da biste koristili <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Uvećanje"</string>
<string name="user_switched" msgid="7249833311585228097">"Aktuelni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Prebacivanje na <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2059,19 +2071,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupna konverzacija"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Lični"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Poslovni"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Lični prikaz"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Prikaz za posao"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Ne možete da delite sadržaj sa aplikacijama za posao"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Ne možete da delite sadržaj sa ličnim aplikacijama"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"IT administrator je blokirao deljenje između ličnih aplikacija i profila za Work"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Pristup aplikacijama za posao nije moguć"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"IT administrator vam ne dozvoljava da u aplikacijama za posao pregledate lični sadržaj"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Pristup ličnim aplikacijama nije moguć"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"IT administrator vam ne dozvoljava da u ličnim aplikacijama pregledate sadržaj za posao"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Uključite profil za Work da biste delili sadržaj"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Uključite profil za Work da biste pregledali sadržaj"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Nema dostupnih aplikacija"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Uključi"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Snimanje ili puštanje zvuka u telefonskim pozivima"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Omogućava ovoj aplikaciji, kada je dodeljena kao podrazumevana aplikacija za pozivanje, da snima ili pušta zvuk u telefonskim pozivima."</string>
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 92b222e..73bd4c1 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -1679,6 +1679,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> быў уключаны з дапамогай камбінацыі хуткага доступу для спецыяльных магчымасцей"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> быў адключаны з дапамогай камбінацыі хуткага доступу для спецыяльных магчымасцей"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Каб карыстацца сэрвісам \"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>\", націсніце і ўтрымлівайце на працягу трох секунд абедзве клавішы гучнасці"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Павелічэнне"</string>
<string name="user_switched" msgid="7249833311585228097">"Бягучы карыстальнік <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Пераход да <xliff:g id="NAME">%1$s</xliff:g>..."</string>
@@ -2093,19 +2105,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групавая размова"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Асабістыя"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Працоўныя"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Прагляд асабістага змесціва"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Прагляд працоўнага змесціва"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Не ўдалося абагуліць з працоўнымі праграмамі"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Не ўдалося абагуліць з асабістымі праграмамі"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Ваш ІТ-адміністратар заблакіраваў абагульванне паміж асабістымі і працоўнымі профілямі"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Не ўдалося атрымаць доступ да працоўных праграм"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Ваш ІТ-адміністратар не дазволіў вам праглядаць асабістае змесціва ў працоўных праграмах"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Не ўдалося атрымаць доступ да асабістых праграм"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Ваш ІТ-адміністратар не дазволіў вам праглядаць працоўнае змесціва ў асабістых праграмах"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Каб абагульваць змесціва, уключыце працоўны профіль"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Каб праглядаць змесціва, уключыце працоўны профіль"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Няма даступных праграм"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Уключыць"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Запісваць або прайграваць аўдыя ў тэлефонных выкліках"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Дазваляе гэтай праграме (калі яна наладжана ў якасці стандартнага набіральніка нумара) запісваць або прайграваць аўдыя ў тэлефонных выкліках."</string>
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 66c9839..867cdad 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Прекият път за достъпност включи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Прекият път за достъпност изключи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"За да използвате <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, натиснете двата бутона за силата на звука и ги задръжте за 3 секунди"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ниво на мащаба"</string>
<string name="user_switched" msgid="7249833311585228097">"Текущ потребител <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Превключва се към <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групов разговор"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Лични"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Служебни"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Личен изглед"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Служебен изглед"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Споделянето със служебни приложения не е възможно"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Споделянето с лични приложения не е възможно"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Системният ви администратор е блокирал споделянето между лични и служебни потребителски профили"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Не може да се осъществи достъп до служебните приложения"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Системният ви администратор не разрешава прегледа на лично съдържание в служебните приложения"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Не може да се осъществи достъп до личните приложения"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Системният ви администратор не разрешава прегледа на служебно съдържание в личните приложения"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Включете служебния потребителски профил, за да споделяте съдържание"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Включете служебния потребителски профил, за да преглеждате съдържание"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Няма приложения"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Включване"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Записване или възпроизвеждане на аудио при телефонни обаждания"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Дава възможност на това приложение да записва или възпроизвежда аудио при телефонни обаждания, когато е зададено като основно приложение за набиране."</string>
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index d811dcc..35e5153 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"অ্যাক্সেসযোগ্যতা শর্টকাট <xliff:g id="SERVICE_NAME">%1$s</xliff:g> কে চালু করেছে"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"অ্যাক্সেসযোগ্যতা শর্টকাট <xliff:g id="SERVICE_NAME">%1$s</xliff:g> কে বন্ধ করেছে"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ব্যবহার করতে ভলিউম কী বোতাম ৩ সেকেন্ডের জন্য চেপে ধরে রাখুন"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"বড় করে দেখা"</string>
<string name="user_switched" msgid="7249833311585228097">"বর্তমান ব্যবহারকারী <xliff:g id="NAME">%1$s</xliff:g>৷"</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> নামের ব্যবহারকারীতে যাচ্ছে…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"গ্রুপ কথোপকথন"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"ব্যক্তিগত"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"অফিস"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ব্যক্তিগত ভিউ"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"অফিসের ভিউ"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"অফিস অ্যাপের সাথে শেয়ার করা যাচ্ছে না"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"ব্যক্তিগত অ্যাপের সাথে শেয়ার করা যাচ্ছে না"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"আপনার আইটি অ্যাডমিন ব্যক্তিগত ও অফিস অ্যাপের মধ্যে শেয়ার করা ব্লক করে রেখেছেন"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"অফিসের অ্যাপ অ্যাক্সেস করা যাচ্ছে না"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"আপনার আইটি অ্যাডমিন আপনাকে অফিস অ্যাপে ব্যক্তিগত কন্টেন্ট দেখতে দেয় না"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"ব্যক্তিগত অ্যাপ অ্যাক্সেস করা যাচ্ছে না"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"আপনার আইটি অ্যাডমিন আপনাকে ব্যক্তিগত অ্যাপে অফিসের কন্টেন্ট দেখতে দেয় না"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"কন্টেন্ট শেয়ার করার জন্য অফিসের প্রোফাইল চালু করুন"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"কন্টেন্ট দেখার জন্য অফিসের প্রোফাইল চালু করুন"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"কোনও অ্যাপ উপলভ্য নেই"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"চালু করুন"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"টেলিফোন কলে অডিও রেকর্ড বা প্লে করুন"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"ডিফল্ট ডায়ালার অ্যাপ্লিকেশন হিসেবে বেছে নেওয়া হলে, টেলিফোন কলে অডিও রেকর্ড বা প্লে করার জন্য এই অ্যাপকে অনুমতি দেয়।"</string>
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 1305ed9..b990c83 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -1659,6 +1659,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Prečica za pristupačnost je uključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Prečica za pristupačnost je isključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Pritisnite obje tipke za podešavanje jačine zvuka i držite ih pritisnutim tri sekunde da koristite uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Uvećavanje"</string>
<string name="user_switched" msgid="7249833311585228097">"Trenutni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Prebacivanje na korisnika <xliff:g id="NAME">%1$s</xliff:g>..."</string>
@@ -2061,19 +2073,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupni razgovor"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Lično"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Posao"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Prikaz ličnog sadržaja"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Prikaz poslovnog sadržaja"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Nije moguće dijeliti s poslovnim aplikacijama"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Nije moguće dijeliti s ličnim aplikacijama"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"IT administrator je blokirao dijeljenje između ličnih i poslovnih profila"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Nije moguće pristupiti poslovnim aplikacijama"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"IT administrator ne dozvoljava da pregledate lični sadržaj u poslovnim aplikacijama"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Nije moguće pristupiti ličnim aplikacijama"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"IT administrator ne dozvoljava da pregledate poslovni sadržaj u ličnim aplikacijama"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Uključite poslovni profil da dijelite sadržaj"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Uključite poslovni profil da pregledate sadržaj"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Nema dostupnih aplikacija"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Uključi"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Snimanje ili reproduciranje zvuka u telefonskim pozivima"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Kad je ova aplikacija postavljena kao zadana aplikacija za pozivanje, omogućava joj snimanje ili reproduciranje zvuka u telefonskim pozivima."</string>
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 116e902..d93905c 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1624,7 +1624,7 @@
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Denega"</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Toca una funció per començar a utilitzar-la:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="2062625107544922685">"Tria les aplicacions que vols fer servir amb el botó d\'accessibilitat"</string>
- <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2831697927653841895">"Tria les aplicacions que vols fer servir amb la drecera de les tecles de volum"</string>
+ <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2831697927653841895">"Tria les aplicacions que vols fer servir amb la drecera per a tecles de volum"</string>
<string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> s\'ha desactivat"</string>
<string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"Edita les dreceres"</string>
<string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"Fet"</string>
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"La drecera d\'accessibilitat ha activat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"La drecera d\'accessibilitat ha desactivat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Mantén premudes les dues tecles de volum durant 3 segons per fer servir <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ampliació"</string>
<string name="user_switched" msgid="7249833311585228097">"Usuari actual: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"S\'està canviant a <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa de grup"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Feina"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visualització personal"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Visualització de treball"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"No es pot compartir amb les aplicacions de treball"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"No es pot compartir amb les aplicacions personals"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"L\'administrador de TI ha bloquejat la compartició entre perfils personals i de treball"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"No es pot accedir a les aplicacions de treball"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"L\'administrador de TI no et permet veure el contingut personal a les aplicacions de treball"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"No es pot accedir a les aplicacions personals"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"L\'administrador de TI no et permet veure el contingut de feina a les aplicacions personals"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Activa el perfil de treball per compartir contingut"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Activa el perfil de treball per veure contingut"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"No hi ha cap aplicació disponible"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Activa"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Gravar o reproduir àudio en trucades"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Permet que l\'aplicació gravi o reprodueixi àudio en trucades si està assignada com a aplicació de marcador predeterminada."</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 9cc9c6d..e758b5f 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1679,6 +1679,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Zkratka přístupnosti zapnula službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Zkratka přístupnosti vypnula službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Chcete-li používat službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, tři sekundy podržte stisknutá obě tlačítka hlasitosti"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Zvětšení"</string>
<string name="user_switched" msgid="7249833311585228097">"Aktuální uživatel je <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Přepínání na účet <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2093,19 +2105,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Skupinová konverzace"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Osobní"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Pracovní"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Osobní zobrazení"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Pracovní zobrazení"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Sdílení s pracovními aplikacemi je zakázáno"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Sdílení s osobními aplikacemi je zakázáno"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Sdílení mezi osobními a pracovními profily zablokoval váš administrátor IT"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Pracovní aplikace nelze použít"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Zobrazení osobního obsahu v pracovních aplikacích zakazuje váš administrátor IT"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Osobní aplikace nelze použít"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Zobrazení pracovního obsahu v osobních aplikacích zakazuje váš administrátor IT"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Chcete-li sdílet obsah, zapněte pracovní profil"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Chcete-li zobrazit obsah, zapněte pracovní profil"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Žádné aplikace k dispozici"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Zapnout"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Záznam a přehrávání zvuků při telefonických hovorech"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Pokud aplikace bude mít toto oprávnění a bude vybrána jako výchozí aplikace pro vytáčení, bude při telefonických hovorech moci přehrávat a zaznamenávat zvuky."</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 8cf32e0..976ffdf 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Genvejen til hjælpefunktioner aktiverede <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Genvejen til hjælpefunktioner deaktiverede <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Hold begge lydstyrkeknapper nede i tre sekunder for at bruge <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Forstørrelse"</string>
<string name="user_switched" msgid="7249833311585228097">"Nuværende bruger <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Skifter til <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Gruppesamtale"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personlig"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Arbejde"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visningen Personligt"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Visningen Arbejde"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Der kan ikke deles med arbejdsapps"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Der kan ikke deles med personlige apps"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Din it-administrator har blokeret deling mellem personlige apps og arbejdsprofiler"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Du har ikke adgang til arbejdsapps"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Din it-administrator har ikke givet dig tilladelse til at se personligt indhold i arbejdsapps"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Du har ikke adgang til personlige apps"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Din it-administrator har ikke givet dig tilladelse til at se arbejdsindhold i personlige apps"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Aktivér arbejdsprofilen for at dele indhold"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Aktivér arbejdsprofilen for at se indhold"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Ingen tilgængelige apps"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Aktivér"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Optage eller afspille lyd i telefonopkald"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Tillader, at denne app kan optage og afspille lyd i telefonopkald, når den er angivet som standardapp til opkald."</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 90e6edd..112d2e0 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> wurde durch die Bedienungshilfenverknüpfung aktiviert"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> wurde durch die Bedienungshilfenverknüpfung deaktiviert"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Halten Sie beide Lautstärketasten drei Sekunden lang gedrückt, um <xliff:g id="SERVICE_NAME">%1$s</xliff:g> zu verwenden"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Vergrößerung"</string>
<string name="user_switched" msgid="7249833311585228097">"Aktueller Nutzer <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="user_switching_message" msgid="1912993630661332336">"Wechseln zu <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Gruppenunterhaltung"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Privat"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Geschäftlich"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Private Ansicht"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Geschäftliche Ansicht"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Teilen mit geschäftlichen Apps nicht möglich"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Teilen mit privaten Apps nicht möglich"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Dein IT-Administrator lässt das Teilen zwischen privaten und geschäftlichen Profilen nicht zu"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Zugriff auf geschäftliche Apps nicht möglich"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Dein IT-Administrator lässt den Zugriff auf private Inhalte in geschäftlichen Apps nicht zu"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Zugriff auf private Apps nicht möglich"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Dein IT-Administrator lässt den Zugriff auf geschäftliche Inhalte in privaten Apps nicht zu"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Zum Teilen von Inhalten muss das Arbeitsprofil aktiviert werden"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Zum Ansehen von Inhalten muss das Arbeitsprofil aktiviert werden"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Keine Apps verfügbar"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Aktivieren"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Audio bei Telefonanrufen aufnehmen oder wiedergeben"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Ermöglicht dieser App das Aufnehmen und Wiedergeben von Audio bei Telefonanrufen, wenn sie als Standard-Telefon-App festgelegt wurde."</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index e757468..563c6ca 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Η συντόμευση προσβασιμότητας ενεργοποίησε την υπηρεσία <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Η συντόμευση προσβασιμότητας απενεργοποίησε την υπηρεσία <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Πατήστε παρατεταμένα και τα δύο κουμπιά έντασης ήχου για τρία δευτερόλεπτα, ώστε να χρησιμοποιήσετε την υπηρεσία <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Μεγιστοποίηση"</string>
<string name="user_switched" msgid="7249833311585228097">"Τρέχων χρήστης <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Εναλλαγή σε <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Ομαδική συνομιλία"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Προσωπικό"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Εργασία"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Προσωπική προβολή"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Προβολή εργασίας"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Δεν είναι δυνατή η κοινοποίηση σε εφαρμογές εργασιών"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Δεν είναι δυνατή η κοινοποίηση σε προσωπικές εφαρμογές"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Ο διαχειριστής IT απέκλεισε την κοινοποίηση μεταξύ των προσωπικών προφίλ και των προφίλ εργασίας."</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Δεν είναι δυνατή η πρόσβαση σε εφαρμογές εργασίας"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Ο διαχειριστής IT δεν σας επιτρέπει να βλέπετε το προσωπικό σας περιεχόμενο σε εφαρμογές εργασίας."</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Δεν είναι δυνατή η πρόσβαση σε προσωπικές εφαρμογές"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Ο διαχειριστής IT δεν σας επιτρέπει να βλέπετε το περιεχόμενο εργασίας σας σε προσωπικές εφαρμογές."</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Ενεργοποιήστε το προφίλ εργασίας για να κοινοποιήσετε περιεχόμενο."</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Ενεργοποιήστε το προφίλ εργασίας για να προβάλετε περιεχόμενο."</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Δεν υπάρχουν διαθέσιμες εφαρμογές"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Ενεργοποίηση"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Εγγραφή ή αναπαραγωγή ήχου σε τηλεφωνικές κλήσεις"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Επιτρέπει σε αυτήν την εφαρμογή, όταν ορίζεται ως προεπιλεγμένη εφαρμογή κλήσης, να εγγράφει ή να αναπαράγει ήχο σε τηλεφωνικές κλήσεις."</string>
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 68fc986..f1579d3 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -436,8 +436,7 @@
<string name="permlab_systemCamera" msgid="3642917457796210580">"Grant an application or service access to system cameras to take pictures and videos"</string>
<string name="permdesc_systemCamera" msgid="544730545441964482">"This privileged | system app can take pictures and record videos using a system camera at any time. Requires the android.permission.CAMERA permission to be held by the app as well"</string>
<string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"Allow an application or service to receive callbacks about camera devices being opened or closed."</string>
- <!-- no translation found for permdesc_cameraOpenCloseListener (2002636131008772908) -->
- <skip />
+ <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"This app can receive callbacks when any camera device is being opened (by what application) or closed."</string>
<string name="permlab_vibrate" msgid="8596800035791962017">"control vibration"</string>
<string name="permdesc_vibrate" msgid="8733343234582083721">"Allows the app to control the vibrator."</string>
<string name="permdesc_vibrator_state" msgid="7050024956594170724">"Allows the app to access the vibrator state."</string>
@@ -1635,6 +1634,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Magnification"</string>
<string name="user_switched" msgid="7249833311585228097">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Switching to <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2036,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group conversation"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Work"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal view"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Work view"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Can’t share with work apps"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Can’t share with personal apps"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Your IT admin blocked sharing between personal and work profiles"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Can’t access work apps"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Your IT admin doesn’t let you view personal content in work apps"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Can’t access personal apps"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Your IT admin doesn’t let you view work content in personal apps"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Turn on work profile to share content"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Turn on work profile to view content"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"No apps available"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Turn on"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Record or play audio in telephony calls"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Allows this app, when assigned as a default dialler application, to record or play audio in telephony calls."</string>
</resources>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 47de3f1..6e30c72 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -436,8 +436,7 @@
<string name="permlab_systemCamera" msgid="3642917457796210580">"Grant an application or service access to system cameras to take pictures and videos"</string>
<string name="permdesc_systemCamera" msgid="544730545441964482">"This privileged | system app can take pictures and record videos using a system camera at any time. Requires the android.permission.CAMERA permission to be held by the app as well"</string>
<string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"Allow an application or service to receive callbacks about camera devices being opened or closed."</string>
- <!-- no translation found for permdesc_cameraOpenCloseListener (2002636131008772908) -->
- <skip />
+ <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"This app can receive callbacks when any camera device is being opened (by what application) or closed."</string>
<string name="permlab_vibrate" msgid="8596800035791962017">"control vibration"</string>
<string name="permdesc_vibrate" msgid="8733343234582083721">"Allows the app to control the vibrator."</string>
<string name="permdesc_vibrator_state" msgid="7050024956594170724">"Allows the app to access the vibrator state."</string>
@@ -1635,6 +1634,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Magnification"</string>
<string name="user_switched" msgid="7249833311585228097">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Switching to <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2036,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group conversation"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Work"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal view"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Work view"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Can’t share with work apps"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Can’t share with personal apps"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Your IT admin blocked sharing between personal and work profiles"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Can’t access work apps"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Your IT admin doesn’t let you view personal content in work apps"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Can’t access personal apps"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Your IT admin doesn’t let you view work content in personal apps"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Turn on work profile to share content"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Turn on work profile to view content"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"No apps available"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Turn on"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Record or play audio in telephony calls"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Allows this app, when assigned as a default dialler application, to record or play audio in telephony calls."</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 68fc986..f1579d3 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -436,8 +436,7 @@
<string name="permlab_systemCamera" msgid="3642917457796210580">"Grant an application or service access to system cameras to take pictures and videos"</string>
<string name="permdesc_systemCamera" msgid="544730545441964482">"This privileged | system app can take pictures and record videos using a system camera at any time. Requires the android.permission.CAMERA permission to be held by the app as well"</string>
<string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"Allow an application or service to receive callbacks about camera devices being opened or closed."</string>
- <!-- no translation found for permdesc_cameraOpenCloseListener (2002636131008772908) -->
- <skip />
+ <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"This app can receive callbacks when any camera device is being opened (by what application) or closed."</string>
<string name="permlab_vibrate" msgid="8596800035791962017">"control vibration"</string>
<string name="permdesc_vibrate" msgid="8733343234582083721">"Allows the app to control the vibrator."</string>
<string name="permdesc_vibrator_state" msgid="7050024956594170724">"Allows the app to access the vibrator state."</string>
@@ -1635,6 +1634,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Magnification"</string>
<string name="user_switched" msgid="7249833311585228097">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Switching to <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2036,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group conversation"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Work"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal view"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Work view"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Can’t share with work apps"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Can’t share with personal apps"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Your IT admin blocked sharing between personal and work profiles"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Can’t access work apps"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Your IT admin doesn’t let you view personal content in work apps"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Can’t access personal apps"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Your IT admin doesn’t let you view work content in personal apps"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Turn on work profile to share content"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Turn on work profile to view content"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"No apps available"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Turn on"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Record or play audio in telephony calls"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Allows this app, when assigned as a default dialler application, to record or play audio in telephony calls."</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 68fc986..f1579d3 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -436,8 +436,7 @@
<string name="permlab_systemCamera" msgid="3642917457796210580">"Grant an application or service access to system cameras to take pictures and videos"</string>
<string name="permdesc_systemCamera" msgid="544730545441964482">"This privileged | system app can take pictures and record videos using a system camera at any time. Requires the android.permission.CAMERA permission to be held by the app as well"</string>
<string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"Allow an application or service to receive callbacks about camera devices being opened or closed."</string>
- <!-- no translation found for permdesc_cameraOpenCloseListener (2002636131008772908) -->
- <skip />
+ <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"This app can receive callbacks when any camera device is being opened (by what application) or closed."</string>
<string name="permlab_vibrate" msgid="8596800035791962017">"control vibration"</string>
<string name="permdesc_vibrate" msgid="8733343234582083721">"Allows the app to control the vibrator."</string>
<string name="permdesc_vibrator_state" msgid="7050024956594170724">"Allows the app to access the vibrator state."</string>
@@ -1635,6 +1634,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Magnification"</string>
<string name="user_switched" msgid="7249833311585228097">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Switching to <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2036,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group conversation"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Work"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal view"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Work view"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Can’t share with work apps"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Can’t share with personal apps"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Your IT admin blocked sharing between personal and work profiles"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Can’t access work apps"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Your IT admin doesn’t let you view personal content in work apps"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Can’t access personal apps"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Your IT admin doesn’t let you view work content in personal apps"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Turn on work profile to share content"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Turn on work profile to view content"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"No apps available"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Turn on"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Record or play audio in telephony calls"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Allows this app, when assigned as a default dialler application, to record or play audio in telephony calls."</string>
</resources>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index ced6287..c0bc5dc 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -1634,6 +1634,12 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Press and hold both volume keys for three seconds to use <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <string name="accessibility_button_prompt_text" msgid="29591089269861261">"Choose a app to use when you tap the accessibility button:"</string>
+ <string name="accessibility_gesture_prompt_text" msgid="1950992471955288772">"Choose a app to use with the accessibility gesture (swipe up from the bottom of the screen with two fingers):"</string>
+ <string name="accessibility_gesture_3finger_prompt_text" msgid="1754236312534510178">"Choose a app to use with the accessibility gesture (swipe up from the bottom of the screen with three fingers):"</string>
+ <string name="accessibility_button_instructional_text" msgid="1761210320049107435">"To switch between apps, touch & hold the accessibility button."</string>
+ <string name="accessibility_gesture_instructional_text" msgid="6207697277963860927">"To switch between apps, swipe up with two fingers and hold."</string>
+ <string name="accessibility_gesture_3finger_instructional_text" msgid="8774465424241303774">"To switch between apps, swipe up with three fingers and hold."</string>
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Magnification"</string>
<string name="user_switched" msgid="7249833311585228097">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Switching to <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2024,19 +2030,20 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Group Conversation"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Work"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal view"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Work view"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Can’t share with work apps"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Can’t share with personal apps"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Your IT admin blocked sharing between personal and work profiles"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Can’t access work apps"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Your IT admin doesn’t let you view personal content in work apps"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Can’t access personal apps"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Your IT admin doesn’t let you view work content in personal apps"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Turn on work profile to share content"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Turn on work profile to view content"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"No apps available"</string>
+ <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"Can’t share this with work apps"</string>
+ <string name="resolver_cant_share_with_work_apps_explanation" msgid="3332302070341130545">"Your IT admin doesn’t allow you to share this content with apps in your work profile"</string>
+ <string name="resolver_cant_access_work_apps" msgid="2455757966397563223">"Can’t open this with work apps"</string>
+ <string name="resolver_cant_access_work_apps_explanation" msgid="3626983885525445790">"Your IT admin doesn’t allow you to open this content with apps in your work profile"</string>
+ <string name="resolver_cant_share_with_personal_apps" msgid="3079139799233316203">"Can’t share this with personal apps"</string>
+ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"Your IT admin doesn’t allow you to share this content with apps in your personal profile"</string>
+ <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Can’t open this with personal apps"</string>
+ <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Your IT admin doesn’t allow you to open this content with apps in your personal profile"</string>
+ <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Work profile is paused"</string>
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Turn on"</string>
+ <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"No work apps can support this content"</string>
+ <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"No work apps can open this content"</string>
+ <string name="resolver_no_personal_apps_available_share" msgid="5639102815174748732">"No personal apps can support this content"</string>
+ <string name="resolver_no_personal_apps_available_resolve" msgid="5120671970531446978">"No personal apps can open this content"</string>
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Record or play audio in telephony calls"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Allows this app, when assigned as default dialer application, to record or play audio in telephony calls."</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index fff3dfa..18ea820 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"El acceso directo de accesibilidad activó <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"El acceso directo de accesibilidad desactivó <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Mantén presionadas ambas teclas de volumen durante tres segundos para usar <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ampliación"</string>
<string name="user_switched" msgid="7249833311585228097">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="user_switching_message" msgid="1912993630661332336">"Cambiando a <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversación en grupo"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Trabajo"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Vista personal"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Vista de trabajo"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"No se puede compartir con apps de trabajo"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"No se puede compartir con apps personales"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Tu administrador de TI bloqueó el uso compartido entre los perfiles personales y los de trabajo"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"No se puede acceder a las apps de trabajo"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"No tienes permiso del administrador de TI para ver el contenido personal en apps de trabajo"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"No se puede acceder a las apps personales"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"No tienes permiso del administrador de TI para ver el contenido de trabajo en apps personales"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Activa el perfil de trabajo para compartir contenido"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Activa el perfil de trabajo para ver contenido"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"No hay apps disponibles"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Activar"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Graba o reproduce audio en llamadas de telefonía"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Permite que esta app grabe o reproduzca audio en llamadas de telefonía cuando se la asigna como aplicación de teléfono predeterminada."</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 00ac27c..b199ab7 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"El acceso directo a accesibilidad ha activado <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"El acceso directo a accesibilidad ha desactivado <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Para utilizar <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, mantén pulsadas ambas teclas de volumen durante 3 segundos"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ampliar"</string>
<string name="user_switched" msgid="7249833311585228097">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="user_switching_message" msgid="1912993630661332336">"Cambiando a <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversación de grupo"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Trabajo"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Ver contenido personal"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Ver contenido de trabajo"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"No se puede compartir con las aplicaciones de trabajo"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"No se puede compartir con las aplicaciones personales"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"No se puede compartir contenido entre los perfiles personales y los de trabajo porque el administrador de TI ha bloqueado esta función"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"No se puede acceder a las aplicaciones de trabajo"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Tu administrador de TI no te permite ver contenido de tus aplicaciones personales en las aplicaciones de trabajo"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"No se puede acceder a las aplicaciones personales"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Tu administrador de TI no te permite ver contenido de las aplicaciones de trabajo en tus aplicaciones personales"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Activa el perfil de trabajo para poder compartir contenido"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Activa el perfil de trabajo para poder ver contenido"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"No hay ninguna aplicación disponible"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Activar"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Grabar o reproducir audio en llamadas telefónicas"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Permite que la aplicación grabe o reproduzca audio en las llamadas telefónicas si está asignada como aplicación Teléfono predeterminada."</string>
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 0138e3c..5908544 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Juurdepääsetavuse otsetee lülitas teenuse <xliff:g id="SERVICE_NAME">%1$s</xliff:g> sisse"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Juurdepääsetavuse otsetee lülitas teenuse <xliff:g id="SERVICE_NAME">%1$s</xliff:g> välja"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Teenuse <xliff:g id="SERVICE_NAME">%1$s</xliff:g> kasutamiseks hoidke kolm sekundit all mõlemat helitugevuse klahvi"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Suurendus"</string>
<string name="user_switched" msgid="7249833311585228097">"Praegune kasutaja <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Üleminek kasutajale <xliff:g id="NAME">%1$s</xliff:g> ..."</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupivestlus"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Isiklik"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Töö"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Isiklik vaade"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Töövaade"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Töörakendustega ei saa jagada"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Isiklike rakendustega ei saa jagada"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"IT-administraator blokeeris isiklike ja tööprofiilide vahel jagamise"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Ei pääse töörakendustele juurde"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"IT-administraator ei luba teil isiklikku sisu töörakendustes vaadata"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Isiklikele rakendustele ei pääse juurde"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"IT-administraator ei luba teil tööga seotud sisu isiklikes rakendustes vaadata"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Sisu jagamiseks lülitage tööprofiil sisse"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Sisu vaatamiseks lülitage tööprofiil sisse"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Ühtegi rakendust pole saadaval"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Lülita sisse"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Telefonikõnede heli salvestamine ja esitamine"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Kui see rakendus on määratud helistamise vaikerakenduseks, lubatakse sellel salvestada ja esitada telefonikõnede heli."</string>
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 2dd7f034..0955151 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Erabilerraztasun-lasterbideak <xliff:g id="SERVICE_NAME">%1$s</xliff:g> aktibatu du"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Erabilerraztasun-lasterbideak <xliff:g id="SERVICE_NAME">%1$s</xliff:g> desaktibatu du"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> erabiltzeko, eduki sakatuta bolumen-tekla biak hiru segundoz"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Lupa"</string>
<string name="user_switched" msgid="7249833311585228097">"Uneko erabiltzailea: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzailera aldatzen…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Taldeko elkarrizketa"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Pertsonala"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Lanekoa"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Ikuspegi pertsonala"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Laneko ikuspegia"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Ezin da partekatu laneko aplikazioekin"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Ezin da partekatu aplikazio pertsonalekin"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"IKT saileko administratzaileak blokeatu egin du edukia profil pertsonalen eta laneko profilen artean partekatzeko aukera"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Ezin dira atzitu laneko aplikazioak"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"IKT saileko administratzaileak ez dizu uzten eduki pertsonala laneko aplikazioetan ikusten"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Ezin dira atzitu aplikazio pertsonalak"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"IKT saileko administratzaileak ez dizu uzten laneko edukia aplikazio pertsonaletan ikusten"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Edukia partekatzeko, aktibatu laneko profila"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Edukia ikusteko, aktibatu laneko profila"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Ez dago aplikaziorik erabilgarri"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Aktibatu"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Grabatu edo erreproduzitu telefono-deietako audioa"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Aplikazio hau markagailu lehenetsia denean, telefono-deietako audioa grabatu edo erreproduzitzeko aukera ematen dio."</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index e8ed71b..e89707b 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"«میانبر دسترسپذیری» <xliff:g id="SERVICE_NAME">%1$s</xliff:g> را روشن کرد"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"«میانبر دسترسپذیری» <xliff:g id="SERVICE_NAME">%1$s</xliff:g> را خاموش کرد"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"برای استفاده از <xliff:g id="SERVICE_NAME">%1$s</xliff:g>، هر دو کلید صدا را فشار دهید و سه ثانیه نگه دارید"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"درشتنمایی"</string>
<string name="user_switched" msgid="7249833311585228097">"کاربر کنونی <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"در حالت تغییر به <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"مکالمه گروهی"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"شخصی"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"کاری"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"نمای شخصی"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"نمای کاری"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"همرسانی بااستفاده از «برنامههای کاری» امکانپذیر نیست"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"همرسانی بااستفاده از برنامههای شخصی امکانپذیر نیست"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"سرپرست فناوری اطلاعات همرسانی بین نمایههای شخصی و کاری را مسدود کرده است"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"دسترسی به برنامههای کاری ممکن نیست"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"سرپرست فناوری اطلاعات اجازه نمیدهد محتوای شخصی را در برنامههای کاری مشاهده کنید"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"دسترسی به برنامههای شخصی ممکن نیست"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"سرپرست فناوری اطلاعات اجازه نمیدهد محتوای کاری را در برنامههای شخصی مشاهده کنید"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"برای همرسانی محتوا، نمایه کاری را روشن کنید"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"برای مشاهده محتوا، نمایه کاری را روشن کنید"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"هیچ برنامهای در دسترس نیست"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"روشن کردن"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"ضبط یا پخش صدا در تماسهای تلفنی"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"به این برنامه اجازه میدهد وقتی بهعنوان برنامه شمارهگیر پیشفرض تنظیم شده است، در تماسهای تلفنی صدا ضبط یا پخش کند."</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 3877d83..b45b7b6 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> otettiin käyttöön esteettömyystilan pikanäppäimellä."</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> poistettiin käytöstä esteettömyystilan pikanäppäimellä."</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Voit käyttää palvelua <xliff:g id="SERVICE_NAME">%1$s</xliff:g> painamalla molempia äänenvoimakkuuspainikkeita kolmen sekunnin ajan"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Suurennus"</string>
<string name="user_switched" msgid="7249833311585228097">"Nykyinen käyttäjä: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Vaihdetaan käyttäjään <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Ryhmäkeskustelu"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Henkilökohtainen"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Työ"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Henkilökohtainen näkymä"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Työnäkymä"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Ei voi jakaa työsovellusten kanssa"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Ei voi jakaa henkilökohtaisten sovellusten kanssa"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Järjestelmänvalvojasi esti jakamisen henkilökohtaisten ja työprofiilien välillä"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Ei pääsyä työsovelluksiin"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Järjestelmänvalvojasi ei anna sinun nähdä henkilökohtaista sisältöä työsovelluksissa"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Ei pääsyä henkilökohtaisiin sovelluksiin"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Järjestelmänvalvojasi ei anna sinun nähdä työsisältöä henkilökohtaisissa sovelluksissa"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Laita työprofiili päälle jakaaksesi sisältöä"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Laita työprofiili päälle nähdäksesi sisältöä"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Sovelluksia ei ole käytettävissä"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Laita päälle"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Äänen tallentaminen tai toistaminen puheluiden aikana"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Sallii tämän sovelluksen tallentaa tai toistaa ääntä puheluiden aikana, kun sovellus on valittu oletuspuhelusovellukseksi."</string>
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 9430f2b..888c17b 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Le raccourci d\'accessibilité a activé la fonction <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Le raccourci d\'accessibilité a désactivé la fonction <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Maintenez enfoncées les deux touches de volume pendant trois secondes pour utiliser <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Zoom"</string>
<string name="user_switched" msgid="7249833311585228097">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="user_switching_message" msgid="1912993630661332336">"Changement d\'utilisateur (<xliff:g id="NAME">%1$s</xliff:g>) en cours…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversation de groupe"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personnel"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Bureau"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Affichage personnel"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Affichage professionnel"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Partage impossible avec les applications professionnelles"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Partage impossible avec les applications personnelles"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Votre administrateur informatique a bloqué le partage entre votre profil personnel et votre profil professionnel"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Impossible d\'accéder aux applications professionnelles"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Votre administrateur informatique ne vous autorise pas à consulter du contenu personnel dans les applications professionnelles"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Impossible d\'accéder aux applications personnelles"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Votre administrateur informatique ne vous autorise pas à consulter du contenu professionnel dans les applications personnelles"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Pour partager du contenu, activez le profil professionnel"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Pour afficher du contenu, activez le profil professionnel"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Aucune application disponible"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Activer"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Enregistrer ou lire du contenu audio lors des appels téléphoniques"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Permet à cette application, lorsqu\'elle est définie comme composeur par défaut, d\'enregistrer ou de lire du contenu audio lors des appels téléphoniques."</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index ddd5ec8..6a08941 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Le raccourci d\'accessibilité a activé <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Le raccourci d\'accessibilité a désactivé <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Appuyez de manière prolongée sur les deux touches de volume pendant trois secondes pour utiliser <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Agrandissement"</string>
<string name="user_switched" msgid="7249833311585228097">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="user_switching_message" msgid="1912993630661332336">"Chargement du profil de <xliff:g id="NAME">%1$s</xliff:g>..."</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversation de groupe"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personnel"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Professionnel"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Vue personnelle"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Vue professionnelle"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Partage impossible avec les applications professionnelles"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Partage impossible avec les applications personnelles"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Votre administrateur informatique a bloqué le partage entre vos profils personnels et professionnels"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Impossible d\'accéder aux applications professionnelles"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Votre administrateur informatique a bloqué l\'affichage du contenu personnel dans les applications professionnelles"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Impossible d\'accéder aux applications personnelles"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Votre administrateur informatique a bloqué l\'affichage du contenu professionnel dans les applications personnelles"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Activez le profil professionnel pour partager du contenu"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Activez le profil professionnel pour afficher du contenu"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Aucune application disponible"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Activer"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Enregistrer ou lire du contenu audio lors des appels téléphoniques"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Permet à cette application d\'enregistrer ou de lire du contenu audio lors des appels téléphoniques lorsqu\'elle est définie comme clavier par défaut."</string>
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 6e54b35..d9eeb7d1 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"O atallo de accesibilidade activou <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"O atallo de accesibilidade desactivou <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Mantén premidas as teclas do volume durante tres segudos para usar <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ampliación"</string>
<string name="user_switched" msgid="7249833311585228097">"Usuario actual <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Cambiando a <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa de grupo"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Persoal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Traballo"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Vista persoal"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Vista de traballo"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Non se pode compartir información coas aplicacións do traballo"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Non se pode compartir información coas aplicacións persoais"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"O teu administrador de TI bloqueou a función de compartir información entre o perfil persoal e o de traballo"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Non se puido acceder ás aplicacións do traballo"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"O teu administrador de TI non che permite ver o teu contido persoal nas aplicacións do traballo"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Non se puido acceder ás aplicacións persoais"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"O teu administrador de TI non che permite ver o contido do traballo nas aplicacións persoais"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Para compartir contido, activa o perfil de traballo"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Para ver contido, activa o perfil de traballo"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Non hai aplicacións dispoñibles"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Activar"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Gravar ou reproducir audio en chamadas telefónicas"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Permite que esta aplicación, cando está asignada como aplicación predeterminada do marcador, grave e reproduza audio en chamadas telefónicas."</string>
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 49c2a7e..f6627fc 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"ઍક્સેસિબિલિટી શૉર્ટકટે <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ચાલુ કરી"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"ઍક્સેસિબિલિટી શૉર્ટકટે <xliff:g id="SERVICE_NAME">%1$s</xliff:g> બંધ કરી"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>નો ઉપયોગ કરવા માટે બન્ને વૉલ્યૂમ કીને ત્રણ સેકન્ડ સુધી દબાવી રાખો"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"વિસ્તૃતીકરણ"</string>
<string name="user_switched" msgid="7249833311585228097">"વર્તમાન વપરાશકર્તા <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> પર સ્વિચ કરી રહ્યાં છે…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ગ્રૂપ વાતચીત"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"વ્યક્તિગત"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"કાર્યાલય"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"વ્યક્તિગત વ્યૂ"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ઑફિસ વ્યૂ"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"ઑફિસ માટેની ઍપની સાથે શેર કરી શકતાં નથી"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"વ્યક્તિગત ઍપની સાથે શેર કરી શકતાં નથી"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"તમારા IT વ્યવસ્થાપકે વ્યક્તિગત અને કાર્યાલયની પ્રોફાઇલ વચ્ચે શેરિંગની સુવિધાને બ્લૉક કરી છે"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"ઑફિસ માટેની ઍપનો ઍક્સેસ કરી શકતાં નથી"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"તમારા IT વ્યવસ્થાપક તમને ઑફિસ માટેની ઍપમાં વ્યક્તિગત કન્ટેન્ટ જોવા દેતા નથી"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"વ્યક્તિગત ઍપનો ઍક્સેસ કરી શકતાં નથી"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"તમારા IT વ્યવસ્થાપક તમને વ્યક્તિગત ઍપમાં ઑફિસ માટેનું કન્ટેન્ટ જોવા દેતા નથી"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"કન્ટેન્ટ શેર કરવા માટે કાર્યાલયની પ્રોફાઇલ શેર કરો"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"કન્ટેન્ટ જોવા માટે કાર્યાલયની પ્રોફાઇલ ચાલુ કરો"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"કોઈ ઍપ ઉપલબ્ધ નથી"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"ચાલુ કરો"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"ટેલિફોની કૉલમાં ઑડિયો રેકૉર્ડ કરો અથવા ચલાવો"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"ડિફૉલ્ટ ડાયલર ઍપ તરીકે સોંપણી કરવામાં આવવા પર આ ઍપને ટેલિફોની કૉલમાં ઑડિયો રેકૉર્ડ કરવાની અથવા ચલાવવાની મંજૂરી આપે છે."</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 1d3aa6e..93b76851 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1647,6 +1647,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"सुलभता शॉर्टकट ने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को चालू किया"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"सुलभता शॉर्टकट ने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को बंद किया"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> इस्तेमाल करने के लिए आवाज़ वाले दोनों बटन तीन सेकंड तक दबाकर रखें"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"बड़ा करना"</string>
<string name="user_switched" msgid="7249833311585228097">"मौजूदा उपयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> पर स्विच किया जा रहा है…"</string>
@@ -1860,8 +1872,7 @@
<string name="default_notification_channel_label" msgid="3697928973567217330">"बिना किसी श्रेणी के"</string>
<string name="importance_from_user" msgid="2782756722448800447">"आपने इन सूचनाओं की अहमियत सेट की है."</string>
<string name="importance_from_person" msgid="4235804979664465383">"यह मौजूद व्यक्तियों के कारण महत्वपूर्ण है."</string>
- <!-- no translation found for notification_history_title_placeholder (7748630986182249599) -->
- <skip />
+ <string name="notification_history_title_placeholder" msgid="7748630986182249599">"ऐप्लिकेशन की सूचना पसंद के मुताबिक बनाएं"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="APP">%1$s</xliff:g> को <xliff:g id="ACCOUNT">%2$s</xliff:g> के नाम से एक नया उपयोगकर्ता बनाने की अनुमति दें (इस नाम से एक खाता पहले से मौजूद है)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Allow <xliff:g id="APP">%1$s</xliff:g> to create a new User with <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
<string name="language_selection_title" msgid="52674936078683285">"भाषा जोड़ें"</string>
@@ -2038,28 +2049,32 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ग्रुप में बातचीत"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"निजी प्रोफ़ाइल"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"वर्क प्रोफ़ाइल"</string>
- <!-- no translation found for resolver_personal_tab_accessibility (5739524949153091224) -->
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
<skip />
- <!-- no translation found for resolver_work_tab_accessibility (4753168230363802734) -->
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
<skip />
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"ऑफ़िस के काम से जुड़े ऐप्लिकेशन के साथ चीज़ें शेयर नहीं की जा सकतीं"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"निजी ऐप्लिकेशन के साथ कुछ शेयर नहीं किया जा सकता"</string>
- <!-- no translation found for resolver_cant_share_cross_profile_explanation (5556640604460901386) -->
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
<skip />
- <!-- no translation found for resolver_cant_access_work_apps (375634344111233790) -->
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
<skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (3958762224516867388) -->
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
<skip />
- <!-- no translation found for resolver_cant_access_personal_apps (1953215925406474177) -->
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
<skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1725572276741281136) -->
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
<skip />
- <!-- no translation found for resolver_turn_on_work_apps_share (619263911204978175) -->
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
<skip />
- <!-- no translation found for resolver_turn_on_work_apps_view (3073389230905543680) -->
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
<skip />
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"कोई ऐप्लिकेशन उपलब्ध नहीं है"</string>
- <!-- no translation found for resolver_switch_on_work (2873009160846966379) -->
+ <string name="resolver_switch_on_work" msgid="2873009160846966379">"चालू करें"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
<skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"फ़ोन कॉल के दौरान, ऑडियो रिकॉर्ड करने या उसे चलाने की अनुमति"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"डिफ़ॉल्ट डायलर ऐप्लिकेशन के तौर पर असाइन होने पर, इस ऐप्लिकेशन को फ़ोन कॉल के दौरान ऑडियो रिकॉर्ड करने और उसे चलाने की मंज़ूरी मिल जाती है."</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 0c9de58..d109de3 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1657,6 +1657,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Prečac pristupačnosti uključio je uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Prečac pristupačnosti isključio je uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Pritisnite i zadržite tipke za glasnoću na tri sekunde da biste koristili uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Povećavanje"</string>
<string name="user_switched" msgid="7249833311585228097">"Trenutačni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Prebacivanje na korisnika <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2059,19 +2071,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupni razgovor"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Osobno"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Posao"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Osobni prikaz"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Poslovni prikaz"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Dijeljenje s poslovnim aplikacijama nije moguće"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Dijeljenje s osobnim aplikacijama nije moguće"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Vaš IT administrator blokirao je dijeljenje između osobnih i poslovnih profila"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Nije moguće pristupiti poslovnim aplikacijama"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Vaš IT administrator ne dopušta pregled osobnih sadržaja u poslovnim aplikacijama"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Nije moguće pristupiti osobnim aplikacijama"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Vaš IT administrator ne dopušta pregled poslovnih sadržaja u osobnim aplikacijama"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Uključite poslovni profil da biste dijelili sadržaj"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Uključite poslovni profil da biste pregledavali sadržaj"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Aplikacije nisu dostupne"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Uključi"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Snimanje ili reprodukcija zvuka u telefonskim pozivima"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Kad je ova aplikacija postavljena kao zadana aplikacija za biranje, omogućuje joj snimanje ili reprodukciju zvuka u telefonskim pozivima."</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 6f3426a..b404879 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"A Kisegítő lehetőségek gyorsparancsa bekapcsolta a következő szolgáltatást: <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"A Kisegítő lehetőségek gyorsparancsa kikapcsolta a következő szolgáltatást: <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"A(z) <xliff:g id="SERVICE_NAME">%1$s</xliff:g> használatához tartsa lenyomva három másodpercig a két hangerőgombot"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Nagyítás"</string>
<string name="user_switched" msgid="7249833311585228097">"<xliff:g id="NAME">%1$s</xliff:g> az aktuális felhasználó."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Átváltás erre: <xliff:g id="NAME">%1$s</xliff:g>..."</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Csoportos beszélgetés"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Személyes"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Munka"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Személyes nézet"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Munkanézet"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Nem lehetséges a munkahelyi alkalmazásokkal való megosztás"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Nem lehetséges a személyes alkalmazásokkal való megosztás"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Rendszergazdája letiltotta a személyes és a munkaprofilok közti megosztást"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Nem lehet hozzáférni a munkahelyi alkalmazásokhoz"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Rendszergazdája nem engedélyezi személyes tartalmak munkahelyi alkalmazásokban való megtekintését"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Nem lehet hozzáférni a személyes alkalmazásokhoz"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Rendszergazdája nem engedélyezi a munkahelyi tartalmak személyes alkalmazásokban való megtekintését"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"A tartalom megosztásához kapcsolja be munkaprofilját"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"A tartalom megtekintéséhez kapcsolja be munkaprofilját"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Nem áll rendelkezésre alkalmazás"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Bekapcsolás"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Audiotartalmak felvétele és lejátszása telefonhívások közben"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Lehetővé teszi ennek az alkalmazásnak audiotartalmak felvételét és lejátszását telefonhívások közben, amennyiben az alkalmazás alapértelmezett tárcsázóalkalmazásként van kijelölve."</string>
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 0520cd0..0a35ea0 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Մատչելիության դյուրանցումն միացրել է <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ծառայությունը"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Մատչելիության դյուրանցումն անջատել է <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ծառայությունը"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"«<xliff:g id="SERVICE_NAME">%1$s</xliff:g>» ծառայությունն օգտագործելու համար սեղմեք և 3 վայրկյան պահեք ձայնի ուժգնության երկու կոճակները"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Խոշորացում"</string>
<string name="user_switched" msgid="7249833311585228097">"Ներկայիս օգտատերը <xliff:g id="NAME">%1$s</xliff:g>:"</string>
<string name="user_switching_message" msgid="1912993630661332336">"Փոխարկվում է <xliff:g id="NAME">%1$s</xliff:g>-ին..."</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Խմբային նամակագրություն"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Անձնական"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Աշխատանքային"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Անձնական"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Աշխատանքային"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Հնարավոր չէ կիսվել աշխատանքային հավելվածների հետ"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Հնարավոր չէ կիսվել անձնական հավելվածների հետ"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Ձեր ՏՏ ադմինիստրատորն արգելափակել է աշխատանքային և անձնական պրոֆիլների միջև տվյալների փոխանակումը։"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Աշխատանքային հավելվածների հասանելիությունն արգելափակված է"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Ձեր ՏՏ ադմինիստրատորը չի թույլատրում դիտել անձնական բովանդակությունը աշխատանքային հավելվածներում։"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Անձնական հավելվածների հասանելիությունն արգելափակված է"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Ձեր ՏՏ ադմինիստրատորը չի թույլատրում դիտել աշխատանքային բովանդակությունը անձնական հավելվածներում։"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Բովանդակությամբ կիսվելու համար միացրեք աշխատանքային պրոֆիլը։"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Բովանդակությունը դիտելու համար միացրեք աշխատանքային պրոֆիլը։"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Հասանելի հավելվածներ չկան"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Միացնել"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Հեռախոսային զանգերի ձայնագրում և նվագարկում"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Եթե այս հավելվածն ըստ կանխադրման օգտագործվում է զանգերի համար, այն կարող է ձայնագրել և նվագարկել հեռախոսային խոսակցությունները։"</string>
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index b5e3eeb..26d427c 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Pintasan Aksesibilitas mengaktifkan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Pintasan Aksesibilitas menonaktifkan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Tekan dan tahan kedua tombol volume selama tiga detik untuk menggunakan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Pembesaran"</string>
<string name="user_switched" msgid="7249833311585228097">"Pengguna saat ini <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Beralih ke <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Percakapan Grup"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Pribadi"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Kerja"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Tampilan pribadi"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Tampilan kerja"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Tidak dapat membagikan ke aplikasi kerja"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Tidak dapat membagikan ke aplikasi pribadi"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Admin IT memblokir berbagi antara profil kerja dan pribadi"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Tidak dapat mengakses aplikasi kerja"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Admin IT tidak mengizinkan Anda melihat konten pribadi di aplikasi kerja"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Tidak dapat mengakses aplikasi pribadi"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Admin IT tidak mengizinkan Anda melihat konten kerja di aplikasi pribadi"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Aktifkan profil kerja untuk membagikan konten"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Aktifkan profil kerja untuk melihat konten"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Tidak ada aplikasi yang tersedia"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Aktifkan"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Rekam atau putar audio dalam panggilan telepon"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Mengizinkan aplikasi ini, saat ditetapkan sebagai aplikasi telepon default, untuk merekam atau memutar audio dalam panggilan telepon."</string>
</resources>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index f840c92..18d82ae 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Flýtileið aðgengisstillingar kveikti á <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Flýtileið aðgengisstillingar slökkti á <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Haltu báðum hljóðstyrkstökkunum inni í þrjár sekúndur til að nota <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Stækkun"</string>
<string name="user_switched" msgid="7249833311585228097">"Núverandi notandi <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Skiptir yfir á <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Hópsamtal"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Persónulegt"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Vinna"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Persónulegt yfirlit"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Vinnuyfirlit"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Ekki er hægt að deila með vinnuforritum"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Ekki er hægt að deila með persónulegum forritum"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Kerfisstjórinn þinn hefur lokað á deilingu milli eigin sniðs og vinnusniðs"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Ekki fæst aðgangur að vinnuforritum"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Kerfisstjórinn þinn leyfir þér ekki að skoða persónulegt efni í vinnuforritum"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Ekki fæst aðgangur að persónulegum forritum"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Kerfisstjórinn þinn leyfir þér ekki að skoða vinnuefni í persónulegum forritum"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Kveiktu á vinnusniði til að deila efni"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Kveiktu á vinnusniði til að skoða efni"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Engin forrit í boði"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Kveikja"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Taka upp eða spila hljóð í símtölum"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Gerir þessu forriti kleift að taka upp og spila hljóð í símtölum þegar það er valið sem sjálfgefið hringiforrit."</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index eb3f9f6..5d1c567 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"La scorciatoia Accessibilità ha attivato <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"La scorciatoia Accessibilità ha disattivato <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Tieni premuti entrambi i tasti del volume per tre secondi per utilizzare <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ingrandimento"</string>
<string name="user_switched" msgid="7249833311585228097">"Utente corrente <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Passaggio a <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversazione di gruppo"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personale"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Lavoro"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visualizzazione personale"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Visualizzazione di lavoro"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Impossibile condividere con app di lavoro"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Impossibile condividere con app personali"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Il tuo amministratore IT ha bloccato la condivisione tra profilo personale e di lavoro"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Impossibile accedere alle app di lavoro"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Il tuo amministratore IT non consente la visualizzazione dei contenuti personali nelle app di lavoro"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Impossibile accedere alle app personali"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Il tuo amministratore IT non consente la visualizzazione dei contenuti di lavoro nelle app personali"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Attiva il profilo di lavoro per condividere contenuti"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Attiva il profilo di lavoro per visualizzare contenuti"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Nessuna app disponibile"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Attiva"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Registrazione o riproduzione dell\'audio delle telefonate"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Consente a questa app, se assegnata come applicazione telefono predefinita, di registrare o riprodurre l\'audio delle telefonate."</string>
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 7471568..ef817b6 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1679,6 +1679,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> הופעל על-ידי קיצור הדרך לנגישות"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> הושבת על-ידי קיצור הדרך לנגישות"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"יש ללחוץ לחיצה ארוכה על שני לחצני עוצמת הקול למשך שלוש שניות כדי להשתמש בשירות <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"הגדלה"</string>
<string name="user_switched" msgid="7249833311585228097">"המשתמש הנוכחי <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"עובר אל <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2093,19 +2105,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"שיחה קבוצתית"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"אישי"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"עבודה"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"תצוגה אישית"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"תצוגת עבודה"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"לא ניתן לשתף עם אפליקציות לעבודה"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"לא ניתן לשתף עם אפליקציות פרטיות"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"השיתוף בין פרופילים אישיים לפרופילים של עבודה נחסם על ידי מנהל/ת ה-IT"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"לא ניתן לגשת לאפליקציות לעבודה"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"מנהל/ת ה-IT לא מאפשר/ת לך להציג תוכן אישי באפליקציות לעבודה"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"לא ניתן לגשת לאפליקציות אישיות"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"מנהל/ת ה-IT לא מאפשר/ת לך להציג תוכן עבודה באפליקציות אישיות"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"יש להפעיל את פרופיל העבודה כדי לשתף תוכן"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"יש להפעיל את פרופיל העבודה כדי להציג תוכן"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"אין אפליקציות זמינות"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"הפעלה"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"הקלטה או הפעלה של אודיו בשיחות טלפוניות"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"כאשר האפליקציה הזו מוגדרת כאפליקציית חייגן בברירת מחדל, תהיה לה הרשאה להקליט ולהפעיל אודיו בשיחות טלפוניות."</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 9e501c3..147abde 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"ユーザー補助機能のショートカットにより <xliff:g id="SERVICE_NAME">%1$s</xliff:g> は ON になっています"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"ユーザー補助機能のショートカットにより <xliff:g id="SERVICE_NAME">%1$s</xliff:g> は OFF になっています"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> を使用するには、音量大と音量小の両方のボタンを 3 秒間長押ししてください"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"拡大"</string>
<string name="user_switched" msgid="7249833311585228097">"現在のユーザーは<xliff:g id="NAME">%1$s</xliff:g>です。"</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g>に切り替えています…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"グループの会話"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"個人用"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"仕事用"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"個人用ビュー"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"仕事用ビュー"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"仕事用アプリと共有できません"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"個人用アプリと共有できません"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"IT 管理者が個人用プロファイルと仕事用プロファイルの間の共有をブロックしました"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"仕事用アプリにアクセスできません"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"IT 管理者は個人用コンテンツを仕事用アプリで表示することを許可していません"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"個人用アプリにアクセスできません"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"IT 管理者は仕事用コンテンツを個人用アプリで表示することを許可していません"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"コンテンツを共有するには、仕事用プロファイルをオンにしてください"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"コンテンツを表示するには、仕事用プロファイルをオンにしてください"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"利用できるアプリはありません"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"オンにする"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"通話中に録音または音声の再生を行う"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"デフォルトの電話アプリケーションとして割り当てられている場合、このアプリに通話中の録音または音声の再生を許可します。"</string>
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 4041ed0..54c659d 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"მარტივი წვდომის მალსახმობმა ჩართო <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"მარტივი წვდომის მალსახმობმა გამორთო <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> რომ გამოიყენოთ, დააჭირეთ ხმის ორივე ღილაკზე 3 წამის განმავლობაში"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"გადიდება"</string>
<string name="user_switched" msgid="7249833311585228097">"ამჟამინდელი მომხმარებელი <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g>-ზე გადართვა…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ჯგუფური მიმოწერა"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"პირადი"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"სამსახური"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"პირადი ხედი"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"სამსახურის ხედი"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"სამსახურის აპებით გაზიარება შეუძლებელია"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"პირადი აპებით გაზიარება შეუძლებელია"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"თქვენმა IT ადმინისტრატორმა დაბლოკა გაზიარება პირად და სამსახურის პროფილებს შორის"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"სამსახურის აპებზე წვდომა ვერ ხერხდება"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"თქვენი IT ადმინისტრატორი არ გაძლევთ სამსახურის აპებიდან პირადი კონტენტის ნახვის უფლებას"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"პირად აპებზე წვდომა ვერ ხერხდება"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"თქვენი IT ადმინისტრატორი არ გაძლევთ პირადი აპებიდან სამსახურის კონტენტის ნახვის უფლებას"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"კონტენტის გასაზიარებლად ჩართეთ სამსახურის პროფილი"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"კონტენტის სანახავად ჩართეთ სამსახურის პროფილი"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"ხელმისაწვდომი აპები არ არის"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"ჩართვა"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"სატელეფონო ზარებში აუდიოს ჩაწერა ან დაკვრა"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"ნაგულისხმევ დასარეკ აპლიკაციად არჩევის შემთხვევაში, ნებას რთავს აპს ჩაიწეროს ან დაუკრას აუდიო სატელეფონო ზარებში."</string>
</resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 147229e..e28887a 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Арнайы мүмкіндіктер таңбашасы <xliff:g id="SERVICE_NAME">%1$s</xliff:g> қызметін қосты"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Арнайы мүмкіндіктер таңбашасы <xliff:g id="SERVICE_NAME">%1$s</xliff:g> қызметін өшірді"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> қызметін пайдалану үшін дыбыс деңгейін реттейтін екі түймені де 3 секунд басып тұрыңыз"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ұлғайту"</string>
<string name="user_switched" msgid="7249833311585228097">"Ағымдағы пайдаланушы <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> ауысу орындалуда…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Топтық чат"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Жеке"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Жұмыс"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Жеке көру"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Жұмыс деректерін көру"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Жұмыс қолданбаларымен бөлісілмейді"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Жеке қолданбалармен бөлісілмейді"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Әкімшіңіз жеке және жұмыс қолданбалары арасында деректер бөлісуге тыйым салған."</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Жұмыс қолданбаларын пайдалану мүмкін емес"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Әкімшіңіз жұмыс қолданбаларынан жеке мазмұнды көруге тыйым салған."</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Жеке қолданбаларды пайдалану мүмкін емес"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Әкімшіңіз жеке қолданбалардан жұмыс мазмұнын көруге тыйым салған."</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Мазмұнды бөлісу үшін жұмыс профилін қосыңыз."</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Мазмұнды көру үшін жұмыс профилін қосыңыз."</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Қолданбалар жоқ"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Қосу"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Телефон қоңырауларында аудио жазу немесе ойнату"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Қолданба әдепкі нөмір тергіш қолданба ретінде тағайындалған кезде, телефон қоңырауларында аудионы жазуға немесе ойнатуға мүмкіндік береді."</string>
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 272c6b0..3e8a6e9 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -1637,6 +1637,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"ផ្លូវកាត់ភាពងាយស្រួលបានបើក <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"ផ្លូវកាត់ភាពងាយស្រួលបានបិទ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"ចុចគ្រាប់ចុចកម្រិតសំឡេងទាំងពីរឱ្យជាប់រយៈពេលបីវិនាទី ដើម្បីប្រើ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ការពង្រីក"</string>
<string name="user_switched" msgid="7249833311585228097">"អ្នកប្រើបច្ចុប្បន្ន <xliff:g id="NAME">%1$s</xliff:g> ។"</string>
<string name="user_switching_message" msgid="1912993630661332336">"កំពុងប្ដូរទៅ <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2027,19 +2039,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ការសន្ទនាជាក្រុម"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"ផ្ទាល់ខ្លួន"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"ការងារ"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ទិដ្ឋភាពផ្ទាល់ខ្លួន"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ទិដ្ឋភាពការងារ"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"មិនអាចចែករំលែកជាមួយកម្មវិធីការងារបានទេ"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"មិនអាចចែករំលែកជាមួយកម្មវិធីផ្ទាល់ខ្លួនបានទេ"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"អ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកបានទប់ស្កាត់ការចែករំលែករវាងកម្រងព័ត៌មានការងារ និងផ្ទាល់ខ្លួន"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"មិនអាចចូលប្រើកម្មវិធីការងារបានទេ"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"អ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកមិនអនុញ្ញាតឱ្យអ្នកមើលខ្លឹមសារផ្ទាល់ខ្លួននៅក្នុងកម្មវិធីការងារទេ"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"មិនអាចចូលប្រើកម្មវិធីផ្ទាល់ខ្លួនបានទេ"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"អ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកមិនអនុញ្ញាតឱ្យអ្នកមើលខ្លឹមសារការងារនៅក្នុងកម្មវិធីផ្ទាល់ខ្លួនទេ"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"បើកកម្រងព័ត៌មានការងារ ដើម្បីចែករំលែកខ្លឹមសារ"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"បើកកម្រងព័ត៌មានការងារ ដើម្បីមើលខ្លឹមសារ"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"មិនមានកម្មវិធីដែលអាចប្រើបានទេ"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"បើក"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"ថត ឬចាក់សំឡេងនៅក្នុងការហៅទូរសព្ទ"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"នៅពេលកំណត់ជាកម្មវិធីផ្ទាំងចុចហៅទូរសព្ទលំនាំដើម សូមអនុញ្ញាតឱ្យកម្មវិធីនេះថត ឬចាក់សំឡេងនៅក្នុងការហៅទូរសព្ទ។"</string>
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index e772919..bbfd1394 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್, <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಆನ್ ಮಾಡಿದೆ"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್, <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಆಫ್ ಮಾಡಿದೆ"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಬಳಸಲು ಎರಡೂ ಧ್ವನಿ ಕೀಗಳನ್ನು ಮೂರು ಸೆಕೆಂಡ್ಗಳ ಕಾಲ ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ಹಿಗ್ಗಿಸುವಿಕೆ"</string>
<string name="user_switched" msgid="7249833311585228097">"ಪ್ರಸ್ತುತ ಬಳಕೆದಾರರು <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> ಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ…"</string>
@@ -2020,27 +2032,38 @@
<string name="accessibility_system_action_accessibility_menu_label" msgid="8436484650391125184">"ಪ್ರವೇಶಿಸುವಿಕೆ ಮೆನು"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್ನ ಶೀರ್ಷಿಕೆಯ ಪಟ್ಟಿ."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ಅನ್ನು ನಿರ್ಬಂಧಿತ ಬಕೆಟ್ಗೆ ಹಾಕಲಾಗಿದೆ"</string>
- <!-- no translation found for conversation_single_line_name_display (8958948312915255999) -->
- <skip />
- <!-- no translation found for conversation_title_fallback_one_to_one (1980753619726908614) -->
- <skip />
- <!-- no translation found for conversation_title_fallback_group_chat (456073374993104303) -->
- <skip />
+ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
+ <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ಸಂವಾದ"</string>
+ <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ಗುಂಪು ಸಂವಾದ"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"ವೈಯಕ್ತಿಕ"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"ಕೆಲಸ"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ವೈಯಕ್ತಿಕ ವೀಕ್ಷಣೆ"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ಕೆಲಸದ ವೀಕ್ಷಣೆ"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"ಕೆಲಸದ ಆ್ಯಪ್ಗಳೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರು, ವೈಯಕ್ತಿಕ ಮತ್ತು ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ಗಳ ನಡುವೆ ಹಂಚಿಕೊಳ್ಳುವುದನ್ನು ನಿರ್ಬಂಧಿಸಿದ್ದಾರೆ"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರು, ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳಲ್ಲಿರುವ ವೈಯಕ್ತಿಕ ವಿಷಯವನ್ನು ನೋಡಲು ನಿಮಗೆ ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರು, ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳಲ್ಲಿರುವ ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ವಿಷಯವನ್ನು ನೋಡಲು ನಿಮಗೆ ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"ವಿಷಯವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಆನ್ ಮಾಡಿ"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"ವಿಷಯವನ್ನು ವೀಕ್ಷಿಸಲು ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಆನ್ ಮಾಡಿ"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"ಯಾವುದೇ ಆ್ಯಪ್ಗಳು ಲಭ್ಯವಿಲ್ಲ"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"ಆನ್ ಮಾಡಿ"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"ಫೋನ್ ಕರೆಗಳಲ್ಲಿ ಆಡಿಯೊವನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಿ ಅಥವಾ ಪ್ಲೇ ಮಾಡಿ"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"ಡೀಫಾಲ್ಟ್ ಡಯಲರ್ ಅಪ್ಲಿಕೇಶನ್ ರೀತಿ ಬಳಸಿದಾಗ ಫೋನ್ ಕರೆಗಳಲ್ಲಿ ಆಡಿಯೊವನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲು ಅಥವಾ ಪ್ಲೇ ಮಾಡಲು ಈ ಆ್ಯಪ್ ಅನ್ನು ಅನುಮತಿಸಿ."</string>
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index b53feee..98638d8 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"접근성 단축키로 인해 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>이(가) 사용 설정되었습니다."</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"접근성 단축키로 인해 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>이(가) 사용 중지되었습니다."</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> 서비스를 사용하려면 두 볼륨 키를 3초 동안 길게 누르세요"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"확대"</string>
<string name="user_switched" msgid="7249833311585228097">"현재 사용자는 <xliff:g id="NAME">%1$s</xliff:g>님입니다."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g>(으)로 전환하는 중…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"그룹 대화"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"개인"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"직장"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"개인 뷰"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"직장 뷰"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"직장 앱과 공유할 수 없음"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"개인 앱과 공유할 수 없음"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"IT 관리자가 개인 프로필과 직장 프로필 간의 공유를 차단했습니다."</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"직장 앱에 액세스할 수 없습니다"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"IT 관리자가 직장 앱에서 개인 콘텐츠를 보도록 허용하지 않습니다."</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"개인 앱에 액세스할 수 없습니다"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"IT 관리자가 개인 앱에서 직장 콘텐츠를 보도록 허용하지 않습니다."</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"콘텐츠를 공유하려면 직장 프로필을 사용 설정하세요."</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"콘텐츠를 보려면 직장 프로필을 사용 설정하세요."</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"사용 가능한 앱 없음"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"사용 설정"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"전화 통화 중에 오디오 녹음 또는 재생"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"이 앱이 기본 다이얼러 애플리케이션으로 지정되었을 때 전화 통화 중에 오디오를 녹음하거나 재생하도록 허용합니다."</string>
</resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index d3d7730..62ad31b 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Атайын мүмкүнчүлүктөр кыска жолу <xliff:g id="SERVICE_NAME">%1$s</xliff:g> кызматын күйгүздү"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Атайын мүмкүнчүлүктөр кыска жолу <xliff:g id="SERVICE_NAME">%1$s</xliff:g> кызматын өчүрдү"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> кызматын колдонуу үчүн үнүн чоңойтуп/кичирейтүү баскычтарын үч секунд коё бербей басып туруңуз"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Чоңойтуу"</string>
<string name="user_switched" msgid="7249833311585228097">"Учурдагы колдонуучу <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> дегенге которулууда…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Топтук маек"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Жеке"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Жумуш"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Жеке көрүнүш"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Жумуш көрүнүшү"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Жумуш колдонмолору менен бөлүшүүгө болбойт"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Жеке колдонмолор менен бөлүшүүгө болбойт"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"IT администраторуңуз жеке жана жумуш профилдеринин ортосунда бөлүшүүнү бөгөттөп койгон"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Жумуш колдонмолоруна кирүү мүмкүн эмес"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"IT администраторуңуз жумуш колдонмолорунда жеке мазмунду көрүүгө тыюу салып койгон"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Жеке колдонмолорго кирүү мүмкүн эмес"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"IT администраторуңуз жеке колдонмолордо жумушка тийиштүү мазмунду көрүүгө тыюу салып койгон"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Мазмунду бөлүшүү үчүн жумуш профилин күйгүзүңүз"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Мазмунду көрүү үчүн жумуш профилин күйгүзүңүз"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Колдонмолор жок"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Күйгүзүү"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Телефон чалууларда жаздырып же аудиону ойнотуу"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Бул колдонмо демейки телефон катары дайындалганда ага чалууларды жаздырууга жана аудиону ойнотууга уруксат берет."</string>
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index b96c694..b7e1f05 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"ກົດປຸ່ມສຽງທັງສອງພ້ອມກັນຄ້າງໄວ້ສາມວິນາທີເພື່ອໃຊ້ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ການຂະຫຍາຍ"</string>
<string name="user_switched" msgid="7249833311585228097">"ຜູ່ໃຊ້ປັດຈຸບັນ <xliff:g id="NAME">%1$s</xliff:g> ."</string>
<string name="user_switching_message" msgid="1912993630661332336">"ກຳລັງສະລັບໄປຫາ <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ການສົນທະນາກຸ່ມ"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"ສ່ວນຕົວ"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"ວຽກ"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ມຸມມອງສ່ວນຕົວ"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ມຸມມອງວຽກ"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"ບໍ່ສາມາດແບ່ງປັນກັບແອັບວຽກໄດ້"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"ບໍ່ສາມາດແບ່ງປັນກັບແອັບສ່ວນຕົວໄດ້"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານບລັອກການແບ່ງປັນລະຫວ່າງໂປຣໄຟລ໌ສ່ວນຕົວ ແລະ ໂປຣໄຟລ໌ວຽກໄວ້"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"ບໍ່ສາມາດເຂົ້າເຖິງແອັບວຽກໄດ້"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ທ່ານເບິ່ງເນື້ອຫາສ່ວນຕົວໃນແອັບວຽກໄດ້"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"ບໍ່ສາມາດເຂົ້າເຖິງແອັບສ່ວນຕົວໄດ້"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ທ່ານເບິ່ງເນື້ອຫາວຽກໃນແອັບສ່ວນຕົວ"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"ເປີດໃຊ້ໂປຣໄຟລ໌ວຽກເພື່ອແບ່ງປັນເນື້ອຫາ"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"ເປີດໃຊ້ໂປຣໄຟລ໌ວຽກເພື່ອເບິ່ງເນື້ອຫາ"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"ບໍ່ມີແອັບທີ່ສາມາດໃຊ້ໄດ້"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"ເປີດໃຊ້"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"ບັນທຶກ ຫຼື ຫຼິ້ນສຽງໃນການໂທລະສັບ"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"ອະນຸຍາດແອັບນີ້, ເມື່ອມອບໝາຍເປັນແອັບພລິເຄຊັນໂທລະສັບເລີ່ມຕົ້ນເພື່ອບັນທຶກ ຫຼື ຫຼິ້ນສຽງໃນການໂທລະສັບ."</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 15fc3aa..ff01738 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1679,6 +1679,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Pritaikymo neįgaliesiems sparčiuoju klavišu buvo įjungta „<xliff:g id="SERVICE_NAME">%1$s</xliff:g>“"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Pritaikymo neįgaliesiems sparčiuoju klavišu buvo išjungta „<xliff:g id="SERVICE_NAME">%1$s</xliff:g>“"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Jei norite naudoti „<xliff:g id="SERVICE_NAME">%1$s</xliff:g>“, paspauskite abu garsumo klavišus ir palaikykite tris sekundes"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Didinimas"</string>
<string name="user_switched" msgid="7249833311585228097">"Dabartinis naudotojas: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Perjungiama į <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2093,19 +2105,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupės pokalbis"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Asmeninė"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Darbo"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Asmeninė peržiūra"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Darbo peržiūra"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Negalima bendrinti su darbo programomis"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Negalima bendrinti su asmeninėmis programomis"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"IT administratorius užblokavo bendrinimą tarp asmeninio ir darbo profilių"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Nepavyko pasiekti darbo programų"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"IT administratorius neleidžia peržiūrėti asmeninio turinio darbo programose"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Nepavyko pasiekti asmeninių programų"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"IT administratorius neleidžia peržiūrėti darbo turinio asmeninėse programose"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Įjunkite darbo profilį, jei norite bendrinti turinį"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Įjunkite darbo profilį, jei norite peržiūrėti turinį"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Nėra pasiekiamų programų"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Įjungti"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Telefonų skambučių garso įrašo įrašymas arba leidimas"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Leidžiama šiai programai, esant prisijungus kaip numatytajai numerio rinkiklio programai, įrašyti ar leisti telefonų skambučių garso įrašą."</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 6a76a79..d6edf3b 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1657,6 +1657,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Pieejamības saīsne aktivizēja lietotni <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Pieejamības saīsne deaktivizēja lietotni <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Lai izmantotu pakalpojumu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, nospiediet abus skaļuma taustiņus un turiet tos trīs sekundes."</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Palielinājums"</string>
<string name="user_switched" msgid="7249833311585228097">"Pašreizējais lietotājs: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Notiek pāriešana uz: <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -2059,19 +2071,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grupas saruna"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Privātais profils"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Darba profils"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personisks skats"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Darba skats"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Nevar kopīgot ar darba lietotnēm"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Nevar kopīgot ar personīgajām lietotnēm"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"IT administrators bloķēja datu kopīgošanu starp personīgo un darba profilu."</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Nevar piekļūt darba lietotnēm"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"IT administrators neļauj skatīt personisko saturu darba lietotnēs."</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Nevar piekļūt personīgajām lietotnēm"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"IT administrators neļauj skatīt darba saturu personīgajās lietotnēs."</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Ieslēdziet darba profilu, lai kopīgotu saturu."</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Ieslēdziet darba profilu, lai skatītu saturu."</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Nav pieejamu lietotņu"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Ieslēgt"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Ierakstīt vai atskaņot audio tālruņa sarunās"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Ļauj šai lietotnei ierakstīt vai atskaņot audio tālruņa sarunās, kad tā ir iestatīta kā noklusējuma tālruņa lietojumprogramma."</string>
</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 2490206..888b708 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1637,6 +1637,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Кратенката за пристапност ја вклучи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Кратенката за пристапност ја исклучи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Притиснете ги и задржете ги двете копчиња за јачина на звукот во траење од три секунди за да користите <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Зголемување"</string>
<string name="user_switched" msgid="7249833311585228097">"Тековен корисник <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Се префрла на <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2027,19 +2039,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групен разговор"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Лични"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Службени"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Личен приказ"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Работен приказ"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Не може да се споделува со работни апликации"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Не може да се споделува со лични апликации"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"IT-администраторот го блокирал споделувањето помеѓу лични и работни профили"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Не може да се пристапи до работните апликации"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"IT-администраторот не ви дозволува прегледување лични содржини во работни апликации"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Не може да се пристапи до личните апликации"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"IT-администраторот не ви дозволува прегледување работни содржини во лични апликации"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Вклучете го работниот профил за да споделувате содржини"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Вклучете го работниот профил за да прегледувате содржини"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Нема достапни апликации"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Вклучи"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Снимајте или пуштајте аудио во телефонски повици"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Дозволува апликацијава да снима или да пушта аудио во телефонски повици кога е назначена како стандардна апликација за бирање."</string>
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 33237ef..d85caff 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -451,10 +451,8 @@
<string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"കോളിംഗ് അനുഭവം മെച്ചപ്പെടുത്തുന്നതിനായി തങ്ങളുടെ കോളുകൾ സിസ്റ്റത്തിലേയ്ക്ക് വഴിതിരിച്ചുവിടാൻ ആപ്പുകളെ അനുവദിക്കുന്നു."</string>
<string name="permlab_callCompanionApp" msgid="3654373653014126884">"സിസ്റ്റത്തിലൂടെ കോളുകൾ കാണുകയും നിയന്ത്രിക്കുകയും ചെയ്യുക."</string>
<string name="permdesc_callCompanionApp" msgid="8474168926184156261">"ഉപകരണത്തിൽ നിലവിലുള്ള കോളുകൾ കാണാനും നിയന്തിക്കാനും ആപ്പിനെ അനുവദിക്കുന്നു. കോളുകൾക്കുള്ള നമ്പറുകളും അവയുടെ നിലയും പോലെയുള്ള വിവരങ്ങൾ ഇതിൽ ഉൾപ്പെടുന്നു."</string>
- <!-- no translation found for permlab_exemptFromAudioRecordRestrictions (1164725468350759486) -->
- <skip />
- <!-- no translation found for permdesc_exemptFromAudioRecordRestrictions (2425117015896871976) -->
- <skip />
+ <string name="permlab_exemptFromAudioRecordRestrictions" msgid="1164725468350759486">"ഓഡിയോ റെക്കോർഡ് ചെയ്യുന്നതിനുള്ള നിയന്ത്രണങ്ങളിൽ നിന്ന് ഒഴിവാക്കുക"</string>
+ <string name="permdesc_exemptFromAudioRecordRestrictions" msgid="2425117015896871976">"ഓഡിയോ റെക്കോർഡ് ചെയ്യുന്നതിനുള്ള നിയന്ത്രണങ്ങളിൽ നിന്ന് ആപ്പിനെ ഒഴിവാക്കുക."</string>
<string name="permlab_acceptHandover" msgid="2925523073573116523">"മറ്റൊരു ആപ്പിൽ നിന്നുള്ള കോൾ തുടരുക"</string>
<string name="permdesc_acceptHandovers" msgid="7129026180128626870">"മറ്റൊരു ആപ്പിൽ ആരംഭിച്ച കോൾ തുടരാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_readPhoneNumbers" msgid="5668704794723365628">"ഫോൺ നമ്പറുകൾ റീഡുചെയ്യൽ"</string>
@@ -1637,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"ഉപയോഗസഹായിക്കുള്ള കുറുക്കുവഴി <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഓൺ ചെയ്തിരിക്കുന്നു"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"ഉപയോഗസഹായിക്കുള്ള കുറുക്കുവഴി <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഓഫ് ചെയ്തിരിക്കുന്നു"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഉപയോഗിക്കാൻ, രണ്ട് വോളിയം കീകളും മൂന്ന് സെക്കൻഡ് അമർത്തിപ്പിടിക്കുക"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"മാഗ്നിഫിക്കേഷൻ"</string>
<string name="user_switched" msgid="7249833311585228097">"നിലവിലെ ഉപയോക്താവ് <xliff:g id="NAME">%1$s</xliff:g> ആണ്."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> എന്ന ഉപയോക്താവിലേക്ക് മാറുന്നു…"</string>
@@ -2022,27 +2032,38 @@
<string name="accessibility_system_action_accessibility_menu_label" msgid="8436484650391125184">"ഉപയോഗസഹായി മെനു"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന്റെ അടിക്കുറിപ്പ് ബാർ."</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> നിയന്ത്രിത ബക്കറ്റിലേക്ക് നീക്കി"</string>
- <!-- no translation found for conversation_single_line_name_display (8958948312915255999) -->
- <skip />
- <!-- no translation found for conversation_title_fallback_one_to_one (1980753619726908614) -->
- <skip />
- <!-- no translation found for conversation_title_fallback_group_chat (456073374993104303) -->
- <skip />
+ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
+ <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"സംഭാഷണം"</string>
+ <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ഗ്രൂപ്പ് സംഭാഷണം"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"വ്യക്തിപരമായത്"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"ജോലിസ്ഥലം"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"വ്യക്തിപര കാഴ്ച"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ഔദ്യോഗിക കാഴ്ച"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"ഔദ്യോഗിക ആപ്പുകൾ ഉപയോഗിച്ച് പങ്കിടാനാവില്ല"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"വ്യക്തിപരമാക്കിയ ആപ്പുകൾ ഉപയോഗിച്ച് പങ്കിടാനാവില്ല"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"വ്യക്തിപരവും ഔദ്യോഗികവുമായ പ്രൊഫെെലുകൾക്കിടയിലെ പങ്കിടലിനെ ഐടി അഡ്മിൻ ബ്ലോക്ക് ചെയ്തു"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"ഔദ്യോഗിക ആപ്പുകൾ ആക്സസ് ചെയ്യാനാകില്ല"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"ഔദ്യോഗിക ആപ്പുകളിൽ വ്യക്തിപര ഉള്ളടക്കം കാണാൻ ഐടി അഡ്മിൻ നിങ്ങളെ അനുവദിക്കുന്നില്ല"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"വ്യക്തിപര ആപ്പുകൾ ആക്സസ് ചെയ്യാനാകില്ല"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"വ്യക്തിപര ആപ്പുകളിൽ ഔദ്യോഗിക ഉള്ളടക്കം കാണാൻ ഐടി അഡ്മിൻ നിങ്ങളെ അനുവദിക്കുന്നില്ല"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"ഉള്ളടക്കം പങ്കിടാൻ ഔദ്യോഗിക പ്രൊഫെെൽ ഓണാക്കുക"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"ഉള്ളടക്കം കാണാൻ ഔദ്യോഗിക പ്രൊഫെെൽ ഓണാക്കുക"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"ആപ്പുകളൊന്നും ലഭ്യമല്ല"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"ഓണാക്കുക"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"ടെലിഫോൺ കോളുകൾ ചെയ്യുമ്പോൾ റെക്കോർഡ് ചെയ്യുക അല്ലെങ്കിൽ ഓഡിയോ പ്ലേ ചെയ്യുക"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"ഡിഫോൾട്ട് ഡയലർ ആപ്പായി അസെെൻ ചെയ്യുന്ന സമയത്ത്, ടെലിഫോൺ കോളുകൾ ചെയ്യുമ്പോൾ റെക്കോർഡ് ചെയ്യാൻ അല്ലെങ്കിൽ ഓഡിയോ പ്ലേ ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കുന്നു."</string>
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 8e6a942..ce79dd3 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Хүртээмжийн товчлол <xliff:g id="SERVICE_NAME">%1$s</xliff:g>-г асаасан"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Хүртээмжийн товчлол <xliff:g id="SERVICE_NAME">%1$s</xliff:g>-г унтраасан"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>-г ашиглахын тулд дууны түвшнийг ихэсгэх, багасгах түлхүүрийг 3 секундийн турш зэрэг дарна уу"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Томруулах"</string>
<string name="user_switched" msgid="7249833311585228097">"Одоогийн хэрэглэгч <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> руу сэлгэж байна…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Бүлгийн харилцан яриа"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Хувийн"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Ажил"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Хувийн харагдах байдал"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Ажлын харагдах байдал"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Ажлын аппуудтай хуваалцах боломжгүй"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Хувийн аппуудтай хуваалцах боломжгүй"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Таны IT админ хувийн болон ажлын профайлуудын хооронд хуваалцахыг блоклосон"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Ажлын аппуудад хандах боломжгүй байна"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Таны IT админ ажлын аппууд дахь хувийн контентыг харахыг танд зөвшөөрөхгүй байна"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Хувийн аппуудад хандах боломжгүй байна"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Таны IT админ хувийн аппууд дахь ажлын контентыг харахыг танд зөвшөөрөхгүй байна"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Контентыг хуваалцахын тулд ажлын профайлыг асаана уу"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Контентыг харахын тулд ажлын профайлыг асаана уу"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Боломжтой апп алга байна"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Асаах"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Утасны дуудлагын үеэр аудио бичих эсвэл тоглуулах"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Энэ аппыг залгагч өгөгдмөл аппликэйшн болгосон үед түүнд утасны дуудлагын үеэр аудио бичих эсвэл тоглуулахыг зөвшөөрдөг."</string>
</resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 1adf5bb..c3f3072 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"प्रवेशयोग्यता शॉर्टकटने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> चालू केली"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"प्रवेशयोग्यता शॉर्टकटने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> बंद केली"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> वापरण्यासाठी दोन्ही व्हॉल्युम की तीन सेकंद दाबा आणि धरून ठेवा"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"मोठे करणे"</string>
<string name="user_switched" msgid="7249833311585228097">"वर्तमान वापरकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> वर स्विच करत आहे…"</string>
@@ -2028,19 +2040,33 @@
<skip />
<string name="resolver_personal_tab" msgid="2051260504014442073">"वैयक्तिक"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"ऑफिस"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"वैयक्तिक दृश्य"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"कार्य दृश्य"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"ऑफिस ॲप्स सोबत शेअर करू शकत नाही"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"वैयक्तिक अॅप्स सोबत शेअर करू शकत नाही"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"तुमच्या आयटी ॲडमिनने वैयक्तिक आणि कार्य प्रोफाइल दरम्यान शेअर करणे ब्लॉक केले आहे"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"कामासंबंधित ॲप्स अॅक्सेस करू शकत नाही"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"तुमचा आयटी ॲडमिन तुम्हाला वैयक्तिक आशय कामासंबंधित ॲप्सवर पाहाण्याची अनुमती देत नाही"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"वैयक्तिक ॲप्स अॅक्सेस करू शकत नाही"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"तुमचा आयटी ॲडमिन तुम्हाला कामासंबंधित आशय वैयक्तिक ॲप्सवर पाहाण्याची अनुमती देत नाही"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"आशय शेअर करण्यासाठी कार्य प्रोफाइल सुरू करा"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"आशय पाहण्यासाठी कार्य प्रोफाइल सुरू करा"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"कोणतीही अॅप्स उपलब्ध नाहीत"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"सुरू करा"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"टेलिफोनी कॉलमध्ये ऑडिओ रेकॉर्ड करा किंवा प्ले करा"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"टेलिफोनी कॉलमध्ये ऑडिओ रेकॉर्ड करण्याची किंवा प्ले करण्यासाठी डीफॉल्ट डायलर अॅप्लिकेशन म्हणून असाइन केले असताना या ॲपला परवानगी देते."</string>
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index a6173c2..36242ae7 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Pintasan kebolehaksesan menghidupkan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Pintasan Kebolehaksesan mematikan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Tekan dan tahan kedua-dua kekunci kelantangan selama tiga saat untuk menggunakan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Pembesaran"</string>
<string name="user_switched" msgid="7249833311585228097">"Pengguna semasa <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Bertukar kepada <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Perbualan Kumpulan"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Peribadi"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Kerja"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Paparan peribadi"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Paparan kerja"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Tidak dapat berkongsi dengan apl kerja"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Tidak dapat berkongsi dengan apl peribadi"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Pentadbir IT anda menyekat perkongsian antara profil peribadi dan kerja"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Tidak dapat mengakses apl kerja"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Pentadbir IT anda tidak membenarkan anda melihat kandungan peribadi dalam apl kerja"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Tidak dapat mengakses apl peribadi"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Pentadbir IT anda tidak membenarkan anda melihat kandungan dalam apl peribadi"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Hidupkan profil kerja untuk berkongsi kandungan"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Hidupkan profil kerja untuk melihat kandungan"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Tiada rangkaian yang tersedia"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Hidupkan"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Rakam atau mainkan audio dalam panggilan telefoni"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Apabila ditetapkan sebagai apl pendail lalai, membenarkan apl ini merakam atau memainkan audio dalam panggilan telefoni."</string>
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 562bc0c..cbc334ce 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်သည် <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို ဖွင့်လိုက်ပါသည်"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်သည် <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို ပိတ်လိုက်ပါသည်"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို သုံးရန် အသံအတိုးအလျှော့ ခလုတ်နှစ်ခုလုံးကို သုံးစက္ကန့်ကြာ ဖိထားပါ"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ချဲ့ခြင်း"</string>
<string name="user_switched" msgid="7249833311585228097">"လက်ရှိအသုံးပြုနေသူ <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g>သို့ ပြောင်းနေ…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"အဖွဲ့စကားဝိုင်း"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"ကိုယ်ပိုင်"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"အလုပ်"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ပုဂ္ဂိုလ်ရေးဆိုင်ရာ မြင်ကွင်း"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"အလုပ် မြင်ကွင်း"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"အလုပ်သုံးအက်ပ်များနှင့် မျှဝေ၍ မရပါ"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"ကိုယ်ပိုင်သုံးအက်ပ်များနှင့် မျှဝေ၍ မရပါ"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"သင့် အိုင်တီစီမံခန့်ခွဲသူသည် ပုဂ္ဂိုလ်ရေးဆိုင်ရာနှင့် အလုပ် ပရိုဖိုင်များအကြား မျှဝေခြင်းကို ပိတ်ထားသည်"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"အလုပ်သုံးအက်ပ်များကို ဖွင့်၍မရပါ"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"သင့် အိုင်တီစီမံခန့်ခွဲသူသည် အလုပ်သုံးအက်ပ်များတွင် ပုဂ္ဂိုလ်ရေးဆိုင်ရာ အကြောင်းအရာကို ကြည့်ခွင့်မပြုပါ"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"ပုဂ္ဂိုလ်ရေးဆိုင်ရာ အက်ပ်များကို သုံးခွင့်မရှိပါ"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"သင့် အိုင်တီ စီမံခန့်ခွဲသူသည် ပုဂ္ဂိုလ်ရေးဆိုင်ရာအက်ပ်များတွင် အလုပ်သုံး အကြောင်းအရာကို ကြည့်ခွင့်မပြုပါ"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"အကြောင်းအရာမျှဝေရန် အလုပ်ပရိုဖိုင်ကို ဖွင့်ပါ"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"အကြောင်းအရာကို ကြည့်ရန် အလုပ်ပရိုဖိုင်ကို ဖွင့်ပါ"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"မည်သည့်အက်ပ်မျှ မရှိပါ"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"ဖွင့်ရန်"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"ဖုန်းခေါ်ဆိုမှုများအတွင်း အသံဖမ်းခြင်း သို့မဟုတ် ဖွင့်ခြင်း"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"ဤအက်ပ်အား မူလ dialer အပလီကေးရှင်းအဖြစ် သတ်မှတ်ထားစဉ် ဖုန်းခေါ်ဆိုမှုများအတွင်း အသံဖမ်းခြင်း သို့မဟုတ် ဖွင့်ခြင်း ပြုလုပ်ရန် ခွင့်ပြုပါ။"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 2070284..ce02f9f 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Snarveien for tilgjengelighet slo på <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Snarveien for tilgjengelighet slo av <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Trykk og hold inne begge volumtastene i tre sekunder for å bruke <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Forstørring"</string>
<string name="user_switched" msgid="7249833311585228097">"Gjeldende bruker: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Bytter til <xliff:g id="NAME">%1$s</xliff:g> …"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Gruppesamtale"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personlig"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Jobb"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personlig visning"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Jobbvisning"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Kan ikke dele med jobbapper"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Kan ikke dele med personlige apper"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"IT-administratoren din har blokkert deling mellom personlige profiler og jobbprofiler"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Får ikke tilgang til jobbapper"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"IT-administratoren din lar deg ikke se personlig innhold i jobbapper"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Får ikke tilgang til personlige apper"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"IT-administratoren din lar deg ikke se jobbinnhold i personlige apper"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Slå på jobbprofilen for å dele innhold"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Slå på jobbprofilen for å se innhold"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Ingen apper er tilgjengelige"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Slå på"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Ta opp eller spill av lyd i telefonsamtaler"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Tillater at denne appen tar opp eller spiller av lyd i telefonsamtaler når den er angitt som standard ringeapp."</string>
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index cc5a306..c1d2e70 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -1641,6 +1641,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"पहुँचको सर्टकटले <xliff:g id="SERVICE_NAME">%1$s</xliff:g> लाई सक्रिय पार्यो"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"पहुँचको सर्टकटले <xliff:g id="SERVICE_NAME">%1$s</xliff:g> लाई निष्क्रिय पार्यो"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> प्रयोग गर्न दुवै भोल्युम कुञ्जीहरूलाई तीन सेकेन्डसम्म थिचिराख्नुहोस्"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"म्याग्निफिकेसन"</string>
<string name="user_switched" msgid="7249833311585228097">"अहिलेको प्रयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>।"</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> मा स्विच गर्दै..."</string>
@@ -2026,27 +2038,38 @@
<string name="accessibility_system_action_accessibility_menu_label" msgid="8436484650391125184">"पहुँचसम्बन्धी मेनु"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> को क्याप्सन बार।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> लाई प्रतिबन्धित बाल्टीमा राखियो"</string>
- <!-- no translation found for conversation_single_line_name_display (8958948312915255999) -->
- <skip />
- <!-- no translation found for conversation_title_fallback_one_to_one (1980753619726908614) -->
- <skip />
- <!-- no translation found for conversation_title_fallback_group_chat (456073374993104303) -->
- <skip />
+ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
+ <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"वार्तालाप"</string>
+ <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"सामूहिक वार्तालाप"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"व्यक्तिगत"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"काम"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"व्यक्तिगत दृश्य"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"कार्य दृश्य"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"कामसम्बन्धी अनुप्रयोगहरूसँग आदान प्रदान गर्न सकिँदैन"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"व्यक्तिगत अनुप्रयोगहरूसँग आदान प्रदान गर्न सकिँदैन"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"तपाईंका IT प्रशासकले व्यक्तिगत र कामसम्बन्धी कार्य प्रोफाइलहरूबिच आदान प्रदान गर्ने सुविधामाथि रोक लगाउनुभयो"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"कामसम्बन्धी अनुप्रयोगहरूमाथि पहुँच राख्न सकिएन"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"तपाईंका IT प्रशासकले तपाईंलाई कामसम्बन्धी अनुप्रयोगहरूमा व्यक्तिगत सामग्री हेर्ने अनुमति दिनुभएको छैन"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"व्यक्तिगत अनुप्रयोगहरूमाथि पहुँच राख्न सकिएन"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"तपाईंका IT प्रशासकले तपाईंलाई व्यक्तिगत अनुप्रयोगहरूमा कामसम्बन्धी सामग्री हेर्ने अनुमति दिनुभएको छैन"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"सामग्री आदान प्रदान गर्न कार्य प्रोफाइल सक्रिय गर्नुहोस्"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"सामग्री हेर्न कार्य प्रोफाइल सक्रिय गर्नुहोस्"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"कुनै पनि अनुप्रयोग उपलब्ध छैन"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"सक्रिय गर्नुहोस्"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"टेलिफोन कल गर्दै गर्दा अडियो रेकर्ड गर्नुहोस् वा प्ले गर्नुहोस्"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"यस अनुप्रयोगलाई पूर्वनिर्धारित डायलर अनुप्रयोग निर्धारण गर्दा टेलिफोन कलको अडियो रेकर्ड गर्ने र प्ले गर्ने अनुमति दिन्छ।"</string>
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index e1b597e..f012fcc 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"\'Snelkoppeling toegankelijkheid\' heeft <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ingeschakeld"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"\'Snelkoppeling toegankelijkheid\' heeft <xliff:g id="SERVICE_NAME">%1$s</xliff:g> uitgeschakeld"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Houd beide volumetoetsen drie seconden ingedrukt om <xliff:g id="SERVICE_NAME">%1$s</xliff:g> te gebruiken"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Vergroting"</string>
<string name="user_switched" msgid="7249833311585228097">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Overschakelen naar <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Groepsgesprek"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Persoonlijk"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Werk"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Persoonlijke weergave"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Werkweergave"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Kan niet delen met werk-apps"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Kan niet delen met persoonlijke apps"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Je IT-beheerder heeft delen tussen persoonlijke en werkprofielen geblokkeerd"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Geen toegang tot werk-apps"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Je IT-beheerder staat niet toe dat je persoonlijke content bekijkt in werk-apps"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Geen toegang tot persoonlijke apps"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Je IT-beheerder staat niet toe dat je werkcontent bekijkt in persoonlijke apps"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Schakel het werkprofiel in om content te delen"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Schakel het werkprofiel in om content te bekijken"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Geen apps beschikbaar"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Inschakelen"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Audio opnemen of afspelen in telefoongesprekken"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Hiermee mag deze app (indien toegewezen als standaard dialer-app) audio opnemen of afspelen in telefoongesprekken."</string>
</resources>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 1107c68..f9ecad9 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -210,7 +210,7 @@
<string name="turn_on_radio" msgid="2961717788170634233">"ୱେୟାରଲେସ୍କୁ ଚାଲୁ କରନ୍ତୁ"</string>
<string name="turn_off_radio" msgid="7222573978109933360">"ୱେୟାରଲେସ୍କୁ ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="screen_lock" msgid="2072642720826409809">"ସ୍କ୍ରୀନ୍ ଲକ୍"</string>
- <string name="power_off" msgid="4111692782492232778">"ପାୱାର୍ ଅଫ୍"</string>
+ <string name="power_off" msgid="4111692782492232778">"ପାୱାର୍ ବନ୍ଦ"</string>
<string name="silent_mode_silent" msgid="5079789070221150912">"ରିଙ୍ଗର୍ ଅଫ୍ ଅଛି"</string>
<string name="silent_mode_vibrate" msgid="8821830448369552678">"ରିଙ୍ଗର୍ କମ୍ପନ"</string>
<string name="silent_mode_ring" msgid="6039011004781526678">"ରିଙ୍ଗର୍ ଅନ୍ ଅଛି"</string>
@@ -234,11 +234,11 @@
<string name="global_actions" product="tv" msgid="3871763739487450369">"Android ଟିଭିର ବିକଳ୍ପଗୁଡ଼ିକ"</string>
<string name="global_actions" product="default" msgid="6410072189971495460">"ଫୋନ ବିକଳ୍ପ"</string>
<string name="global_action_lock" msgid="6949357274257655383">"ସ୍କ୍ରୀନ୍ ଲକ୍"</string>
- <string name="global_action_power_off" msgid="4404936470711393203">"ପାୱାର୍ ଅଫ୍"</string>
+ <string name="global_action_power_off" msgid="4404936470711393203">"ପାୱାର୍ ବନ୍ଦ"</string>
<string name="global_action_emergency" msgid="1387617624177105088">"ଜରୁରୀକାଳୀନ"</string>
<string name="global_action_bug_report" msgid="5127867163044170003">"ବଗ୍ ରିପୋର୍ଟ"</string>
<string name="global_action_logout" msgid="6093581310002476511">"ସେସନ୍ ଶେଷ କରନ୍ତୁ"</string>
- <string name="global_action_screenshot" msgid="2610053466156478564">"ସ୍କ୍ରୀନଶଟ୍"</string>
+ <string name="global_action_screenshot" msgid="2610053466156478564">"ସ୍କ୍ରିନସଟ୍"</string>
<string name="bugreport_title" msgid="8549990811777373050">"ବଗ୍ ରିପୋର୍ଟ"</string>
<string name="bugreport_message" msgid="5212529146119624326">"ଇ-ମେଲ୍ ମେସେଜ୍ ଭାବରେ ପଠାଇବାକୁ, ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ଡିଭାଇସ୍ ବିଷୟରେ ଏହା ସୂଚନା ସଂଗ୍ରହ କରିବ। ବଗ୍ ରିପୋର୍ଟ ଆରମ୍ଭ ହେବାପରଠାରୁ ଏହାକୁ ପଠାଇବା ପାଇଁ କିଛି ସମୟ ଲାଗିବ, ଦୟାକରି ଧୈର୍ଯ୍ୟ ରଖନ୍ତୁ।"</string>
<string name="bugreport_option_interactive_title" msgid="7968287837902871289">"ଇଣ୍ଟରାକ୍ଟିଭ୍ ରିପୋର୍ଟ"</string>
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"ଆକ୍ସେସିବିଲିଟୀ ଶର୍ଟକଟ୍ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ଅନ୍ କରାଯାଇଛି"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"ଆକ୍ସେସିବିଲିଟୀ ଶର୍ଟକଟ୍ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ଅଫ୍ କରାଯାଇଛି"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ବ୍ୟବହାର କରିବାକୁ ତିନି ସେକେଣ୍ଡ ପାଇଁ ଉଭୟ ଭଲ୍ୟୁମ୍ କୀ ଦବାଇ ଧରି ରଖନ୍ତୁ"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ମ୍ୟାଗ୍ନିଫିକେସନ୍"</string>
<string name="user_switched" msgid="7249833311585228097">"ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="NAME">%1$s</xliff:g>।"</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> ରେ ସୁଇଚ୍ କରନ୍ତୁ…"</string>
@@ -2020,27 +2032,38 @@
<string name="accessibility_system_action_accessibility_menu_label" msgid="8436484650391125184">"ଆକ୍ସେସିବିଲିଟୀ ମେନୁ"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>ର କ୍ୟାପ୍ସନ୍ ବାର୍।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>କୁ ପ୍ରତିବନ୍ଧିତ ବକେଟରେ ରଖାଯାଇଛି"</string>
- <!-- no translation found for conversation_single_line_name_display (8958948312915255999) -->
- <skip />
- <!-- no translation found for conversation_title_fallback_one_to_one (1980753619726908614) -->
- <skip />
- <!-- no translation found for conversation_title_fallback_group_chat (456073374993104303) -->
- <skip />
+ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
+ <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"ବାର୍ତ୍ତାଳାପ"</string>
+ <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ଗୋଷ୍ଠୀ ବାର୍ତ୍ତାଳାପ"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"ବ୍ୟକ୍ତିଗତ"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"କାର୍ଯ୍ୟ"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ବ୍ୟକ୍ତିଗତ ଭ୍ୟୁ"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"କାର୍ଯ୍ୟସ୍ଥଳୀ ସମ୍ବନ୍ଧିତ ଭ୍ୟୁ"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"କାର୍ଯ୍ୟସ୍ଥଳୀ ଆପଗୁଡ଼ିକ ସହ ସେୟାର୍ କରିପାରିବ ନାହିଁ"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"ବ୍ୟକ୍ତିଗତ ଆପଗୁଡ଼ିକ ସହ ସେୟାର୍ କରିପାରିବ ନାହିଁ"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"ଆପଣଙ୍କ IT ଆଡମିନ୍ ବ୍ୟକ୍ତିଗତ ଏବଂ ୱାର୍କ ପ୍ରୋଫାଇଲଗୁଡ଼ିକ ମଧ୍ୟରେ ସେୟାରିଂ ବ୍ଲକ୍ କରିଛନ୍ତି"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"କାର୍ଯ୍ୟସ୍ଥଳୀ ସମ୍ବନ୍ଧିତ ଆପଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିପାରିବେ ନାହିଁ"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"ଆପଣଙ୍କ IT ଆଡମିନ୍ ଆପଣଙ୍କୁ କାର୍ଯ୍ୟସ୍ଥଳୀ ସମ୍ବନ୍ଧିତ ଆପଗୁଡ଼ିକରେ ବ୍ୟକ୍ତିଗତ ବିଷୟବସ୍ତୁ ଦେଖିବାକୁ ଦିଅନ୍ତି ନାହିଁ"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"ବ୍ୟକ୍ତିଗତ ଆପଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ କରିପାରିବେ ନାହିଁ"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"ଆପଣଙ୍କ IT ଆଡମିନ୍ ଆପଣଙ୍କୁ ବ୍ୟକ୍ତିଗତ ଆପଗୁଡ଼ିକରେ କାର୍ଯ୍ୟସ୍ଥଳୀ ସମ୍ବନ୍ଧିତ ବିଷୟବସ୍ତୁ ଦେଖିବାକୁ ଦିଅନ୍ତି ନାହିଁ"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"ବିଷୟବସ୍ତୁ ସେୟାର୍ କରିବାକୁ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଚାଲୁ କରନ୍ତୁ"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"ବିଷୟବସ୍ତୁ ଦେଖିବାକୁ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଚାଲୁ କରନ୍ତୁ"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"କୌଣସି ଆପ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"ଚାଲୁ କରନ୍ତୁ"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"ଟେଲିଫୋନି କଲଗୁଡ଼ିକରେ ଅଡିଓ ରେକର୍ଡ କରନ୍ତୁ ବା ଚଲାନ୍ତୁ"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"ଏହି ଆପ୍ ଡିଫଲ୍ଟ ଡାଏଲର୍ ଆପ୍ଲିକେସନ୍ ଭାବରେ ଆସାଇନ୍ ହୋଇଥିଲେ ଟେଲିଫୋନି କଲଗୁଡ଼ିକରେ ଅଡିଓ ରେକର୍ଡ କରିବା ବା ଚଲାଇବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string>
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 8e5ae7d..4e64030 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -435,6 +435,9 @@
<string name="permdesc_camera" msgid="1354600178048761499">"ਇਹ ਐਪ ਕਿਸੇ ਵੀ ਸਮੇਂ ਕੈਮਰੇ ਨੂੰ ਵਰਤ ਕੇ ਤਸਵੀਰਾਂ ਖਿੱਚ ਸਕਦੀ ਹੈ ਅਤੇ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਰਿਕਾਰਡ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="permlab_systemCamera" msgid="3642917457796210580">"ਸਿਸਟਮ ਕੈਮਰੇ ਨੂੰ ਤਸਵੀਰਾਂ ਅਤੇ ਵੀਡੀਓ ਬਣਾਉਣ ਲਈ ਐਪਲੀਕੇਸ਼ਨ ਜਾਂ ਸੇਵਾ ਤੱਕ ਪਹੁੰਚ ਦਿਓ"</string>
<string name="permdesc_systemCamera" msgid="544730545441964482">"ਇਹ ਵਿਸ਼ੇਸ਼ ਅਧਿਕਾਰ ਸਿਸਟਮ ਐਪ ਕਿਸੇ ਵੇਲੇ ਵੀ ਸਿਸਟਮ ਕੈਮਰੇ ਨੂੰ ਵਰਤ ਕੇ ਤਸਵੀਰਾਂ ਖਿੱਚ ਸਕਦੀ ਹੈ ਅਤੇ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਰਿਕਾਰਡ ਕਰ ਸਕਦੀ ਹੈ। ਐਪ ਨੂੰ ਵੀ android.permission.CAMERA ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ।"</string>
+ <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"ਐਪਲੀਕੇਸ਼ਨ ਜਾਂ ਸੇਵਾ ਨੂੰ ਕੈਮਰਾ ਡੀਵਾਈਸਾਂ ਦੇ ਚਾਲੂ ਜਾਂ ਬੰਦ ਕੀਤੇ ਜਾਣ ਬਾਰੇ ਕਾਲਬੈਕ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ।"</string>
+ <!-- no translation found for permdesc_cameraOpenCloseListener (2002636131008772908) -->
+ <skip />
<string name="permlab_vibrate" msgid="8596800035791962017">"ਵਾਈਬ੍ਰੇਸ਼ਨ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ"</string>
<string name="permdesc_vibrate" msgid="8733343234582083721">"ਐਪ ਨੂੰ ਵਾਈਬ੍ਰੇਟਰ ਤੇ ਨਿਯੰਤਰਣ ਪਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permdesc_vibrator_state" msgid="7050024956594170724">"ਐਪ ਨੂੰ ਥਰਥਰਾਹਟ ਸਥਿਤੀ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿੰਦਾ ਹੈ।"</string>
@@ -448,6 +451,8 @@
<string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"ਕਾਲ ਕਰਨ ਦੇ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਐਪ ਨੂੰ ਇਸਦੀਆਂ ਕਾਲਾਂ ਨੂੰ ਸਿਸਟਮ ਰਾਹੀਂ ਰੂਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦੀ ਹੈ।"</string>
<string name="permlab_callCompanionApp" msgid="3654373653014126884">"ਸਿਸਟਮ ਰਾਹੀਂ ਕਾਲਾਂ ਦੇਖੋ ਅਤੇ ਕੰਟਰੋਲ ਕਰੋ।"</string>
<string name="permdesc_callCompanionApp" msgid="8474168926184156261">"ਐਪ ਨੂੰ ਡੀਵਾਈਸ \'ਤੇ ਜਾਰੀ ਕਾਲਾਂ ਦੇਖਣ ਅਤੇ ਕੰਟਰੋਲ ਕਰਨ ਦਿਓ। ਇਸ ਵਿੱਚ ਕਾਲਾਂ ਦੇ ਨੰਬਰਾਂ ਅਤੇ ਉਹਨਾਂ ਦੀ ਸਥਿਤੀ ਬਾਰੇ ਜਾਣਕਾਰੀ ਸ਼ਾਮਲ ਹੈ।"</string>
+ <string name="permlab_exemptFromAudioRecordRestrictions" msgid="1164725468350759486">"ਆਡੀਓ ਰਿਕਾਰਡ ਕਰਨ ਦੀਆਂ ਪਾਬੰਦੀਆਂ ਤੋਂ ਛੋਟ ਦਿਓ"</string>
+ <string name="permdesc_exemptFromAudioRecordRestrictions" msgid="2425117015896871976">"ਐਪ ਨੂੰ ਆਡੀਓ ਰਿਕਾਰਡ ਕਰਨ ਦੀ ਪਾਬੰਦੀਆਂ ਤੋਂ ਛੋਟ ਦਿਓ।"</string>
<string name="permlab_acceptHandover" msgid="2925523073573116523">"ਕਿਸੇ ਹੋਰ ਐਪ ਤੋਂ ਕਾਲ ਜਾਰੀ ਰੱਖੋ"</string>
<string name="permdesc_acceptHandovers" msgid="7129026180128626870">"ਐਪ ਨੂੰ ਉਹ ਕਾਲ ਜਾਰੀ ਰੱਖਣ ਦਿਓ ਜਿਸਨੂੰ ਹੋਰ ਐਪ ਤੋਂ ਚਾਲੂ ਕੀਤਾ ਗਿਆ ਸੀ।"</string>
<string name="permlab_readPhoneNumbers" msgid="5668704794723365628">"ਫ਼ੋਨ ਨੰਬਰ ਪੜ੍ਹੋ"</string>
@@ -1099,28 +1104,6 @@
<string name="deleteText" msgid="4200807474529938112">"ਮਿਟਾਓ"</string>
<string name="inputMethod" msgid="1784759500516314751">"ਇਨਪੁੱਟ ਵਿਧੀ"</string>
<string name="editTextMenuTitle" msgid="857666911134482176">"ਟੈਕਸਟ ਕਿਰਿਆਵਾਂ"</string>
- <string name="email" msgid="2503484245190492693">"ਈਮੇਲ ਖੋਲ੍ਹੋ"</string>
- <string name="email_desc" msgid="8291893932252173537">"ਚੁਣੇ ਹੋਏ ਪਤੇ \'ਤੇ ਈਮੇਲ ਭੇਜੋ"</string>
- <string name="dial" msgid="4954567785798679706">"ਕਾਲ ਕਰੋ"</string>
- <string name="dial_desc" msgid="3072967472129276617">"ਚੁਣੇ ਗਏ ਫ਼ੋਨ ਨੰਬਰ \'ਤੇ ਕਾਲ ਕਰੋ"</string>
- <string name="map" msgid="6865483125449986339">"ਨਕਸ਼ਾ ਖੋਲ੍ਹੋ"</string>
- <string name="map_desc" msgid="1068169741300922557">"ਚੁਣਿਆ ਗਿਆ ਪਤਾ ਨਕਸ਼ੇ \'ਤੇ ਦਿਖਾਓ"</string>
- <string name="browse" msgid="8692753594669717779">"ਖੋਲ੍ਹੋ"</string>
- <string name="browse_desc" msgid="5328523986921597700">"ਚੁਣਿਆ ਗਿਆ URL ਖੋਲ੍ਹੋ"</string>
- <string name="sms" msgid="3976991545867187342">"ਸੁਨੇਹਾ ਭੇਜੋ"</string>
- <string name="sms_desc" msgid="997349906607675955">"ਚੁਣੇ ਗਏ ਫ਼ੋਨ ਨੰਬਰ \'ਤੇ ਸੁਨੇਹਾ ਭੇਜੋ"</string>
- <string name="add_contact" msgid="7404694650594333573">"ਸ਼ਾਮਲ ਕਰੋ"</string>
- <string name="add_contact_desc" msgid="6419581556288775911">"ਸੰਪਰਕਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string>
- <string name="view_calendar" msgid="4274396845124626977">"ਦੇਖੋ"</string>
- <string name="view_calendar_desc" msgid="1739770773927245564">"ਕੈਲੰਡਰ ਵਿੱਚ ਚੁਣਿਆ ਗਿਆ ਸਮਾਂ ਦੇਖੋ"</string>
- <string name="add_calendar_event" msgid="5564364269553091740">"ਸਮਾਂ-ਸੂਚੀ ਬਣਾਓ"</string>
- <string name="add_calendar_event_desc" msgid="5827530672900331107">"ਚੁਣੇ ਗਏ ਸਮੇਂ ਲਈ ਇਵੈਂਟ ਦੀ ਸਮਾਂ-ਸੂਚੀ ਬਣਾਓ"</string>
- <string name="view_flight" msgid="2042802613849690108">"ਟਰੈਕ ਕਰੋ"</string>
- <string name="view_flight_desc" msgid="2802812586218764790">"ਚੁਣੀ ਗਈ ਉਡਾਣ ਨੂੰ ਟਰੈਕ ਕਰੋ"</string>
- <string name="translate" msgid="1416909787202727524">"ਅਨੁਵਾਦ ਕਰੋ"</string>
- <string name="translate_desc" msgid="4096225388385338322">"ਚੋਣਵੀਂ ਲਿਖਤ ਦਾ ਅਨੁਵਾਦ ਕਰੋ"</string>
- <string name="define" msgid="5214255850068764195">"ਪਰਿਭਾਸ਼ਾ ਦਿਓ"</string>
- <string name="define_desc" msgid="6916651934713282645">"ਚੋਣਵੀਂ ਲਿਖਤ ਦਾ ਅਨੁਵਾਦ ਕਰੋ"</string>
<string name="low_internal_storage_view_title" msgid="9024241779284783414">"ਸਟੋਰੇਜ ਦੀ ਜਗ੍ਹਾ ਖਤਮ ਹੋ ਰਹੀ ਹੈ"</string>
<string name="low_internal_storage_view_text" msgid="8172166728369697835">"ਕੁਝ ਸਿਸਟਮ ਫੰਕਸ਼ਨ ਕੰਮ ਨਹੀਂ ਵੀ ਕਰ ਸਕਦੇ"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"ਸਿਸਟਮ ਲਈ ਲੋੜੀਂਦੀ ਸਟੋਰੇਜ ਨਹੀਂ ਹੈ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡੇ ਕੋਲ 250MB ਖਾਲੀ ਜਗ੍ਹਾ ਹੈ ਅਤੇ ਮੁੜ-ਚਾਲੂ ਕਰੋ।"</string>
@@ -1259,7 +1242,6 @@
<string name="mobile_no_internet" msgid="4014455157529909781">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਕੋਲ ਇੰਟਰਨੈੱਟ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string>
<string name="other_networks_no_internet" msgid="6698711684200067033">"ਨੈੱਟਵਰਕ ਕੋਲ ਇੰਟਰਨੈੱਟ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string>
<string name="private_dns_broken_detailed" msgid="3709388271074611847">"ਨਿੱਜੀ ਡੋਮੇਨ ਨਾਮ ਪ੍ਰਣਾਲੀ (DNS) ਸਰਵਰ \'ਤੇ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ"</string>
- <string name="captive_portal_logged_in_detailed" msgid="3897392681039344376">"ਕਨੈਕਟ ਹੋਏ"</string>
<string name="network_partial_connectivity" msgid="4791024923851432291">"<xliff:g id="NETWORK_SSID">%1$s</xliff:g> ਕੋਲ ਸੀਮਤ ਕਨੈਕਟੀਵਿਟੀ ਹੈ"</string>
<string name="network_partial_connectivity_detailed" msgid="5741329444564575840">"ਫਿਰ ਵੀ ਕਨੈਕਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="network_switch_metered" msgid="1531869544142283384">"ਬਦਲਕੇ <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ਲਿਆਂਦਾ ਗਿਆ"</string>
@@ -1631,14 +1613,21 @@
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"ਕੀ ਵੌਲਿਊਮ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੇ ਪੱਧਰ ਤੋਂ ਵਧਾਉਣੀ ਹੈ?\n\nਲੰਮੇ ਸਮੇਂ ਤੱਕ ਉੱਚ ਵੌਲਿਊਮ ਤੇ ਸੁਣਨ ਨਾਲ ਤੁਹਾਡੀ ਸੁਣਨ ਸ਼ਕਤੀ ਨੂੰ ਨੁਕਸਾਨ ਪਹੁੰਚ ਸਕਦਾ ਹੈ।"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"ਕੀ ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਵਰਤਣਾ ਹੈ?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ਸ਼ਾਰਟਕੱਟ ਚਾਲੂ ਹੋਣ \'ਤੇ, ਕਿਸੇ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ ਬਟਨਾਂ ਨੂੰ 3 ਸਕਿੰਟ ਲਈ ਦਬਾ ਕੇ ਰੱਖੋ।"</string>
- <!-- no translation found for accessibility_select_shortcut_menu_title (7310194076629867377) -->
- <skip />
- <!-- no translation found for accessibility_edit_shortcut_menu_button_title (6096484087245145325) -->
- <skip />
- <!-- no translation found for accessibility_edit_shortcut_menu_volume_title (4849108668454490699) -->
- <skip />
+ <string name="accessibility_enable_service_title" msgid="3931558336268541484">"ਕੀ <xliff:g id="SERVICE">%1$s</xliff:g> ਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਦਾ ਪੂਰਾ ਕੰਟਰੋਲ ਦੇਣਾ ਹੈ?"</string>
+ <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"ਜੇਕਰ ਤੁਸੀਂ <xliff:g id="SERVICE">%1$s</xliff:g> ਚਾਲੂ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਇਨਕ੍ਰਿਪਸ਼ਨ ਦਾ ਵਿਸਤਾਰ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰੇਗਾ।"</string>
+ <string name="accessibility_service_warning_description" msgid="291674995220940133">"ਪੂਰਾ ਕੰਟਰੋਲ ਉਹਨਾਂ ਐਪਾਂ ਲਈ ਢੁਕਵਾਂ ਹੈ ਜੋ ਪਹੁੰਚਯੋਗਤਾ ਸੰਬੰਧੀ ਲੋੜਾਂ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕਰਦੀਆਂ ਹਨ, ਪਰ ਜ਼ਿਆਦਾਤਰ ਐਪਾਂ ਲਈ ਢੁਕਵਾਂ ਨਹੀਂ ਹੁੰਦਾ।"</string>
+ <string name="accessibility_service_screen_control_title" msgid="190017412626919776">"ਸਕ੍ਰੀਨ ਨੂੰ ਦੇਖੋ ਅਤੇ ਕੰਟਰੋਲ ਕਰੋ"</string>
+ <string name="accessibility_service_screen_control_description" msgid="6946315917771791525">"ਇਹ ਸਕ੍ਰੀਨ \'ਤੇ ਸਾਰੀ ਸਮੱਗਰੀ ਪੜ੍ਹ ਸਕਦੀ ਹੈ ਅਤੇ ਸਮੱਗਰੀ ਨੂੰ ਦੂਜੀਆਂ ਐਪਾਂ ਦੇ ਉੱਪਰ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="accessibility_service_action_perform_title" msgid="779670378951658160">"ਕਾਰਵਾਈਆਂ ਦੇਖੋ ਅਤੇ ਕਰੋ"</string>
+ <string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"ਇਹ ਕਿਸੇ ਐਪ ਜਾਂ ਹਾਰਡਵੇਅਰ ਸੈਂਸਰ ਦੇ ਨਾਲ ਤੁਹਾਡੀਆਂ ਅੰਤਰਕਿਰਿਆਵਾਂ ਨੂੰ ਟਰੈਕ ਕਰ ਸਕਦੀ ਹੈ, ਅਤੇ ਤੁਹਾਡੀ ਤਰਫ਼ੋਂ ਐਪਾਂ ਦੇ ਨਾਲ ਅੰਤਰਕਿਰਿਆ ਕਰ ਸਕਦੀ ਹੈ।"</string>
+ <string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"ਕਰਨ ਦਿਓ"</string>
+ <string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"ਮਨ੍ਹਾਂ ਕਰੋ"</string>
+ <string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ਕਿਸੇ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਵਰਤਣਾ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਉਸ \'ਤੇ ਟੈਪ ਕਰੋ:"</string>
+ <string name="accessibility_edit_shortcut_menu_button_title" msgid="2062625107544922685">"ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨਾਲ ਵਰਤਣ ਲਈ ਐਪਾਂ ਚੁਣੋ"</string>
+ <string name="accessibility_edit_shortcut_menu_volume_title" msgid="2831697927653841895">"ਅਵਾਜ਼ ਕੁੰਜੀ ਸ਼ਾਰਟਕੱਟ ਨਾਲ ਵਰਤਣ ਲਈ ਐਪਾਂ ਚੁਣੋ"</string>
+ <string name="accessibility_uncheck_legacy_item_warning" msgid="8047830891064817447">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ"</string>
<string name="edit_accessibility_shortcut_menu_button" msgid="8885752738733772935">"ਸ਼ਾਰਟਕੱਟਾਂ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
- <string name="cancel_accessibility_shortcut_menu_button" msgid="1817413122335452474">"ਰੱਦ ਕਰੋ"</string>
+ <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"ਹੋ ਗਿਆ"</string>
<string name="disable_accessibility_shortcut" msgid="5806091378745232383">"ਸ਼ਾਰਟਕੱਟ ਬੰਦ ਕਰੋ"</string>
<string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"ਸ਼ਾਰਟਕੱਟ ਦੀ ਵਰਤੋਂ ਕਰੋ"</string>
<string name="color_inversion_feature_name" msgid="326050048927789012">"ਰੰਗ ਦੀ ਉਲਟੀ ਤਰਤੀਬ"</string>
@@ -1646,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਨੇ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਨੂੰ ਚਾਲੂ ਕੀਤਾ"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਨੇ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਨੂੰ ਬੰਦ ਕੀਤਾ"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਦੋਵੇਂ ਅਵਾਜ਼ ਕੁੰਜੀਆਂ ਨੂੰ 3 ਸਕਿੰਟਾਂ ਲਈ ਦਬਾਈ ਰੱਖੋ"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"ਵੱਡਦਰਸ਼ੀਕਰਨ"</string>
<string name="user_switched" msgid="7249833311585228097">"ਮੌਜੂਦਾ ਉਪਭੋਗਤਾ <xliff:g id="NAME">%1$s</xliff:g>।"</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> ਤੇ ਸਵਿਚ ਕਰ ਰਿਹਾ ਹੈ…"</string>
@@ -1859,8 +1860,7 @@
<string name="default_notification_channel_label" msgid="3697928973567217330">"ਗੈਰ-ਸ਼੍ਰੇਣੀਕਿਰਤ"</string>
<string name="importance_from_user" msgid="2782756722448800447">"ਤੁਸੀਂ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਦੀ ਮਹੱਤਤਾ ਸੈੱਟ ਕੀਤੀ।"</string>
<string name="importance_from_person" msgid="4235804979664465383">"ਇਹ ਸ਼ਾਮਲ ਲੋਕਾਂ ਦੇ ਕਾਰਨ ਮਹੱਤਵਪੂਰਨ ਹੈ।"</string>
- <!-- no translation found for notification_history_title_placeholder (7748630986182249599) -->
- <skip />
+ <string name="notification_history_title_placeholder" msgid="7748630986182249599">"ਵਿਉਂਤੀ ਐਪ ਸੂਚਨਾ"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"ਕੀ <xliff:g id="APP">%1$s</xliff:g> ਨੂੰ <xliff:g id="ACCOUNT">%2$s</xliff:g> ਨਾਲ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣੀ ਹੈ (ਇਸ ਖਾਤੇ ਨਾਲ ਇੱਕ ਵਰਤੋਂਕਾਰ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਮੌਜੂਦ ਹੈ)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"ਕੀ <xliff:g id="APP">%1$s</xliff:g> ਨੂੰ <xliff:g id="ACCOUNT">%2$s</xliff:g> ਨਾਲ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣੀ ਹੈ?"</string>
<string name="language_selection_title" msgid="52674936078683285">"ਇੱਕ ਭਾਸ਼ਾ ਸ਼ਾਮਲ ਕਰੋ"</string>
@@ -2032,30 +2032,40 @@
<string name="accessibility_system_action_accessibility_menu_label" msgid="8436484650391125184">"ਪਹੁੰਚਯੋਗਤਾ ਮੀਨੂ"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਦੀ ਸੁਰਖੀ ਪੱਟੀ।"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ਨੂੰ ਪ੍ਰਤਿਬੰਧਿਤ ਖਾਨੇ ਵਿੱਚ ਪਾਇਆ ਗਿਆ ਹੈ"</string>
+ <!-- no translation found for conversation_single_line_name_display (8958948312915255999) -->
+ <skip />
+ <!-- no translation found for conversation_title_fallback_one_to_one (1980753619726908614) -->
+ <skip />
+ <!-- no translation found for conversation_title_fallback_group_chat (456073374993104303) -->
+ <skip />
<string name="resolver_personal_tab" msgid="2051260504014442073">"ਨਿੱਜੀ"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"ਕੰਮ"</string>
- <!-- no translation found for resolver_personal_tab_accessibility (5739524949153091224) -->
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
<skip />
- <!-- no translation found for resolver_work_tab_accessibility (4753168230363802734) -->
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
<skip />
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਨਾਲ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"ਨਿੱਜੀ ਐਪਾਂ ਨਾਲ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
- <!-- no translation found for resolver_cant_share_cross_profile_explanation (5556640604460901386) -->
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
<skip />
- <!-- no translation found for resolver_cant_access_work_apps (375634344111233790) -->
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
<skip />
- <!-- no translation found for resolver_cant_access_work_apps_explanation (3958762224516867388) -->
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
<skip />
- <!-- no translation found for resolver_cant_access_personal_apps (1953215925406474177) -->
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
<skip />
- <!-- no translation found for resolver_cant_access_personal_apps_explanation (1725572276741281136) -->
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
<skip />
- <!-- no translation found for resolver_turn_on_work_apps_share (619263911204978175) -->
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
<skip />
- <!-- no translation found for resolver_turn_on_work_apps_view (3073389230905543680) -->
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
<skip />
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"ਕੋਈ ਐਪ ਉਪਲਬਧ ਨਹੀਂ"</string>
- <!-- no translation found for resolver_switch_on_work (2873009160846966379) -->
+ <string name="resolver_switch_on_work" msgid="2873009160846966379">"ਚਾਲੂ ਕਰੋ"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
<skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"ਟੈਲੀਫ਼ੋਨੀ ਕਾਲਾਂ ਵਿੱਚ ਰਿਕਾਰਡ ਕਰੋ ਜਾਂ ਆਡੀਓ ਚਲਾਓ"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"ਇਹ ਇਸ ਐਪ ਨੂੰ, ਪੂਰਵ-ਨਿਰਧਾਰਤ ਡਾਇਲਰ ਐਪਲੀਕੇਸ਼ਨ ਵਜੋਂ ਜਿੰਮੇ ਲਾਏ ਜਾਣ \'ਤੇ, ਟੈਲੀਫ਼ੋਨੀ ਕਾਲਾਂ ਵਿੱਚ ਰਿਕਾਰਡ ਕਰਨ ਜਾਂ ਆਡੀਓ ਚਲਾਉਣ ਦਿੰਦਾ ਹੈ।"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 76a5bd6..da264f2 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1679,6 +1679,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Skrót ułatwień dostępu wyłączył usługę <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Skrót ułatwień dostępu wyłączył usługę <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Naciśnij i przytrzymaj oba przyciski głośności przez trzy sekundy, by użyć usługi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Powiększenie"</string>
<string name="user_switched" msgid="7249833311585228097">"Bieżący użytkownik: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Przełączam na użytkownika <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2093,19 +2105,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Rozmowa grupowa"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Osobiste"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Do pracy"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Widok osobisty"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Widok służbowy"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Nie można udostępnić aplikacji do pracy"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Nie można udostępnić aplikacji osobistej"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Administrator IT zablokował udostępnianie danych między profilami osobistymi a profilami do pracy"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Brak dostępu do aplikacji do pracy"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Administrator IT nie pozwala Ci wyświetlać treści osobistych w aplikacjach do pracy"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Brak dostępu do aplikacji osobistych"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Administrator IT nie pozwala Ci wyświetlać treści służbowych w aplikacjach osobistych"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Włącz profil do pracy, by udostępnić treści"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Włącz profil do pracy, by wyświetlić treści"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Brak dostępnych aplikacji"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Włącz"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Nagrywanie lub odtwarzanie dźwięku podczas połączeń telefonicznych"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Zezwala na odtwarzanie dźwięku podczas rozmów telefonicznych przez aplikację przypisaną jako domyślnie wybierającą numery."</string>
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 9f1a341..564e9ff 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"O atalho de acessibilidade ativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"O atalho de acessibilidade desativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Toque nos dois botões de volume e os mantenha pressionados por três segundo para usar o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ampliação"</string>
<string name="user_switched" msgid="7249833311585228097">"Usuário atual <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Alternando para <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa em grupo"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Pessoal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Trabalho"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visualização pessoal"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Visualização de trabalho"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Não é possível compartilhar com apps de trabalho"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Não é possível compartilhar com apps pessoais"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Seu administrador de TI bloqueou o compartilhamento entre perfis pessoais e de trabalho"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Falha ao acessar apps de trabalho"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Seu administrador de TI não permite que você veja conteúdo pessoal em apps de trabalho"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Falha ao acessar apps pessoais"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Seu administrador de TI não permite que você veja conteúdo de trabalho em apps pessoais"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Ative o perfil de trabalho para compartilhar conteúdo"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Ative o perfil de trabalho para ver conteúdo"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Nenhum app disponível"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Ativar"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Gravar ou tocar áudio em chamadas telefônicas"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Permitir que esse app grave ou toque áudio em chamadas telefônicas quando for usado como aplicativo discador padrão."</string>
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index bc74ffb..27286de 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"O Atalho de acessibilidade ativou o serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"O Atalho de acessibilidade desativou o serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Prima sem soltar as teclas de volume durante três segundos para utilizar o serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g>."</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ampliação"</string>
<string name="user_switched" msgid="7249833311585228097">"<xliff:g id="NAME">%1$s</xliff:g> do utilizador atual."</string>
<string name="user_switching_message" msgid="1912993630661332336">"A mudar para <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa de grupo"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Pessoal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Trabalho"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Vista pessoal"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Vista de trabalho"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Não é possível partilhar com apps de trabalho."</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Não é possível partilhar com apps pessoais."</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"O seu administrador de TI bloqueou a partilha entre o perfil de trabalho e pessoal."</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Não é possível aceder a apps de trabalho"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"O seu administrador de TI não lhe permite ver conteúdo pessoal em apps de trabalho"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Não é possível aceder a apps pessoais"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"O seu administrador de TI não lhe permite ver conteúdo de trabalho em apps pessoais"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Ative o perfil de trabalho para partilhar conteúdo."</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Ative o perfil de trabalho para ver conteúdo."</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Nenhuma app disponível."</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Ativar"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Gravar ou reproduzir áudio em chamadas telefónicas"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Permite que esta app, quando atribuída como uma aplicação de telefone predefinida, grave ou reproduza áudio em chamadas telefónicas."</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 9f1a341..564e9ff 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"O atalho de acessibilidade ativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"O atalho de acessibilidade desativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Toque nos dois botões de volume e os mantenha pressionados por três segundo para usar o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ampliação"</string>
<string name="user_switched" msgid="7249833311585228097">"Usuário atual <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Alternando para <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversa em grupo"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Pessoal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Trabalho"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Visualização pessoal"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Visualização de trabalho"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Não é possível compartilhar com apps de trabalho"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Não é possível compartilhar com apps pessoais"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Seu administrador de TI bloqueou o compartilhamento entre perfis pessoais e de trabalho"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Falha ao acessar apps de trabalho"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Seu administrador de TI não permite que você veja conteúdo pessoal em apps de trabalho"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Falha ao acessar apps pessoais"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Seu administrador de TI não permite que você veja conteúdo de trabalho em apps pessoais"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Ative o perfil de trabalho para compartilhar conteúdo"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Ative o perfil de trabalho para ver conteúdo"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Nenhum app disponível"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Ativar"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Gravar ou tocar áudio em chamadas telefônicas"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Permitir que esse app grave ou toque áudio em chamadas telefônicas quando for usado como aplicativo discador padrão."</string>
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 0c80fa5..9f20a6b 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1657,6 +1657,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Comanda rapidă de accesibilitate a activat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Comanda rapidă de accesibilitate a dezactivat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Apăsați ambele butoane de volum timp de trei secunde pentru a folosi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Mărire"</string>
<string name="user_switched" msgid="7249833311585228097">"Utilizator curent: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Se comută la <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2059,19 +2071,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Conversație de grup"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Serviciu"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Afișarea conținutului personal"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Afișarea conținutului de lucru"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Nu se poate trimite către aplicații pentru lucru"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Nu se poate trimite către aplicații personale"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Administratorul IT a blocat trimiterea între profilurile personale și de serviciu"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Nu se pot accesa aplicațiile pentru lucru"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Administratorul IT nu vă permite să afișați conținutul personal în aplicațiile pentru lucru"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Nu se pot accesa aplicațiile personale"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Administratorul IT nu vă permite să afișați conținutul de lucru în aplicațiile personale"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Activați profilul de serviciu pentru a distribui conținut"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Activați profilul de serviciu pentru a vedea conținutul"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Nicio aplicație disponibilă"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Activați"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Înregistrează sau redă conținut audio în apelurile telefonice"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Permite acestei aplicații, atunci când este setată ca aplicație telefon prestabilită, să înregistreze sau să redea conținut audio în apelurile telefonice."</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 474dbba..89c6376 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1679,6 +1679,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Сервис <xliff:g id="SERVICE_NAME">%1$s</xliff:g> включен"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Сервис <xliff:g id="SERVICE_NAME">%1$s</xliff:g> отключен"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Чтобы использовать сервис \"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>\", нажмите и удерживайте обе клавиши громкости в течение трех секунд."</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Увеличение"</string>
<string name="user_switched" msgid="7249833311585228097">"Выбран аккаунт пользователя <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Смена профиля на <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2093,19 +2105,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групповой чат"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Личный"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Рабочий"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Просмотр личных данных"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Просмотр рабочих данных"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Нельзя обмениваться данными с рабочими приложениями"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Нельзя обмениваться данными с личными приложениями"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Обмен данными между личным и рабочим профилями заблокирован системным администратором."</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Нет доступа к рабочим приложениям"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Просмотр личных данных в рабочих приложениях заблокирован системным администратором."</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Нет доступа к личным приложениям"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Просмотр рабочих данных в личных приложениях заблокирован системным администратором."</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Чтобы поделиться данными, включите рабочий профиль."</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Чтобы посмотреть данные, включите рабочий профиль."</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Нет доступных приложений"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Включить"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Запись и воспроизведение телефонных разговоров"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Если это приложение используется для звонков по умолчанию, оно сможет записывать и воспроизводить телефонные разговоры."</string>
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index d7e65e6..90a06ff 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -1637,6 +1637,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"ප්රවේශ්යතා කෙටි මග <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ක්රියාත්මක කරන ලදී"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"ප්රවේශ්යතා කෙටි මග <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ක්රියාවිරහිත කරන ලදී"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> භාවිත කිරීමට හඬ පරිමා යතුරු දෙකම තත්පර තුනකට ඔබාගෙන සිටින්න"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"විශාලනය"</string>
<string name="user_switched" msgid="7249833311585228097">"දැනට සිටින පරිශීලකයා <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> වෙත මාරු කරමින්…"</string>
@@ -2027,19 +2039,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"සමූහ සංවාදය"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"පුද්ගලික"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"කාර්යාල"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"පෞද්ගලික දසුන"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"කාර්යාල දසුන"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"කාර්යාල යෙදුම් සමග බෙදා ගැනීමට නොහැකිය"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"පෞද්ගලික යෙදුම් සමග බෙදා ගැනීමට නොහැකිය"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"ඔබේ IT පරිපාලක පෞද්ගලික සහ කාර්යාල පැතිකඩ අතර බෙදා ගැනීම අවහිර කළා"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"කාර්යාල යෙදුම් වෙත ප්රවේශ වීමට නොහැකිය"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"ඔබේ IT පරිපාලක ඔබට කාර්යාල යෙදුම් හි පෞද්ගලික අන්තර්ගත බැලීමට ඉඩ නොදේ"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"පෞද්ගලික යෙදුම් වෙත ප්රවේශ වීමට නොහැකිය"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"ඔබේ IT පරිපාලක ඔබට පෞද්ගලික යෙදුම් හි කාර්යාල අන්තර්ගත බැලීමට ඉඩ නොදේ"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"අන්තර්ගත බෙදා ගැනීමට කාර්යාල පැතිකඩ ක්රියාත්මක කරන්න"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"අන්තර්ගත බැලීමට කාර්යාල පැතිකඩ ක්රියාත්මක කරන්න"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"ලබා ගත හැකි යෙදුම් නැත"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"ක්රියාත්මක කරන්න"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"ටෙලිෆොනි ඇමතුම්වලින් ඕඩියෝ පටිගත කරන්න නැතහොත් වාදනය කරන්න"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"පෙරනිමි ඩයලන යෙදුමක් ලෙස පැවරූ විට, මෙම යෙදුමට ටෙලිෆොනි ඇමතුම්වලින් ඕඩියෝ පටිගත කිරීමට හෝ වාදනය කිරීමට ඉඩ දෙයි."</string>
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index a851cad..eee1dfb 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1679,6 +1679,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Skratka dostupnosti zapla službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Skratka dostupnosti vypla službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Ak chcete používať službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, pridržte tri sekundy oba klávesy hlasitosti"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Priblíženie"</string>
<string name="user_switched" msgid="7249833311585228097">"Aktuálny používateľ je <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Prepína sa na účet <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2093,19 +2105,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Skupinová konverzácia"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Osobné"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Práca"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Osobné zobrazenie"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Pracovné zobrazenie"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Nedá sa zdieľa s pracovnými aplikáciami"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Nedá sa zdieľať s osobnými aplikáciami"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Správca IT zablokoval zdieľanie medzi osobnými a pracovnými profilmi"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Pracovné aplikácie sú nedostupné"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Správca IT vám neumožňuje zobrazovať osobný obsah v pracovných aplikáciách"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Osobné aplikácie sú nedostupné"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Správca IT vám neumožňuje zobrazovať pracovný obsah v osobných aplikáciách"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Zapnúť pracovný profil na zdieľanie obsahu"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Zapnúť pracovný profil na zobrazovanie obsahu"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"K dispozícii nie sú žiadne aplikácie"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Zapnúť"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Nahrávanie alebo prehrávanie zvuku počas telefonických hovorov"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Povoľuje tejto aplikácii, keď je priradená ako predvolená aplikácia na vytáčanie, nahrávať alebo prehrávať zvuk počas telefonických hovorov."</string>
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index d1eb9a9b..e117ea4 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1679,6 +1679,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Bližnjica funkcij za ljudi s posebnimi potrebami je vklopila <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Bližnjica funkcij za ljudi s posebnimi potrebami je izklopila <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Za uporabo storitve <xliff:g id="SERVICE_NAME">%1$s</xliff:g> pritisnite obe tipki za glasnost in ju pridržite tri sekunde"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Povečava"</string>
<string name="user_switched" msgid="7249833311585228097">"Trenutni uporabnik <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Preklop na uporabnika <xliff:g id="NAME">%1$s</xliff:g> …"</string>
@@ -2093,19 +2105,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Skupinski pogovor"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Osebno"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Služba"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Pogled osebnega profila"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Pogled delovnega profila"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Deljenje z delovnimi aplikacijami ni mogoče"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Deljenje z osebnimi aplikacijami ni mogoče"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Skrbnik za IT je blokiral deljenje med osebnimi in delovnimi profili"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Dostop do delovnih aplikacij ni mogoč"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Skrbnik za IT vam ne dovoli ogleda vsebine osebnega profila v delovnih aplikacijah"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Dostop do osebnih aplikacij ni mogoč"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Skrbnik za IT vam ne dovoli ogleda vsebine delovnega profila v osebnih aplikacijah"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Vklopite delovni profil, če želite deliti vsebino"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Vklopite delovni profil, če si želite ogledati vsebino"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Na voljo ni nobena aplikacija"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Vklop"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Snemanje ali predvajanje zvoka med telefonskimi klici"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Tej aplikaciji dovoljuje snemanje ali predvajanje zvoka med telefonskimi klici, ko je nastavljena kot privzeta aplikacija za klicanje."</string>
</resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 2f45551..2ba9842 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Shkurtorja e qasshmërisë e aktivizoi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Shkurtorja e qasshmërisë e çaktivizoi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Shtyp dhe mbaj shtypur të dy butonat e volumit për tre sekonda për të përdorur <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Zmadhimi"</string>
<string name="user_switched" msgid="7249833311585228097">"Emri i përdoruesit aktual: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="user_switching_message" msgid="1912993630661332336">"Po kalon në <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Bisedë në grup"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Puna"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Pamja personale"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Pamja e punës"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Nuk mund të ndash me aplikacionet e punës"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Nuk mund të ndash me aplikacionet personale"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Administratori yt i teknologjisë së informacionit ka bllokuar ndarjen mes profileve personale dhe atyre të punës"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Nuk ka qasje tek aplikacionet e punës"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Administratori yt i teknologjisë së informacionit nuk të lejon të shikosh përmbajtjen personale në aplikacionet e punës"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Nuk ka qasje tek aplikacionet personale"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Administratori yt i teknologjisë së informacionit nuk të lejon të shikosh përmbajtjen e punës në aplikacionet personale"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Aktivizo profilin për të ndarë përmbajtjen"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Aktivizo profilin për të parë përmbajtjen"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Nuk ofrohet asnjë aplikacion"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Aktivizo"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Të regjistrojë ose luajë audio në telefonata"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Lejon këtë aplikacion, kur caktohet si aplikacioni i parazgjedhur i formuesit të numrave, të regjistrojë ose luajë audio në telefonata."</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 6dfdd69..f79d7bc3 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1657,6 +1657,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Пречица за приступачност је укључила услугу <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Пречица за приступачност је искључила услугу <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Притисните и задржите оба тастера за јачину звука три секунде да бисте користили <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Увећање"</string>
<string name="user_switched" msgid="7249833311585228097">"Актуелни корисник <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Пребацивање на <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2059,19 +2071,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Групна конверзација"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Лични"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Пословни"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Лични приказ"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Приказ за посао"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Не можете да делите садржај са апликацијама за посао"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Не можете да делите садржај са личним апликацијама"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"ИТ администратор је блокирао дељење између личних апликација и профила за Work"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Приступ апликацијама за посао није могућ"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"ИТ администратор вам не дозвољава да у апликацијама за посао прегледате лични садржај"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Приступ личним апликацијама није могућ"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"ИТ администратор вам не дозвољава да у личним апликацијама прегледате садржај за посао"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Укључите профил за Work да бисте делили садржај"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Укључите профил за Work да бисте прегледали садржај"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Нема доступних апликација"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Укључи"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Снимање или пуштање звука у телефонским позивима"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Омогућава овој апликацији, када је додељена као подразумевана апликација за позивање, да снима или пушта звук у телефонским позивима."</string>
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index ccc62bb..b9adfb8 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> aktiverades av Aktivera tillgänglighet snabbt"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> inaktiverades av Aktivera tillgänglighet snabbt"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Tryck och håll båda volymknapparna i tre sekunder för att använda <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Förstoring"</string>
<string name="user_switched" msgid="7249833311585228097">"Nuvarande användare: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Byter till <xliff:g id="NAME">%1$s</xliff:g> …"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Gruppkonversation"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Privat"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Jobb"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personlig vy"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Jobbvy"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Det går inte att dela med jobbappar"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Det går inte att dela med personliga appar"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"IT-administratören har blockerat delning mellan personliga profiler och jobbprofiler"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Ingen åtkomst till jobbappar"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"IT-administratören låter dig inte visa personligt innehåll i jobbappar"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Ingen åtkomst till personliga appar"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"IT-administratören låter dig inte visa jobbinnehåll i personliga appar"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Aktivera jobbprofilen för att dela innehåll"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Aktivera jobbprofilen för att visa innehåll"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Det finns inga tillgängliga appar"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Aktivera"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Spela in och spela upp ljud i telefonsamtal"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Tillåter appen att spela in och spela upp ljud i telefonsamtal när den har angetts som standardapp för uppringningsfunktionen."</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 5466285..eb615e8 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Njia ya mkato ya ufikivu imewasha <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Njia ya mkato ya ufikivu imezima <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Bonyeza na ushikilie vitufe vyote viwili vya sauti kwa sekunde tatu ili utumie <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ukuzaji"</string>
<string name="user_switched" msgid="7249833311585228097">"Mtumiaji wa sasa <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Inabadili kwenda <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Mazungumzo ya Kikundi"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Binafsi"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Kazini"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Mwonekano wa binafsi"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Mwonekano wa kazini"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Imeshindwa kushiriki na programu za kazini"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Imeshindwa kushiriki na programu za binafsi"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Msimamizi wako wa TEHAMA amezuia kushiriki kati ya wasifu wa binafsi na wa kazini"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Imeshindwa kufikia programu za kazini"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Msimamizi wako wa TEHAMA hakuruhusu uangalie maudhui ya binafsi katika programu za kazini"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Imeshindwa kufikia programu za binafsi"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Msimamizi wako wa TEHAMA hakuruhusu uangalie maudhui ya kazi katika programu za binafsi"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Washa wasifu wa kazini ili ushiriki maudhui"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Washa wasifu wa kazini ili uangalie maudhui"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Hakuna programu zinazopatikana"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Washa"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Kurekodi au kucheza sauti katika simu"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Huruhusu programu hii, wakati imekabidhiwa kuwa programu chaguomsingi ya kipiga simu, kurekodi au kucheza sauti katika simu."</string>
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 9aac709..8976fe1 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"యాక్సెస్ సామర్థ్య షార్ట్కట్ ద్వారా <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆన్ చేయబడింది"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"యాక్సెస్ సామర్థ్య షార్ట్కట్ ద్వారా <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆఫ్ చేయబడింది"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g>ని ఉపయోగించడానికి వాల్యూమ్ కీలు రెండింటినీ 3 సెకన్లు నొక్కి ఉంచండి"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"మాగ్నిఫికేషన్"</string>
<string name="user_switched" msgid="7249833311585228097">"ప్రస్తుత వినియోగదారు <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g>కి మారుస్తోంది…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"గ్రూప్ సంభాషణ"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"వ్యక్తిగతం"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"కార్యాలయం"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"వ్యక్తిగత వీక్షణ"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"పని వీక్షణ"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"వర్క్ యాప్లతో షేర్ చేయడం సాధ్యపడదు"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"వ్యక్తిగత యాప్లతో షేర్ చేయడం సాధ్యపడదు"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"వ్యక్తిగత మరియు కార్యాలయ ప్రొఫైల్ల మధ్య షేర్ చేయడాన్ని మీ IT అడ్మిన్ బ్లాక్ చేశారు"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"కార్యాలయ యాప్లను యాక్సెస్ చేయడం సాధ్యపడలేదు"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"కార్యాలయ యాప్లలో వ్యక్తిగత కంటెంట్ను చూడటాన్ని మీ IT అడ్మిన్ అనుమతించరు"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"వ్యక్తిగత యాప్లను యాక్సెస్ చేయలేకపోతున్నాను"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"వ్యక్తిగత యాప్లలో పని కంటెంట్ను చూడటాన్ని మీ IT అడ్మిన్ అనుమతించరు"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"కంటెంట్ను షేర్ చేయడానికి కార్యాలయ ప్రొఫైల్ను ఆన్ చేయండి"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"కంటెంట్ను చూడటానికి కార్యాలయ ప్రొఫైల్ను ఆన్ చేయండి"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"యాప్లు ఏవీ అందుబాటులో లేవు"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"ఆన్ చేయి"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"టెలిఫోనీ కాల్స్లో రికార్డ్ చేయండి లేదా ఆడియో ప్లే చేయండి"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"డిఫాల్ట్ డయలర్ యాప్గా కేటాయించినప్పుడు, టెలిఫోనీ కాల్స్లో రికార్డ్ చేయడానికి లేదా ఆడియో ప్లే చేయడానికి ఈ యాప్ను అనుమతిస్తుంది."</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 780eafc..1cff475 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"ทางลัดการเข้าถึงเปิด <xliff:g id="SERVICE_NAME">%1$s</xliff:g> แล้ว"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"ทางลัดการเข้าถึงปิด <xliff:g id="SERVICE_NAME">%1$s</xliff:g> แล้ว"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"กดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มค้างไว้ 3 วินาทีเพื่อใช้ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"การขยาย"</string>
<string name="user_switched" msgid="7249833311585228097">"ผู้ใช้ปัจจุบัน <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="user_switching_message" msgid="1912993630661332336">"กำลังเปลี่ยนเป็น <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"บทสนทนากลุ่ม"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"ส่วนตัว"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"งาน"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"มุมมองส่วนตัว"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ดูงาน"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"แชร์ด้วยแอปงานไม่ได้"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"แชร์ด้วยแอปส่วนตัวไม่ได้"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"ผู้ดูแลระบบไอทีบล็อกการแชร์ระหว่างโปรไฟล์ส่วนตัวและโปรไฟล์งาน"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"เข้าถึงแอปงานไม่ได้"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"ผู้ดูแลระบบไอทีไม่อนุญาตให้คุณดูเนื้อหาส่วนตัวในแอปงาน"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"เข้าถึงแอปส่วนตัวไม่ได้"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"ผู้ดูแลระบบไอทีไม่อนุญาตให้คุณดูเนื้อหางานในแอปส่วนตัว"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"เปิดโปรไฟล์งานเพื่อแชร์เนื้อหา"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"เปิดโปรไฟล์งานเพื่อดูเนื้อหา"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"ไม่มีแอป"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"เปิด"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"บันทึกหรือเปิดเสียงในสายโทรศัพท์"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"อนุญาตให้แอปนี้ (เมื่อกำหนดให้เป็นแอปโทรออกเริ่มต้น) บันทึกหรือเปิดเสียงในสายโทรศัพท์ได้"</string>
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 41664a0..bdabf88 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Na-on ng Shortcut sa Accessibility ang <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Na-off ng Shortcut sa Accessibility ang <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Pindutin nang matagal ang parehong volume key sa loob ng tatlong segundo para magamit ang <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Pag-magnify"</string>
<string name="user_switched" msgid="7249833311585228097">"Kasalukuyang user <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Lumilipat kay <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Panggrupong Pag-uusap"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Personal"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Trabaho"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Personal na view"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"View ng trabaho"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Hindi puwedeng magbahagi sa mga app para sa trabaho"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Hindi puwedeng magbahagi sa mga personal na app"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Na-block ng iyong IT admin ang pagbabahagi sa pagitan ng mga personal na profile at profile sa trabaho"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Hindi ma-access ang mga app para sa trabaho"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Hindi ka pinapayagan ng iyong IT admin na tingnan ang personal na content sa mga app para sa trabaho"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Hindi ma-access ang mga personal na app"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Hindi ka pinapayagan ng iyong IT admin na tingnan ang content ng trabaho sa mga personal na app"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"I-on ang profile sa trabaho para makapagbahagi ng content"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"I-on ang profile sa trabaho para tumingin ng content"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Walang available na app"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"I-on"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Mag-record o mag-play ng audio sa mga tawag sa telephony"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Papayagan ang app na ito na mag-record o mag-play ng audio sa mga tawag sa telephony kapag naitalaga bilang default na dialer application."</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 220aec2..253772f 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Erişilebilirlik Kısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> hizmetini açtı"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Erişilebilirlik Kısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> hizmetini kapattı"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> hizmetini kullanmak için her iki ses tuşunu basılı tutun"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Büyütme"</string>
<string name="user_switched" msgid="7249833311585228097">"Geçerli kullanıcı: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> adlı kullanıcıya geçiliyor…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Grup Görüşmesi"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Kişisel"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"İş"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Kişisel görünüm"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"İş görünümü"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"İş uygulamalarıyla paylaşılamıyor"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Kişisel uygulamalarla paylaşılamıyor"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"BT yöneticiniz kişisel profiler ile iş profilleri arasında paylaşımı engelledi"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"İş uygulamalarına erişilemiyor"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"BT yöneticiniz, kişisel içeriğinizi iş uygulamalarında görüntülemenize izin vermiyor"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Kişisel uygulamalara erişilemiyor"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"BT yöneticiniz, iş içeriğini kişisel uygulamalarda görüntülemenize izin vermiyor"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"İçerik paylaşmak için iş profilini açın"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"İçeriği görüntülemek için iş profilini açın"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Kullanılabilir uygulama yok"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Aç"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Telefon aramalarında sesi kaydet veya çal"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Varsayılan çevirici uygulaması olarak atandığında bu uygulamanın telefon aramalarında sesi kaydetmesine veya çalmasına izin verir."</string>
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 9733ba9..efe99c4 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1301,7 +1301,7 @@
<string name="sms_control_title" msgid="4748684259903148341">"Надсил. SMS повідомлень"</string>
<string name="sms_control_message" msgid="6574313876316388239">"Програма <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> надсилає велику кількість SMS-повідомлень. Дозволити цій програмі й надалі надсилати повідомлення?"</string>
<string name="sms_control_yes" msgid="4858845109269524622">"Дозволити"</string>
- <string name="sms_control_no" msgid="4845717880040355570">"Відмовити"</string>
+ <string name="sms_control_no" msgid="4845717880040355570">"Заборонити"</string>
<string name="sms_short_code_confirm_message" msgid="1385416688897538724">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> хоче надіслати повідомлення на таку адресу: <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>."</string>
<string name="sms_short_code_details" msgid="2723725738333388351"><b>"Можуть стягуватися кошти"</b>" з вашого мобільного рахунку."</string>
<string name="sms_premium_short_code_details" msgid="1400296309866638111"><b>"Буде стягнено кошти з вашого мобільного рахунку."</b></string>
@@ -1679,6 +1679,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Сервіс <xliff:g id="SERVICE_NAME">%1$s</xliff:g> увімкнено"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Сервіс <xliff:g id="SERVICE_NAME">%1$s</xliff:g> вимкнено"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Щоб скористатися службою <xliff:g id="SERVICE_NAME">%1$s</xliff:g>, утримуйте обидві клавіші гучності впродовж трьох секунд"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Збільшення"</string>
<string name="user_switched" msgid="7249833311585228097">"Поточний користувач: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Перехід в обліковий запис \"<xliff:g id="NAME">%1$s</xliff:g>\"…"</string>
@@ -2093,19 +2105,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Груповий чат"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Особисте"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Робоче"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Особистий перегляд"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Робочий перегляд"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Не можна надсилати дані робочим додаткам"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Не можна надсилати дані особистим додаткам"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Ваш ІТ-адміністратор заблокував обмін даними між особистим і робочим профілями"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Немає доступу до робочих додатків"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Ваш ІТ-адміністратор не дозволив переглядати особистий контент в робочих додатках"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Немає доступу до особистих додатків"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Ваш ІТ-адміністратор не дозволив переглядати робочий контент в особистих додатках"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Увімкніть робочий профіль, щоб ділитися контентом"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Увімкніть робочий профіль, щоб переглядати контент"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Немає доступних додатків"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Увімкнути"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Записувати й відтворювати звук під час викликів"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Дозволяє цьому додатку записувати й відтворювати звук під час викликів, коли його вибрано додатком для дзвінків за умовчанням."</string>
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 4308037..d06afda 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"ایکسیسبیلٹی شارٹ کٹ نے <xliff:g id="SERVICE_NAME">%1$s</xliff:g> کو آن کر دیا"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"ایکسیسبیلٹی شارٹ کٹ نے <xliff:g id="SERVICE_NAME">%1$s</xliff:g> کو آف کر دیا"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> کا استعمال کرنے کے لیے 3 سیکنڈ تک والیوم کی دونوں کلیدوں کو چھوئیں اور دبائے رکھیں"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"میگنیفکیشن"</string>
<string name="user_switched" msgid="7249833311585228097">"موجودہ صارف <xliff:g id="NAME">%1$s</xliff:g>۔"</string>
<string name="user_switching_message" msgid="1912993630661332336">"<xliff:g id="NAME">%1$s</xliff:g> پر سوئچ کیا جا رہا ہے…"</string>
@@ -2020,27 +2032,38 @@
<string name="accessibility_system_action_accessibility_menu_label" msgid="8436484650391125184">"ایکسیسبیلٹی مینو"</string>
<string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> کی کیپشن بار۔"</string>
<string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> کو پابند کردہ بکٹ میں رکھ دیا گیا ہے"</string>
- <!-- no translation found for conversation_single_line_name_display (8958948312915255999) -->
- <skip />
- <!-- no translation found for conversation_title_fallback_one_to_one (1980753619726908614) -->
- <skip />
- <!-- no translation found for conversation_title_fallback_group_chat (456073374993104303) -->
- <skip />
+ <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string>
+ <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"گفتگو"</string>
+ <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"گروپ گفتگو"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"ذاتی"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"دفتر"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"ذاتی ملاحظہ"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"دفتری ملاحظہ"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"ورک ایپس کے ساتھ اشتراک نہیں کر سکتے"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"ذاتی ایپس کے ساتھ اشتراک نہیں کر سکتے"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"آپ کے IT منتظم نے ذاتی اور دفتری پروفائلز کے درمیان اشتراک کرنے کو مسدود کر دیا"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"دفتری ایپس تک رسائی حاصل نہیں کی جا سکتی"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"آپ کا IT منتظم آپ کو دفتری ایپس میں ذاتی مواد دیکھنے کی اجازت نہیں دیتا ہے"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"ذاتی ایپس تک رسائی حاصل نہیں کی جا سکتی"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"آپ کا IT منتظم آپ کو ذاتی ایپس میں دفتری مواد دیکھنے کی اجازت نہیں دیتا ہے"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"مواد کا اشتراک کرنے کے لیے دفتری پروفائل آن کریں"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"مواد دیکھنے کے ليے دفتری پروفائل آن کریں"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"کوئی ایپ دستیاب نہیں"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"آن کریں"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"ٹیلیفون کالز میں آڈیو ریکارڈ کریں یا چلائیں"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"اس ایپ کو، جب ڈیفالٹ ڈائلر ایپلیکیشن کے بطور تفویض کیا جاتا ہے، تو ٹیلیفون کالز میں آڈیو ریکارڈ کرنے یا چلانے کی اجازت دیتا ہے۔"</string>
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 6f52ac8..6926c7a 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> xizmati yoqildi"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> xizmati o‘chirib qo‘yildi"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> xizmatidan foydalanish uchun ikkala ovoz balandligi tugmalarini uzoq bosib turing"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Kattalashtirish"</string>
<string name="user_switched" msgid="7249833311585228097">"Joriy foydalanuvchi <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Quyidagi foydalanuvchiga o‘tilmoqda: <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Guruh suhbati"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Shaxsiy"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Ish"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Shaxsiy rejim"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Ishchi rejim"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Ishga oid ilovalarga ulashilmaydi"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Shaxsiy ilovalarga ulashilmaydi"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Shaxsiy va ishga oid profillararo axborot ulashish AT administratori tomonidan taqiqlangan"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Ishga oid ilovalardan foydalanish imkonsiz"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"AT administratori ishga oid ilovalarda shaxsiy maʼlumotlarni ochishni taqiqlagan"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Shaxsiy ilovalardan foydalanish imkonsiz"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"AT administratori shaxsiy ilovalarda ishga oid kontentni ochishni taqiqlagan"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Kontentni ulashish uchun ishchi profilni yoqing"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Kontentni ochish uchun ishchi profilni yoqing"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Mos ilova topilmadi"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Yoqish"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Telefondagi suhbatlarni yozib olish va ularni ijro qilish"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Bu ilova chaqiruvlar uchun asosiy ilova sifatida tayinlanganda u telefon chaqiruvlarida suhbatlarni yozib olish va shu audiolarni ijro etish imkonini beradi."</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 8c0c172..68414ac 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Đã bật phím tắt trợ năng <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Đã tắt phím tắt trợ năng <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Nhấn và giữ đồng thời cả hai phím âm lượng trong 3 giây để sử dụng <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Phóng to"</string>
<string name="user_switched" msgid="7249833311585228097">"Người dùng hiện tại <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Đang chuyển sang <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Cuộc trò chuyện nhóm"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Cá nhân"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Cơ quan"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Chế độ xem cá nhân"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Chế độ xem công việc"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Không thể chia sẻ với các ứng dụng công việc"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Không thể chia sẻ với các ứng dụng cá nhân"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Quản trị viên CNTT của bạn đã chặn hoạt động chia sẻ giữa các hồ sơ cá nhân và công việc"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Không thể truy cập vào các ứng dụng công việc"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Quản trị viên CNTT của bạn không cho phép bạn xem nội dung cá nhân trong các ứng dụng công việc"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Không thể truy cập vào các ứng dụng cá nhân"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Quản trị viên CNTT của bạn không cho phép bạn xem nội dung công việc trong các ứng dụng cá nhân"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Bật hồ sơ công việc để chia sẻ nội dung"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Bật hồ sơ công việc để xem nội dung"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Không có ứng dụng nào"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Bật"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Ghi âm hoặc phát âm thanh trong cuộc gọi điện thoại"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Cho phép ứng dụng này ghi âm hoặc phát âm thanh trong cuộc gọi điện thoại khi được chỉ định làm ứng dụng trình quay số mặc định."</string>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index c739e55..32251ad 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"无障碍快捷方式已开启<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"无障碍快捷方式已关闭<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"同时按住两个音量键 3 秒钟即可使用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"放大功能"</string>
<string name="user_switched" msgid="7249833311585228097">"当前用户是<xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="user_switching_message" msgid="1912993630661332336">"正在切换为<xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"群组对话"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"个人"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"工作"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"个人视图"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"工作视图"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"无法与工作应用共享数据"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"无法与个人应用共享数据"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"您的 IT 管理员已禁止个人资料和工作资料之间的共享"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"无法访问工作应用"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"您的 IT 管理员不允许您在工作应用中查看个人内容"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"无法访问个人应用"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"您的 IT 管理员不允许您在个人应用中查看工作内容"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"若想共享内容,请开启工作资料"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"若想查看内容,请开启工作资料"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"没有可用的应用"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"开启"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"录制或播放电话通话音频"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"允许此应用在被指定为默认拨号器应用时录制或播放电话通话音频。"</string>
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index f5fbc4f..5c4fc9f 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"無障礙功能快速鍵已啟用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"無障礙功能快速鍵已停用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"㩒住兩個音量鍵 3 秒就可以用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"放大"</string>
<string name="user_switched" msgid="7249833311585228097">"目前的使用者是<xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="user_switching_message" msgid="1912993630661332336">"正在切換至<xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"群組對話"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"個人"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"公司"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"個人檢視模式"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"工作檢視模式"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"無法與工作應用程式分享"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"無法與個人應用程式分享"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"您的 IT 管理員已封鎖個人和工作設定檔之間的分享功能"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"無法存取工作應用程式"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"您的 IT 管理員不允許您以工作應用程式檢視個人內容"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"無法存取個人應用程式"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"您的 IT 管理員不允許您以個人應用程式檢視工作內容"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"開啟工作設定檔以分享內容"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"開啟工作設定檔以檢視內容"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"沒有可用的應用程式"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"開啟"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"在電話通話中錄音或播放音訊"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"如將此應用程式指定為預設撥號器應用程式,則允許應用程式在電話通話中錄音或播放音訊。"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 4b35af6..0b68fc4 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"無障礙捷徑啟用了「<xliff:g id="SERVICE_NAME">%1$s</xliff:g>」"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"無障礙捷徑停用了「<xliff:g id="SERVICE_NAME">%1$s</xliff:g>」"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"同時按住調低及調高音量鍵三秒即可使用「<xliff:g id="SERVICE_NAME">%1$s</xliff:g>」"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"放大"</string>
<string name="user_switched" msgid="7249833311585228097">"目前的使用者是 <xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="user_switching_message" msgid="1912993630661332336">"正在切換至<xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"群組對話"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"個人"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"工作"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"個人檢視模式"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"工作檢視模式"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"無法與工作應用程式分享"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"無法與個人應用程式分享"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"你的 IT 管理員已封鎖個人和工作資料夾之間的分享功能"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"無法存取工作應用程式"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"你的 IT 管理員不允許你使用工作應用程式查看個人內容"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"無法存取個人應用程式"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"你的 IT 管理員不允許你使用個人應用程式查看工作內容"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"你必須開啟工作資料夾才能分享內容"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"你必須開啟工作資料夾才能查看內容"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"沒有可用的應用程式"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"開啟"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"在通話期間錄製或播放音訊"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"將這個應用程式指派為預設撥號應用程式時,允許應用程式在通話期間錄製或播放音訊。"</string>
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index f700a25..6c32819 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1635,6 +1635,18 @@
<string name="accessibility_shortcut_enabling_service" msgid="6141620395915529473">"Isinqamuleli sokufinyelela sivule i-<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_disabling_service" msgid="1287340429965172651">"Isinqamuleli sokufinyelela sivale i-<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"Cindezela uphinde ubambe bobabili okhiye bevolumu ngamasekhondi amathathu ukuze usebenzise i-<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string>
+ <!-- no translation found for accessibility_button_prompt_text (29591089269861261) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_prompt_text (1950992471955288772) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_prompt_text (1754236312534510178) -->
+ <skip />
+ <!-- no translation found for accessibility_button_instructional_text (1761210320049107435) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_instructional_text (6207697277963860927) -->
+ <skip />
+ <!-- no translation found for accessibility_gesture_3finger_instructional_text (8774465424241303774) -->
+ <skip />
<string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"Ukukhuliswa"</string>
<string name="user_switched" msgid="7249833311585228097">"Umsebenzisi wamanje <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="1912993630661332336">"Ishintshela ku-<xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -2025,19 +2037,33 @@
<string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"Ingxoxo Yeqembu"</string>
<string name="resolver_personal_tab" msgid="2051260504014442073">"Okomuntu siqu"</string>
<string name="resolver_work_tab" msgid="2690019516263167035">"Umsebenzi"</string>
- <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Ukubuka komuntu siqu"</string>
- <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Ukubuka komsebenzi"</string>
- <string name="resolver_cant_share_with_work_apps" msgid="7539495559434146897">"Ayikwazi ukwabelana ngezinhlelo zokusebenza zomsebenzi"</string>
- <string name="resolver_cant_share_with_personal_apps" msgid="8020581735267157241">"Ayikwazi ukwabelana ngezinhlelo zokusebenza zomuntu siqu"</string>
- <string name="resolver_cant_share_cross_profile_explanation" msgid="5556640604460901386">"Umphathi wakho we-IT uvimbe ukwabelana phakathi kwamaphrofayela womuntu siqu nawomsebenzi"</string>
- <string name="resolver_cant_access_work_apps" msgid="375634344111233790">"Ayikwazi ukufinyelela izinhlelo zokusebenza zomsebenzi"</string>
- <string name="resolver_cant_access_work_apps_explanation" msgid="3958762224516867388">"Umphathi wakho we-IT akakuvumeli ukuthi ubuke okuqukethwe komuntu siqu kuzinhlelo zokusebenza zomsebenzi"</string>
- <string name="resolver_cant_access_personal_apps" msgid="1953215925406474177">"Ayikwazi ukufinyelela izinhlelo zomuntu siqu"</string>
- <string name="resolver_cant_access_personal_apps_explanation" msgid="1725572276741281136">"Umphathi wakho we-IT akakuvumeli ukuthi ubuke okuqukethwe komsebenzi kuzinhlelo zokusebenza zomuntu siqu"</string>
- <string name="resolver_turn_on_work_apps_share" msgid="619263911204978175">"Vula iphrofayela yomsebenzi ukwabelana nokuqukethwe"</string>
- <string name="resolver_turn_on_work_apps_view" msgid="3073389230905543680">"Vula iphrofayela yomsebenzi ukubuka okuqukethwe"</string>
- <string name="resolver_no_apps_available" msgid="7710339903040989654">"Azikho izinhlelo zokusebenza ezitholakalayo"</string>
+ <!-- no translation found for resolver_cant_share_with_work_apps (637686613606502219) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_work_apps_explanation (3332302070341130545) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps (2455757966397563223) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_work_apps_explanation (3626983885525445790) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps (3079139799233316203) -->
+ <skip />
+ <!-- no translation found for resolver_cant_share_with_personal_apps_explanation (2959282422751315171) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps (648291604475669395) -->
+ <skip />
+ <!-- no translation found for resolver_cant_access_personal_apps_explanation (2298773629302296519) -->
+ <skip />
+ <!-- no translation found for resolver_turn_on_work_apps (884910835250037247) -->
+ <skip />
<string name="resolver_switch_on_work" msgid="2873009160846966379">"Vula"</string>
+ <!-- no translation found for resolver_no_work_apps_available_share (7933949011797699505) -->
+ <skip />
+ <!-- no translation found for resolver_no_work_apps_available_resolve (1244844292366099399) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_share (5639102815174748732) -->
+ <skip />
+ <!-- no translation found for resolver_no_personal_apps_available_resolve (5120671970531446978) -->
+ <skip />
<string name="permlab_accessCallAudio" msgid="1682957511874097664">"Rekhoda noma dlala umsindo kumakholi ocingo"</string>
<string name="permdesc_accessCallAudio" msgid="8448360894684277823">"Ivumela lolu hlelo lokusebenza, uma lunikezwe njengohlelo lokusebenza oluzenzakalelayo lokudayela, ukuze kurekhodwe noma kudlalwe umsindo kumakholi ocingo."</string>
</resources>
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index fe08f9c..d6e200a 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -2121,6 +2121,35 @@
<declare-styleable name="AndroidManifestQueriesProvider" parent="AndroidManifestQueries" >
<attr name="authorities" />
</declare-styleable>
+ <!--
+ Matches an overlayable, its overlays, its actor, and/or its containing target.
+ A target or actor must always be specified, but can be combined for more specificity.
+ Valid combinations and what they match are:
+
+ targetPackage:
+ - All overlays targeting any overlayables inside 'targetPackage'
+
+ targetPackage + targetName:
+ - All overlays targeting the overlayable 'targetName' inside 'targetPackage'
+
+ targetPackage + targetName + actor:
+ - All overlays targeting the overlayable 'targetName' inside 'targetPackage' if the
+ overlayable specifies 'actor'
+
+ targetPackage + actor:
+ - All overlays targeting overlayables inside 'targetPackage' that specify `actor`
+ - The actor itself if the above matches
+
+ actor:
+ - All overlays targeting overlayables that specify `actor`
+ - All targets that contain an overlayable that specifies `actor`
+ - The actor itself
+ -->
+ <declare-styleable name="AndroidManifestQueriesOverlayable">
+ <attr name="targetPackage" />
+ <attr name="targetName"/>
+ <attr name="actor" format="string" />
+ </declare-styleable>
<!-- The <code>static-library</code> tag declares that this apk is providing itself
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index 91248f1..831da6f 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -226,4 +226,6 @@
<color name="resolver_text_color_secondary_dark">#ffC4C6C6</color>
<color name="resolver_empty_state_text">#FF202124</color>
<color name="resolver_empty_state_icon">#FF5F6368</color>
+
+ <color name="conversation_important_highlight">#F9AB00</color>
</resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 4dedc63..f2e2599 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -686,18 +686,18 @@
<dimen name="conversation_avatar_size">52dp</dimen>
<!-- Start of the content in the conversation template -->
<dimen name="conversation_content_start">80dp</dimen>
- <!-- Size of the expand button when expanded -->
- <dimen name="conversation_expand_button_expanded_size">80dp</dimen>
+ <!-- Size of the expand button in the conversation layout -->
+ <dimen name="conversation_expand_button_size">80dp</dimen>
<!-- Top margin of the expand button for conversations when expanded -->
<dimen name="conversation_expand_button_top_margin_expanded">18dp</dimen>
<!-- Side margins of the conversation badge in relation to the conversation icon -->
<dimen name="conversation_badge_side_margin">36dp</dimen>
- <!-- size of the notification icon when badged in a conversation -->
- <dimen name="conversation_icon_size_badged">15dp</dimen>
- <!-- size of the notification icon when centered in a conversation -->
- <dimen name="conversation_icon_size_centered">20dp</dimen>
+ <!-- size of the notification badge when applied to the conversation icon -->
+ <dimen name="conversation_icon_size_badged">20dp</dimen>
+ <!-- size of the notification badge when centered in a conversation -->
+ <dimen name="conversation_icon_size_centered">26dp</dimen>
<!-- margin on the top when the icon is centered for group conversations -->
- <dimen name="conversation_icon_margin_top_centered">5dp</dimen>
+ <dimen name="conversation_icon_margin_top_centered">12dp</dimen>
<!-- The padding of the conversation header when expanded. This is calculated from the expand button size + notification_content_margin_end -->
<dimen name="conversation_header_expanded_padding_end">38dp</dimen>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 9f4b344..f02d54f 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3019,6 +3019,7 @@
<public name="preserveLegacyExternalStorage" />
<public name="mimeGroup" />
<public name="gwpAsanMode" />
+ <public name="actor" />
</public-group>
<public-group type="drawable" first-id="0x010800b5">
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index ec69874..4260f1e 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -533,26 +533,28 @@
<!-- Title of the Global Actions Dialog -->
<string name="global_actions" product="default">Phone options</string>
- <!-- label for item that locks the phone in the phone options dialog -->
+ <!-- label for item that locks the phone in the phone options dialog [CHAR LIMIT=24]-->
<string name="global_action_lock">Screen lock</string>
- <!-- label for item that turns off power in phone options dialog -->
+ <!-- label for item that turns off power in phone options dialog [CHAR LIMIT=24] -->
<string name="global_action_power_off">Power off</string>
- <!-- label for item that restarts phone in phone options dialog -->
- <!-- TODO: promote to separate string-->
- <string name="global_action_restart" translatable="false">@string/sim_restart_button</string>
+ <!-- label for item that shows options to power off and restart the phone [CHAR LIMIT=24]-->
+ <string name="global_action_power_options">Power</string>
- <!-- label for item that starts emergency call -->
+ <!-- label for item that restarts phone in phone options dialog [CHAR LIMIT=24]-->
+ <string name="global_action_restart">Restart</string>
+
+ <!-- label for item that opens emergency features in the phone options dialog [CHAR LIMIT=24]-->
<string name="global_action_emergency">Emergency</string>
- <!-- label for item that generates a bug report in the phone options dialog -->
+ <!-- label for item that generates a bug report in the phone options dialog [CHAR LIMIT=24] -->
<string name="global_action_bug_report">Bug report</string>
- <!-- label for item that logouts the current user -->
+ <!-- label for item that logouts the current user [CHAR LIMIT=24]-->
<string name="global_action_logout">End session</string>
- <!-- label for screenshot item in power menu -->
+ <!-- label for screenshot item in power menu [CHAR LIMIT=24]-->
<string name="global_action_screenshot">Screenshot</string>
<!-- Take bug report menu title [CHAR LIMIT=30] -->
@@ -617,7 +619,7 @@
<!-- label for item that launches voice assist in phone options dialog [CHAR LIMIT=15]-->
<string name="global_action_voice_assist">Voice Assist</string>
- <!-- label for item that locks the phone and enforces that it can't be unlocked without strong authentication. [CHAR LIMIT=15] -->
+ <!-- label for item that locks the phone and enforces that it can't be unlocked without strong authentication. [CHAR LIMIT=24] -->
<string name="global_action_lockdown">Lockdown</string>
<!-- Text to use when the number in a notification info is too large
@@ -1164,7 +1166,7 @@
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR_LIMIT=NONE] -->
<string name="permlab_systemCamera">Allow an application or service access to system cameras to take pictures and videos</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR_LIMIT=NONE] -->
- <string name="permdesc_systemCamera">This privileged | system app can take pictures and record videos using a system camera at any time. Requires the android.permission.CAMERA permission to be held by the app as well</string>
+ <string name="permdesc_systemCamera">This privileged or system app can take pictures and record videos using a system camera at any time. Requires the android.permission.CAMERA permission to be held by the app as well</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR_LIMIT=NONE] -->
<string name="permlab_cameraOpenCloseListener">Allow an application or service to receive callbacks about camera devices being opened or closed.</string>
@@ -4422,13 +4424,13 @@
<!-- Title for accessibility edit shortcut selection menu dialog, and dialog is triggered
from accessibility button. [CHAR LIMIT=100] -->
- <string name="accessibility_edit_shortcut_menu_button_title">Choose apps to use with the
+ <string name="accessibility_edit_shortcut_menu_button_title">Choose features to use with the
accessibility button
</string>
<!-- Title for accessibility edit shortcut selection menu dialog, and dialog is triggered
from volume key shortcut. [CHAR LIMIT=100] -->
- <string name="accessibility_edit_shortcut_menu_volume_title">Choose apps to use with the
+ <string name="accessibility_edit_shortcut_menu_volume_title">Choose features to use with the
volume key shortcut
</string>
@@ -5377,7 +5379,7 @@
</plurals>
<!-- ChooserActivity - No direct share targets are available. [CHAR LIMIT=NONE] -->
- <string name="chooser_no_direct_share_targets">Direct share not available</string>
+ <string name="chooser_no_direct_share_targets">No recommended people to share with</string>
<!-- ChooserActivity - Alphabetically sorted apps list label. [CHAR LIMIT=NONE] -->
<string name="chooser_all_apps_button_label">Apps list</string>
@@ -5428,6 +5430,11 @@
<!-- Label of a tab on a screen. A user can tap this tab to switch to the 'Work' view (that shows their work content) if they have a work profile on their device. [CHAR LIMIT=NONE] -->
<string name="resolver_work_tab">Work</string>
+ <!-- Accessibility label for the personal tab button. [CHAR LIMIT=NONE] -->
+ <string name="resolver_personal_tab_accessibility">Personal view</string>
+ <!-- Accessibility label for the work tab button. [CHAR LIMIT=NONE] -->
+ <string name="resolver_work_tab_accessibility">Work view</string>
+
<!-- Title of a screen. This text lets the user know that their IT admin doesn't allow them to share this specific content with work apps. [CHAR LIMIT=NONE] -->
<string name="resolver_cant_share_with_work_apps">Can\u2019t share this with work apps</string>
<!-- Error message. This text is explaining that the user's IT admin doesn't allow this specific content to be shared with apps in the work profile. [CHAR LIMIT=NONE] -->
@@ -5467,4 +5474,237 @@
<string name="permlab_accessCallAudio">Record or play audio in telephony calls</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=NONE] -->
<string name="permdesc_accessCallAudio">Allows this app, when assigned as default dialer application, to record or play audio in telephony calls.</string>
+
+ <!-- Icc depersonalization related strings -->
+ <!-- Label text for PIN entry widget on SIM Network Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_ENTRY">SIM network unlock PIN</string>
+ <!-- Label text for PIN entry widget on SIM Network Subset Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ENTRY">SIM network subset unlock PIN</string>
+ <!-- Label text for PIN entry widget on SIM Corporate Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_CORPORATE_ENTRY">SIM corporate unlock PIN</string>
+ <!-- Label text for PIN entry widget on SIM Service Provider Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ENTRY">SIM service provider unlock PIN</string>
+ <!-- Label text for PIN entry widget on SIM SIM Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SIM_ENTRY">SIM unlock PIN</string>
+ <!-- Label text for PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ENTRY">Enter PUK</string>
+ <!-- Label text for Subset PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ENTRY">Enter PUK</string>
+ <!-- Label text for Corporate PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ENTRY">Enter PUK</string>
+ <!-- Label text for SIM service provider PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ENTRY">Enter PUK</string>
+ <!-- Label text for SIM PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SIM_PUK_ENTRY">Enter PUK</string>
+ <!-- Label text for PIN entry widget on RUIM Network1 Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK1_ENTRY">RUIM network1 unlock PIN</string>
+ <!-- Label text for PIN entry widget on RUIM Network2 Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK2_ENTRY">RUIM network2 unlock PIN</string>
+ <!-- Label text for PIN entry widget on RUIM Hrpd Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_HRPD_ENTRY">RUIM hrpd unlock PIN</string>
+ <!-- Label text for PIN entry widget on RUIM Corporate Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_CORPORATE_ENTRY">RUIM corporate unlock PIN</string>
+ <!-- Label text for PIN entry widget on RUIM Service Provider Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ENTRY">RUIM service provider unlock PIN</string>
+ <!-- Label text for PIN entry widget on RUIM RUIM Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_RUIM_ENTRY">RUIM unlock PIN</string>
+ <!-- Label text for PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ENTRY">Enter PUK</string>
+ <!-- Label text for PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ENTRY">Enter PUK</string>
+ <!-- Label text for PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ENTRY">Enter PUK</string>
+ <!-- Label text for PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ENTRY">Enter PUK</string>
+ <!-- Label text for PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ENTRY">Enter PUK</string>
+ <!-- Label text for PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ENTRY">Enter PUK</string>
+
+ <!-- Label text for PIN entry widget on SIM SPN Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SPN_ENTRY">SPN unlock PIN</string>
+ <!-- Label text for PIN entry widget on SIM SP EHPLMN Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ENTRY">SP Equivalent Home PLMN unlock PIN</string>
+ <!-- Label text for PIN entry widget on SIM ICCID Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_ICCID_ENTRY">ICCID unlock PIN</string>
+ <!-- Label text for PIN entry widget on SIM IMPI Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_IMPI_ENTRY">IMPI unlock PIN</string>
+ <!-- Label text for PIN entry widget on SIM NS_SP Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NS_SP_ENTRY">Network subset service provider unlock PIN</string>
+
+ <!-- Status message displayed on SIM Network Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_IN_PROGRESS">Requesting SIM network unlock\u2026</string>
+ <!-- Status message displayed on SIM Network Subset Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_IN_PROGRESS">Requesting SIM network subset unlock
+\u2026</string>
+ <!-- Status message displayed on SIM Service Provider Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_IN_PROGRESS">Requesting SIM service provider un
+lock\u2026</string>
+ <!-- Status message displayed on SIM Corporate Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_CORPORATE_IN_PROGRESS">Requesting SIM corporate unlock\u2026</string>
+ <!-- Status message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_IN_PROGRESS">Requesting PUK unlock\u2026</string>
+ <!-- Status message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_IN_PROGRESS">Requesting PUK unlock\u2026</string>
+ <!-- Status message displayed on Corporate PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_IN_PROGRESS">Requesting PUK unlock\u2026</string>
+ <!-- Status message displayed on SIM Service provider PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_IN_PROGRESS">Requesting PUK unlock\u2026</string>
+ <!-- Status message displayed on SIM PUK entry widget on Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SIM_PUK_IN_PROGRESS">Requesting PUK unlock\u2026</string>
+ <!-- Status message displayed on SIM SIM Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SIM_IN_PROGRESS">Requesting SIM unlock\u2026</string>
+ <!-- Status message displayed on RUIM Network1 Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK1_IN_PROGRESS">Requesting RUIM network1 unlock\u2026</string>
+ <!-- Status message displayed on RUIM Network2 Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK2_IN_PROGRESS">Requesting RUIM network2 unlock\u2026</string>
+ <!-- Status message displayed on RUIM Hrpd Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_HRPD_IN_PROGRESS">Requesting RUIM hrpd unlock\u2026</string>
+ <!-- Status message displayed on RUIM Service Provider Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_IN_PROGRESS">Requesting RUIM service provider
+unlock\u2026</string>
+ <!-- Status message displayed on RUIM Corporate Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_CORPORATE_IN_PROGRESS">Requesting RUIM corporate unlock\u2026</string>
+
+ <!-- Status message displayed on SIM SPN Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SPN_IN_PROGRESS">Requesting SPN unlock\u2026</string>
+ <!-- Status message displayed on SIM SP EHPLMN Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_IN_PROGRESS">Requesting SP Equivalent Home PLMN unlock\u2026</string>
+ <!-- Status message displayed on SIM ICCID Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_ICCID_IN_PROGRESS">Requesting ICCID unlock\u2026</string>
+ <!-- Status message displayed on SIM IMPI Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_IMPI_IN_PROGRESS">Requesting IMPI unlock\u2026</string>
+ <!-- Status message displayed on SIM NS_SP Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NS_SP_IN_PROGRESS">Requesting Network subset service provider unlock\u2026</string>
+
+ <!-- Status message displayed on RUIM RUIM Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_RUIM_IN_PROGRESS">Requesting RUIM unlock\u2026</string>
+ <!-- Status message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_IN_PROGRESS">Requesting PUK unlock\u2026</string>
+ <!-- Status message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_IN_PROGRESS">Requesting PUK unlock\u2026</string>
+ <!-- Status message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_IN_PROGRESS">Requesting PUK unlock\u2026</string>
+ <!-- Status message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_IN_PROGRESS">Requesting PUK unlock\u2026</string>
+ <!-- Status message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_IN_PROGRESS">Requesting PUK unlock\u2026</string>
+ <!-- Status message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_IN_PROGRESS">Requesting PUK unlock\u2026</string>
+ <!-- Error message displayed on SIM Network Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_ERROR">SIM Network unlock request unsuccessful.</string>
+ <!-- Error message displayed on SIM Network Subset Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_ERROR">SIM Network Subset unlock request unsucces
+sful.</string>
+ <!-- Error message displayed on SIM Service Provider Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_ERROR">SIM Service Provider unlock request unsu
+ccessful.</string>
+ <!-- Error message displayed on SIM Corporate Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_CORPORATE_ERROR">SIM Corporate unlock request unsuccessful.</string>
+ <!-- Error message displayed on SIM SIM Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SIM_ERROR">SIM unlock request unsuccessful.</string>
+ <!-- Error message displayed on RUIM Network1 Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK1_ERROR">RUIM Network1 unlock request unsuccessful.</string>
+ <!-- Error message displayed on RUIM Network2 Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK2_ERROR">RUIM Network2 unlock request unsuccessful.</string>
+ <!-- Error message displayed on RUIM Hrpd Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_HRPD_ERROR">RUIM Hrpd unlock request unsuccessful.</string>
+ <!-- Error message displayed on RUIM Corporate Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_CORPORATE_ERROR">RUIM Corporate unlock request unsuccessful.</string>
+ <!-- Error message displayed on RUIM Service Provider Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_ERROR">RUIM Service Provider unlock request un
+successful.</string>
+ <!-- Error message displayed on RUIM RUIM Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_RUIM_ERROR">RUIM unlock request unsuccessful.</string>
+ <!-- Error message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_ERROR">PUK unlock unsuccessful.</string>
+ <!-- Error message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_ERROR">PUK unlock unsuccessful.</string>
+ <!-- Error message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_ERROR">PUK unlock unsuccessful.</string>
+ <!-- Error message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_ERROR">PUK unlock unsuccessful.</string>
+ <!-- Error message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SIM_PUK_ERROR">PUK unlock unsuccessful.</string>
+ <!-- Error message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_ERROR">PUK unlock unsuccessful.</string>
+ <!-- Error message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_ERROR">PUK unlock unsuccessful.</string>
+ <!-- Error message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_ERROR">PUK unlock unsuccessful.</string>
+ <!-- Error message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_ERROR">PUK unlock unsuccessful.</string>
+ <!-- Error message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_ERROR">PUK unlock unsuccessful.</string>
+ <!-- Error message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_ERROR">PUK unlock unsuccessful.</string>
+
+ <!-- Error message displayed on SIM SPN Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SPN_ERROR">SPN unlock request unsuccessful.</string>
+ <!-- Error message displayed on SIM SP EHPLMN Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_ERROR">SP Equivalent Home PLMN unlock request unsuccessful.</string>
+ <!-- Error message displayed on SIM ICCID Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_ICCID_ERROR">ICCID unlock request unsuccessful.</string>
+ <!-- Error message displayed on SIM IMPI Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_IMPI_ERROR">IMPI unlock request unsuccessful.</string>
+ <!-- Error message displayed on SIM NS_SP Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NS_SP_ERROR">Network subset service provider unlock request unsuccessful.</string>
+
+ <!-- Success message displayed on SIM Network Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_SUCCESS">SIM Network unlock successful.</string>
+ <!-- Success message displayed on SIM Network Subset Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_SUCCESS">SIM Network Subset unlock successful.</string>
+ <!-- Success message displayed on SIM Service Provider Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_SUCCESS">SIM Service Provider unlock successful
+.</string>
+ <!-- Success message displayed on SIM Corporate Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_CORPORATE_SUCCESS">SIM Corporate unlock successful.</string>
+ <!-- Success message displayed on SIM SIM Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SIM_SUCCESS">SIM unlock successful.</string>
+ <!-- Success message displayed on RUIM Network1 Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK1_SUCCESS">RUIM Network1 unlock successful.</string>
+ <!-- Success message displayed on RUIM Network2 Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK2_SUCCESS">RUIM Network2 unlock successful.</string>
+ <!-- Success message displayed on RUIM Hrpd Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_HRPD_SUCCESS">RUIM Hrpd unlock successful.</string>
+ <!-- Success message displayed on RUIM Service Provider Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_SUCCESS">RUIM Service Provider unlock successf
+ul.</string>
+ <!-- Success message displayed on RUIM Corporate Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_CORPORATE_SUCCESS">RUIM Corporate unlock successful.</string>
+ <!-- Success message displayed on RUIM RUIM Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_RUIM_SUCCESS">RUIM unlock successful.</string>
+ <!-- Success message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_PUK_SUCCESS">PUK unlock successful.</string>
+ <!-- Success message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK_SUCCESS">PUK unlock successful.</string>
+ <!-- Success message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_CORPORATE_PUK_SUCCESS">PUK unlock successful.</string>
+ <!-- Success message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK_SUCCESS">PUK unlock successful.</string>
+ <!-- Success message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SIM_PUK_SUCCESS">PUK unlock successful.</string>
+ <!-- Success message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK1_PUK_SUCCESS">PUK unlock successful.</string>
+ <!-- Success message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_NETWORK2_PUK_SUCCESS">PUK unlock successful.</string>
+ <!-- Success message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_HRPD_PUK_SUCCESS">PUK unlock successful.</string>
+ <!-- Success message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_CORPORATE_PUK_SUCCESS">PUK unlock successful.</string>
+ <!-- Success message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK_SUCCESS">PUK unlock successful.</string>
+ <!-- Success message displayed on PUK Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_RUIM_RUIM_PUK_SUCCESS">PUK unlock successful.</string>
+
+ <!-- Success message displayed on SIM SPN Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SPN_SUCCESS">SPN unlock successful.</string>
+ <!-- Success message displayed on SIM SP EHPLMN Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_SP_EHPLMN_SUCCESS">SP Equivalent Home PLMN unlock successful.</string>
+ <!-- Success message displayed on SIM ICCID Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS">ICCID unlock successful.</string>
+ <!-- Success message displayed on SIM IMPI Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS">IMPI unlock successful.</string>
+ <!-- Success message displayed on SIM NS_SP Depersonalization panel [CHAR LIMIT=none] -->
+ <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS">Network subset service provider unlock successful.</string>
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 6c598d6..e0e6074 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3860,6 +3860,8 @@
<java-symbol type="string" name="conversation_title_fallback_group_chat" />
<java-symbol type="id" name="conversation_icon" />
<java-symbol type="id" name="conversation_icon_badge" />
+ <java-symbol type="id" name="conversation_icon_badge_ring" />
+ <java-symbol type="id" name="conversation_icon_badge_bg" />
<java-symbol type="id" name="expand_button_container" />
<java-symbol type="id" name="messaging_group_content_container" />
<java-symbol type="id" name="expand_button_and_content_container" />
@@ -3870,8 +3872,8 @@
<java-symbol type="id" name="conversation_face_pile" />
<java-symbol type="id" name="conversation_text" />
<java-symbol type="id" name="message_icon_container" />
+ <java-symbol type="id" name="conversation_image_message_container" />
<java-symbol type="dimen" name="conversation_expand_button_top_margin_expanded" />
- <java-symbol type="dimen" name="conversation_expand_button_expanded_size" />
<java-symbol type="dimen" name="messaging_group_singleline_sender_padding_end" />
<java-symbol type="dimen" name="conversation_badge_side_margin" />
<java-symbol type="dimen" name="conversation_icon_size_badged" />
@@ -3885,7 +3887,9 @@
<!-- Intent resolver and share sheet -->
<java-symbol type="string" name="resolver_personal_tab" />
+ <java-symbol type="string" name="resolver_personal_tab_accessibility" />
<java-symbol type="string" name="resolver_work_tab" />
+ <java-symbol type="string" name="resolver_work_tab_accessibility" />
<java-symbol type="id" name="stub" />
<java-symbol type="id" name="resolver_empty_state" />
<java-symbol type="id" name="resolver_empty_state_icon" />
diff --git a/core/tests/ResourceLoaderTests/Android.bp b/core/tests/ResourceLoaderTests/Android.bp
index fec4628..2b14bca 100644
--- a/core/tests/ResourceLoaderTests/Android.bp
+++ b/core/tests/ResourceLoaderTests/Android.bp
@@ -21,44 +21,44 @@
],
libs: [
"android.test.runner",
- "android.test.base",
+ "android.test.base"
],
static_libs: [
+ "FrameworksResourceLoaderTests_Providers",
"androidx.test.espresso.core",
"androidx.test.ext.junit",
"androidx.test.runner",
"androidx.test.rules",
"mockito-target-minus-junit4",
- "truth-prebuilt",
+ "truth-prebuilt"
],
- resource_zips: [ ":FrameworksResourceLoaderTestsAssets" ],
+ resource_dirs: ["res", "resources/provider_stable/res"],
platform_apis: true,
test_suites: ["device-tests"],
- aaptflags: [
- "--no-compress",
- ],
+ aaptflags: ["-0 .txt"],
data: [
- ":FrameworksResourceLoaderTestsSplitOne",
- ":FrameworksResourceLoaderTestsSplitTwo",
- ":FrameworksResourceLoaderTestsSplitThree",
- ":FrameworksResourceLoaderTestsSplitFour",
- ],
- java_resources: [ "NonAsset.txt" ]
+ ":FrameworksResourceLoaderTests_ProviderOne_Split",
+ ":FrameworksResourceLoaderTests_ProviderTwo_Split",
+ ":FrameworksResourceLoaderTests_ProviderThree_Split",
+ ":FrameworksResourceLoaderTests_ProviderFour_Split"
+ ]
}
-filegroup {
- name: "FrameworksResourceLoaderTestsResources",
- srcs: ["resources"],
-}
-
-genrule {
- name: "FrameworksResourceLoaderTestsAssets",
- srcs: [
- ":framework-res",
- ":FrameworksResourceLoaderTestsResources",
+java_genrule {
+ name: "FrameworksResourceLoaderTests_Providers",
+ tools: ["soong_zip"],
+ srcs : [
+ ":FrameworksResourceLoaderTests_ProviderOne",
+ ":FrameworksResourceLoaderTests_ProviderOne_ARSC",
+ ":FrameworksResourceLoaderTests_ProviderTwo",
+ ":FrameworksResourceLoaderTests_ProviderTwo_ARSC",
+ ":FrameworksResourceLoaderTests_ProviderThree",
+ ":FrameworksResourceLoaderTests_ProviderThree_ARSC",
+ ":FrameworksResourceLoaderTests_ProviderFour",
+ ":FrameworksResourceLoaderTests_ProviderFour_ARSC"
],
- tools: [ ":aapt2", ":soong_zip" ],
- tool_files: [ "resources/compileAndLink.sh" ],
- cmd: "$(location resources/compileAndLink.sh) $(location :aapt2) $(location :soong_zip) $(genDir) $(in) $(in)",
- out: [ "out.zip" ]
-}
+ out: ["FrameworksResourceLoaderTests_Providers.jar"],
+ cmd: "mkdir -p $(genDir)/assets/ && cp $(in) $(genDir)/assets/ && " +
+ "$(location soong_zip) -o $(out) " +
+ "-L 0 -C $(genDir) -D $(genDir)/assets/"
+}
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/AndroidTest.xml b/core/tests/ResourceLoaderTests/AndroidTest.xml
index d732132..800e7a7 100644
--- a/core/tests/ResourceLoaderTests/AndroidTest.xml
+++ b/core/tests/ResourceLoaderTests/AndroidTest.xml
@@ -22,7 +22,7 @@
<option name="cleanup-apks" value="true" />
<!-- The following value cannot be multi-line as whitespace is parsed by the installer -->
<option name="split-apk-file-names"
- value="FrameworksResourceLoaderTests.apk,FrameworksResourceLoaderTestsSplitOne.apk,FrameworksResourceLoaderTestsSplitTwo.apk,FrameworksResourceLoaderTestsSplitThree.apk,FrameworksResourceLoaderTestsSplitFour.apk" />
+ value="FrameworksResourceLoaderTests.apk,FrameworksResourceLoaderTests_ProviderOne_Split.apk,FrameworksResourceLoaderTests_ProviderTwo_Split.apk,FrameworksResourceLoaderTests_ProviderThree_Split.apk,FrameworksResourceLoaderTests_ProviderFour_Split.apk" />
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
diff --git a/core/tests/ResourceLoaderTests/NonAsset.txt b/core/tests/ResourceLoaderTests/NonAsset.txt
deleted file mode 100644
index 5c0b2cc..0000000
--- a/core/tests/ResourceLoaderTests/NonAsset.txt
+++ /dev/null
@@ -1 +0,0 @@
-Outside assets directory
diff --git a/core/tests/ResourceLoaderTests/assets/Asset.txt b/core/tests/ResourceLoaderTests/assets/asset.txt
similarity index 94%
rename from core/tests/ResourceLoaderTests/assets/Asset.txt
rename to core/tests/ResourceLoaderTests/assets/asset.txt
index 03f9a0f..271704b 100644
--- a/core/tests/ResourceLoaderTests/assets/Asset.txt
+++ b/core/tests/ResourceLoaderTests/assets/asset.txt
@@ -1 +1 @@
-In assets directory
+In assets directory
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/assets/base_asset.txt b/core/tests/ResourceLoaderTests/assets/base_asset.txt
new file mode 100644
index 0000000..8e62cc3
--- /dev/null
+++ b/core/tests/ResourceLoaderTests/assets/base_asset.txt
@@ -0,0 +1 @@
+Base
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/res/drawable-nodpi/non_asset_bitmap.png b/core/tests/ResourceLoaderTests/res/drawable-nodpi/drawable_png.png
similarity index 100%
rename from core/tests/ResourceLoaderTests/res/drawable-nodpi/non_asset_bitmap.png
rename to core/tests/ResourceLoaderTests/res/drawable-nodpi/drawable_png.png
Binary files differ
diff --git a/core/tests/ResourceLoaderTests/res/drawable-nodpi/non_asset_drawable.xml b/core/tests/ResourceLoaderTests/res/drawable-nodpi/drawable_xml.xml
similarity index 100%
rename from core/tests/ResourceLoaderTests/res/drawable-nodpi/non_asset_drawable.xml
rename to core/tests/ResourceLoaderTests/res/drawable-nodpi/drawable_xml.xml
diff --git a/core/tests/ResourceLoaderTests/res/values/strings.xml b/core/tests/ResourceLoaderTests/res/values/strings.xml
deleted file mode 100644
index 28b8f73..0000000
--- a/core/tests/ResourceLoaderTests/res/values/strings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
-
- <string name="loader_path_change_test">Not overlaid</string>
- <string name="split_overlaid">Not overlaid</string>
-
-</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/non_asset_bitmap_id.xml b/core/tests/ResourceLoaderTests/res/values/values.xml
similarity index 89%
rename from core/tests/ResourceLoaderTests/resources/res/values/non_asset_bitmap_id.xml
rename to core/tests/ResourceLoaderTests/res/values/values.xml
index 38b152b..ad78532 100644
--- a/core/tests/ResourceLoaderTests/resources/res/values/non_asset_bitmap_id.xml
+++ b/core/tests/ResourceLoaderTests/res/values/values.xml
@@ -16,5 +16,6 @@
-->
<resources>
- <public type="drawable" name="non_asset_bitmap" id="0x7f010000" />
+ <dimen name="test">0dp</dimen>
+ <string name="test">Not overlaid</string>
</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/Android.bp b/core/tests/ResourceLoaderTests/resources/Android.bp
new file mode 100644
index 0000000..18ef64b
--- /dev/null
+++ b/core/tests/ResourceLoaderTests/resources/Android.bp
@@ -0,0 +1,115 @@
+//
+// 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.
+//
+
+android_test_helper_app {
+ name: "FrameworksResourceLoaderTests_ProviderOne",
+ manifest: "AndroidManifestApp.xml",
+ asset_dirs: ["provider1/assets"],
+ resource_dirs: ["provider1/res", "provider_stable/res"],
+ aaptflags: ["-0 .txt"]
+}
+
+android_test_helper_app {
+ name: "FrameworksResourceLoaderTests_ProviderTwo",
+ manifest: "AndroidManifestApp.xml",
+ asset_dirs: ["provider2/assets"],
+ resource_dirs: ["provider2/res", "provider_stable/res"],
+ aaptflags: ["-0 .txt"]
+}
+
+android_test_helper_app {
+ name: "FrameworksResourceLoaderTests_ProviderThree",
+ manifest: "AndroidManifestApp.xml",
+ asset_dirs: ["provider3/assets"],
+ resource_dirs: ["provider3/res", "provider_stable/res"],
+ aaptflags: ["-0 .txt"]
+}
+
+android_test_helper_app {
+ name: "FrameworksResourceLoaderTests_ProviderFour",
+ manifest: "AndroidManifestApp.xml",
+ asset_dirs: ["provider4/assets"],
+ resource_dirs: ["provider4/res", "provider_stable/res"],
+ aaptflags: ["-0 .txt"]
+}
+
+// Resources.arsc(s)
+
+genrule {
+ name: "FrameworksResourceLoaderTests_ProviderOne_ARSC",
+ srcs: [":FrameworksResourceLoaderTests_ProviderOne"],
+ cmd: "unzip $(in) resources.arsc -d $(genDir) && "
+ + " mv $(genDir)/resources.arsc $(genDir)/FrameworksResourceLoaderTests_ProviderOne.arsc",
+ out: ["FrameworksResourceLoaderTests_ProviderOne.arsc"]
+}
+
+genrule {
+ name: "FrameworksResourceLoaderTests_ProviderTwo_ARSC",
+ srcs: [":FrameworksResourceLoaderTests_ProviderTwo"],
+ cmd: "unzip $(in) resources.arsc -d $(genDir) && "
+ + " mv $(genDir)/resources.arsc $(genDir)/FrameworksResourceLoaderTests_ProviderTwo.arsc",
+ out: ["FrameworksResourceLoaderTests_ProviderTwo.arsc"]
+}
+
+genrule {
+ name: "FrameworksResourceLoaderTests_ProviderThree_ARSC",
+ srcs: [":FrameworksResourceLoaderTests_ProviderThree"],
+ cmd: "unzip $(in) resources.arsc -d $(genDir) && "
+ + " mv $(genDir)/resources.arsc $(genDir)/FrameworksResourceLoaderTests_ProviderThree.arsc",
+ out: ["FrameworksResourceLoaderTests_ProviderThree.arsc"]
+}
+
+genrule {
+ name: "FrameworksResourceLoaderTests_ProviderFour_ARSC",
+ srcs: [":FrameworksResourceLoaderTests_ProviderFour"],
+ cmd: "unzip $(in) resources.arsc -d $(genDir) && "
+ + " mv $(genDir)/resources.arsc $(genDir)/FrameworksResourceLoaderTests_ProviderFour.arsc",
+ out: ["FrameworksResourceLoaderTests_ProviderFour.arsc"]
+}
+
+// Split APKs
+
+android_test_helper_app {
+ name: "FrameworksResourceLoaderTests_ProviderOne_Split",
+ manifest: "AndroidManifestSplit1.xml",
+ asset_dirs: ["provider1/assets"],
+ resource_dirs: ["provider1/res", "provider_stable/res"],
+ aaptflags: ["-0 .txt"]
+}
+
+android_test_helper_app {
+ name: "FrameworksResourceLoaderTests_ProviderTwo_Split",
+ manifest: "AndroidManifestSplit2.xml",
+ asset_dirs: ["provider2/assets"],
+ resource_dirs: ["provider2/res", "provider_stable/res"],
+ aaptflags: ["-0 .txt"]
+}
+
+android_test_helper_app {
+ name: "FrameworksResourceLoaderTests_ProviderThree_Split",
+ manifest: "AndroidManifestSplit3.xml",
+ asset_dirs: ["provider3/assets"],
+ resource_dirs: ["provider3/res", "provider_stable/res"],
+ aaptflags: ["-0 .txt"]
+}
+
+android_test_helper_app {
+ name: "FrameworksResourceLoaderTests_ProviderFour_Split",
+ manifest: "AndroidManifestSplit4.xml",
+ asset_dirs: ["provider4/assets"],
+ resource_dirs: ["provider4/res", "provider_stable/res"],
+ aaptflags: ["-0 .txt"]
+}
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/AndroidManifestApp.xml b/core/tests/ResourceLoaderTests/resources/AndroidManifestApp.xml
index 5dd8a96..c8a3590 100644
--- a/core/tests/ResourceLoaderTests/resources/AndroidManifestApp.xml
+++ b/core/tests/ResourceLoaderTests/resources/AndroidManifestApp.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2019 The Android Open Source Project
+ ~ 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.
@@ -15,12 +15,9 @@
~ limitations under the License.
-->
-<manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.content.res.loader.test"
- >
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.content.res.loader.test">
<uses-sdk android:minSdkVersion="1" android:targetSdkVersion="1" />
<application/>
-
</manifest>
diff --git a/core/tests/ResourceLoaderTests/resources/AndroidManifestFramework.xml b/core/tests/ResourceLoaderTests/resources/AndroidManifestFramework.xml
index 5a92ae9..d5fa83f 100644
--- a/core/tests/ResourceLoaderTests/resources/AndroidManifestFramework.xml
+++ b/core/tests/ResourceLoaderTests/resources/AndroidManifestFramework.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2019 The Android Open Source Project
+ ~ 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.
@@ -16,12 +16,9 @@
-->
<!-- Mocks the framework package name so that AAPT2 assigns the correct package -->
-<manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="android"
- >
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android">
<uses-sdk android:minSdkVersion="1" android:targetSdkVersion="1" />
<application/>
-
</manifest>
diff --git a/core/tests/ResourceLoaderTests/splits/SplitTwo/AndroidManifest.xml b/core/tests/ResourceLoaderTests/resources/AndroidManifestSplit1.xml
similarity index 90%
rename from core/tests/ResourceLoaderTests/splits/SplitTwo/AndroidManifest.xml
rename to core/tests/ResourceLoaderTests/resources/AndroidManifestSplit1.xml
index aad8c27..5cd4227 100644
--- a/core/tests/ResourceLoaderTests/splits/SplitTwo/AndroidManifest.xml
+++ b/core/tests/ResourceLoaderTests/resources/AndroidManifestSplit1.xml
@@ -18,7 +18,8 @@
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="android.content.res.loader.test"
- split="split_two"
+ split="FrameworksResourceLoaderTests_ProviderOne_Split"
+ android:isFeatureSplit="true"
>
<uses-sdk android:minSdkVersion="1" android:targetSdkVersion="1" />
diff --git a/core/tests/ResourceLoaderTests/splits/SplitFour/AndroidManifest.xml b/core/tests/ResourceLoaderTests/resources/AndroidManifestSplit2.xml
similarity index 90%
copy from core/tests/ResourceLoaderTests/splits/SplitFour/AndroidManifest.xml
copy to core/tests/ResourceLoaderTests/resources/AndroidManifestSplit2.xml
index 24a0a2a..b5180e6 100644
--- a/core/tests/ResourceLoaderTests/splits/SplitFour/AndroidManifest.xml
+++ b/core/tests/ResourceLoaderTests/resources/AndroidManifestSplit2.xml
@@ -18,7 +18,8 @@
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="android.content.res.loader.test"
- split="split_four"
+ split="FrameworksResourceLoaderTests_ProviderTwo_Split"
+ android:isFeatureSplit="true"
>
<uses-sdk android:minSdkVersion="1" android:targetSdkVersion="1" />
diff --git a/core/tests/ResourceLoaderTests/splits/SplitFour/AndroidManifest.xml b/core/tests/ResourceLoaderTests/resources/AndroidManifestSplit3.xml
similarity index 89%
copy from core/tests/ResourceLoaderTests/splits/SplitFour/AndroidManifest.xml
copy to core/tests/ResourceLoaderTests/resources/AndroidManifestSplit3.xml
index 24a0a2a..8ddb892 100644
--- a/core/tests/ResourceLoaderTests/splits/SplitFour/AndroidManifest.xml
+++ b/core/tests/ResourceLoaderTests/resources/AndroidManifestSplit3.xml
@@ -18,7 +18,8 @@
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="android.content.res.loader.test"
- split="split_four"
+ split="FrameworksResourceLoaderTests_ProviderThree_Split"
+ android:isFeatureSplit="true"
>
<uses-sdk android:minSdkVersion="1" android:targetSdkVersion="1" />
diff --git a/core/tests/ResourceLoaderTests/splits/SplitFour/AndroidManifest.xml b/core/tests/ResourceLoaderTests/resources/AndroidManifestSplit4.xml
similarity index 90%
rename from core/tests/ResourceLoaderTests/splits/SplitFour/AndroidManifest.xml
rename to core/tests/ResourceLoaderTests/resources/AndroidManifestSplit4.xml
index 24a0a2a..b6bf552 100644
--- a/core/tests/ResourceLoaderTests/splits/SplitFour/AndroidManifest.xml
+++ b/core/tests/ResourceLoaderTests/resources/AndroidManifestSplit4.xml
@@ -18,7 +18,8 @@
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="android.content.res.loader.test"
- split="split_four"
+ split="FrameworksResourceLoaderTests_ProviderFour_Split"
+ android:isFeatureSplit="true"
>
<uses-sdk android:minSdkVersion="1" android:targetSdkVersion="1" />
diff --git a/core/tests/ResourceLoaderTests/resources/compileAndLink.sh b/core/tests/ResourceLoaderTests/resources/compileAndLink.sh
deleted file mode 100755
index 8e05aef..0000000
--- a/core/tests/ResourceLoaderTests/resources/compileAndLink.sh
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/bin/bash
-# Copyright (C) 2019 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-aapt2=$1
-soong_zip=$2
-genDir=$3
-FRAMEWORK_RES_APK=$4
-inDir=$5
-
-# (String name, boolean retainFiles = false, String... files)
-function compileAndLink {
- moduleName=$1
- mkdir "$genDir"/out/"$moduleName"
-
- args=""
- for arg in "${@:4}"; do
- if [[ $arg == res* ]]; then
- args="$args $inDir/$arg"
- else
- args="$args $arg"
- fi
- done
-
- $aapt2 compile -o "$genDir"/out/"$moduleName" $args
-
- $aapt2 link \
- -I "$FRAMEWORK_RES_APK" \
- --manifest "$inDir"/"$3" \
- -o "$genDir"/out/"$moduleName"/apk.apk \
- "$genDir"/out/"$moduleName"/*.flat \
- --no-compress
-
- unzip -qq "$genDir"/out/"$moduleName"/apk.apk -d "$genDir"/out/"$moduleName"/unzip
-
- if [[ "$2" == "APK_WITHOUT_FILE" || "$2" == "BOTH_WITHOUT_FILE" ]]; then
- zip -q -d "$genDir"/out/"$moduleName"/apk.apk "res/*"
- cp "$genDir"/out/"$moduleName"/apk.apk "$genDir"/output/raw/"$moduleName"Apk.apk
- elif [[ "$2" == "APK" || "$2" == "BOTH" ]]; then
- cp "$genDir"/out/"$moduleName"/apk.apk "$genDir"/output/raw/"$moduleName"Apk.apk
- fi
-
- if [[ "$2" == "ARSC" || "$2" == "BOTH" || "$2" == "BOTH_WITHOUT_FILE" ]]; then
- zip -d "$genDir"/out/"$moduleName"/apk.apk "res/*"
- cp "$genDir"/out/"$moduleName"/unzip/resources.arsc "$genDir"/output/raw/"$moduleName"Arsc.arsc
- fi
-}
-
-rm -r "$genDir"/out
-rm -r "$genDir"/output
-rm -r "$genDir"/temp
-
-mkdir "$genDir"/out
-mkdir -p "$genDir"/output/raw
-mkdir -p "$genDir"/temp/res/drawable-nodpi
-mkdir -p "$genDir"/temp/res/layout
-
-compileAndLink stringOne BOTH AndroidManifestFramework.xml res/values/string_one.xml
-compileAndLink stringTwo BOTH AndroidManifestFramework.xml res/values/string_two.xml
-compileAndLink stringThree BOTH AndroidManifestFramework.xml res/values/string_three.xml
-compileAndLink stringFour BOTH AndroidManifestFramework.xml res/values/string_four.xml
-
-compileAndLink dimenOne BOTH AndroidManifestFramework.xml res/values/dimen_one.xml
-compileAndLink dimenTwo BOTH AndroidManifestFramework.xml res/values/dimen_two.xml
-compileAndLink dimenThree BOTH AndroidManifestFramework.xml res/values/dimen_three.xml
-compileAndLink dimenFour BOTH AndroidManifestFramework.xml res/values/dimen_four.xml
-
-compileAndLink drawableMdpiWithoutFile BOTH_WITHOUT_FILE AndroidManifestFramework.xml res/values/drawable_one.xml res/drawable-mdpi/ic_delete.png
-compileAndLink drawableMdpiWithFile APK AndroidManifestFramework.xml res/values/drawable_one.xml res/drawable-mdpi/ic_delete.png
-
-compileAndLink layoutWithoutFile BOTH_WITHOUT_FILE AndroidManifestFramework.xml res/values/activity_list_item_id.xml res/layout/activity_list_item.xml
-compileAndLink layoutWithFile APK AndroidManifestFramework.xml res/values/activity_list_item_id.xml res/layout/activity_list_item.xml
-
-cp -f "$inDir"/res/layout/layout_one.xml "$genDir"/temp/res/layout/layout.xml
-compileAndLink layoutOne ARSC AndroidManifestApp.xml "$genDir"/temp/res/layout/layout.xml res/values/layout_id.xml
-cp -f "$genDir"/out/layoutOne/unzip/res/layout/layout.xml "$genDir"/output/raw/layoutOne.xml
-
-cp -f "$inDir"/res/layout/layout_two.xml "$genDir"/temp/res/layout/layout.xml
-compileAndLink layoutTwo ARSC AndroidManifestApp.xml "$genDir"/temp/res/layout/layout.xml res/values/layout_id.xml
-cp -f "$genDir"/out/layoutTwo/unzip/res/layout/layout.xml "$genDir"/output/raw/layoutTwo.xml
-
-cp -f "$inDir"/res/layout/layout_three.xml "$genDir"/temp/res/layout/layout.xml
-compileAndLink layoutThree ARSC AndroidManifestApp.xml "$genDir"/temp/res/layout/layout.xml res/values/layout_id.xml
-cp -f "$genDir"/out/layoutThree/unzip/res/layout/layout.xml "$genDir"/output/raw/layoutThree.xml
-
-cp -f "$inDir"/res/layout/layout_four.xml "$genDir"/temp/res/layout/layout.xml
-compileAndLink layoutFour ARSC AndroidManifestApp.xml "$genDir"/temp/res/layout/layout.xml res/values/layout_id.xml
-cp -f "$genDir"/out/layoutFour/unzip/res/layout/layout.xml "$genDir"/output/raw/layoutFour.xml
-
-drawableNoDpi="/res/drawable-nodpi"
-inDirDrawableNoDpi="$inDir$drawableNoDpi"
-
-cp -f "$inDirDrawableNoDpi"/nonAssetDrawableOne.xml "$genDir"/temp/res/drawable-nodpi/non_asset_drawable.xml
-compileAndLink nonAssetDrawableOne ARSC AndroidManifestApp.xml "$genDir"/temp/res/drawable-nodpi/non_asset_drawable.xml res/values/non_asset_drawable_id.xml
-cp -f "$genDir"/out/nonAssetDrawableOne/unzip/res/drawable-nodpi-v4/non_asset_drawable.xml "$genDir"/output/raw/nonAssetDrawableOne.xml
-
-cp -f "$inDirDrawableNoDpi"/nonAssetDrawableTwo.xml "$genDir"/temp/res/drawable-nodpi/non_asset_drawable.xml
-compileAndLink nonAssetDrawableTwo ARSC AndroidManifestApp.xml "$genDir"/temp/res/drawable-nodpi/non_asset_drawable.xml res/values/non_asset_drawable_id.xml
-cp -f "$genDir"/out/nonAssetDrawableTwo/unzip/res/drawable-nodpi-v4/non_asset_drawable.xml "$genDir"/output/raw/nonAssetDrawableTwo.xml
-
-cp -f "$inDirDrawableNoDpi"/nonAssetDrawableThree.xml "$genDir"/temp/res/drawable-nodpi/non_asset_drawable.xml
-compileAndLink nonAssetDrawableThree ARSC AndroidManifestApp.xml "$genDir"/temp/res/drawable-nodpi/non_asset_drawable.xml res/values/non_asset_drawable_id.xml
-cp -f "$genDir"/out/nonAssetDrawableThree/unzip/res/drawable-nodpi-v4/non_asset_drawable.xml "$genDir"/output/raw/nonAssetDrawableThree.xml
-
-cp -f "$inDirDrawableNoDpi"/nonAssetDrawableFour.xml "$genDir"/temp/res/drawable-nodpi/non_asset_drawable.xml
-compileAndLink nonAssetDrawableFour ARSC AndroidManifestApp.xml "$genDir"/temp/res/drawable-nodpi/non_asset_drawable.xml res/values/non_asset_drawable_id.xml
-cp -f "$genDir"/out/nonAssetDrawableFour/unzip/res/drawable-nodpi-v4/non_asset_drawable.xml "$genDir"/output/raw/nonAssetDrawableFour.xml
-
-cp -f "$inDirDrawableNoDpi"/nonAssetBitmapRed.png "$genDir"/temp/res/drawable-nodpi/non_asset_bitmap.png
-compileAndLink nonAssetBitmapRed BOTH AndroidManifestApp.xml "$genDir"/temp/res/drawable-nodpi/non_asset_bitmap.png res/values/non_asset_bitmap_id.xml
-cp -f "$genDir"/out/nonAssetBitmapRed/unzip/res/drawable-nodpi-v4/non_asset_bitmap.png "$genDir"/output/raw/nonAssetBitmapRed.png
-
-cp -f "$inDirDrawableNoDpi"/nonAssetBitmapGreen.png "$genDir"/temp/res/drawable-nodpi/non_asset_bitmap.png
-compileAndLink nonAssetBitmapGreen BOTH AndroidManifestApp.xml "$genDir"/temp/res/drawable-nodpi/non_asset_bitmap.png res/values/non_asset_bitmap_id.xml
-cp -f "$genDir"/out/nonAssetBitmapGreen/unzip/res/drawable-nodpi-v4/non_asset_bitmap.png "$genDir"/output/raw/nonAssetBitmapGreen.png
-
-cp -f "$inDirDrawableNoDpi"/nonAssetBitmapBlue.png "$genDir"/temp/res/drawable-nodpi/non_asset_bitmap.png
-compileAndLink nonAssetBitmapBlue ARSC AndroidManifestApp.xml "$genDir"/temp/res/drawable-nodpi/non_asset_bitmap.png res/values/non_asset_bitmap_id.xml
-cp -f "$genDir"/out/nonAssetBitmapBlue/unzip/res/drawable-nodpi-v4/non_asset_bitmap.png "$genDir"/output/raw/nonAssetBitmapBlue.png
-
-cp -f "$inDirDrawableNoDpi"/nonAssetBitmapWhite.png "$genDir"/temp/res/drawable-nodpi/non_asset_bitmap.png
-compileAndLink nonAssetBitmapWhite ARSC AndroidManifestApp.xml "$genDir"/temp/res/drawable-nodpi/non_asset_bitmap.png res/values/non_asset_bitmap_id.xml
-cp -f "$genDir"/out/nonAssetBitmapWhite/unzip/res/drawable-nodpi-v4/non_asset_bitmap.png "$genDir"/output/raw/nonAssetBitmapWhite.png
-
-$soong_zip -o "$genDir"/out.zip -C "$genDir"/output/ -D "$genDir"/output/
diff --git a/core/tests/ResourceLoaderTests/resources/res/drawable-mdpi/ic_delete.png b/core/tests/ResourceLoaderTests/resources/framework/res/drawable-mdpi/ic_delete.png
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/drawable-mdpi/ic_delete.png
rename to core/tests/ResourceLoaderTests/resources/framework/res/drawable-mdpi/ic_delete.png
Binary files differ
diff --git a/core/tests/ResourceLoaderTests/resources/res/layout/activity_list_item.xml b/core/tests/ResourceLoaderTests/resources/framework/res/layout/activity_list_item.xml
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/layout/activity_list_item.xml
rename to core/tests/ResourceLoaderTests/resources/framework/res/layout/activity_list_item.xml
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/string_three.xml b/core/tests/ResourceLoaderTests/resources/framework/res/values/public.xml
similarity index 84%
rename from core/tests/ResourceLoaderTests/resources/res/values/string_three.xml
rename to core/tests/ResourceLoaderTests/resources/framework/res/values/public.xml
index 82cd6ec..2e50182 100644
--- a/core/tests/ResourceLoaderTests/resources/res/values/string_three.xml
+++ b/core/tests/ResourceLoaderTests/resources/framework/res/values/public.xml
@@ -16,6 +16,7 @@
-->
<resources>
+ <public type="drawable" name="ic_delete" id="0x0108001d" />
+ <public type="layout" name="activity_list_item" id="0x01090000" />
<public type="string" name="cancel" id="0x01040000" />
- <string name="cancel">SomeRidiculouslyUnlikelyStringThree</string>
-</resources>
+</resources>
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/dimen_four.xml b/core/tests/ResourceLoaderTests/resources/framework/res/values/values.xml
similarity index 85%
rename from core/tests/ResourceLoaderTests/resources/res/values/dimen_four.xml
rename to core/tests/ResourceLoaderTests/resources/framework/res/values/values.xml
index 5b30eba..5f6e90c 100644
--- a/core/tests/ResourceLoaderTests/resources/res/values/dimen_four.xml
+++ b/core/tests/ResourceLoaderTests/resources/framework/res/values/values.xml
@@ -16,6 +16,5 @@
-->
<resources>
- <public type="dimen" name="app_icon_size" id="0x01050000" />
- <dimen name="app_icon_size">400dp</dimen>
+ <string name="cancel">SomeRidiculouslyUnlikelyString</string>
</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/provider1/assets/asset.txt b/core/tests/ResourceLoaderTests/resources/provider1/assets/asset.txt
new file mode 100644
index 0000000..6dcd8e4
--- /dev/null
+++ b/core/tests/ResourceLoaderTests/resources/provider1/assets/asset.txt
@@ -0,0 +1 @@
+One
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/provider1/assets/loader_asset.txt b/core/tests/ResourceLoaderTests/resources/provider1/assets/loader_asset.txt
new file mode 100644
index 0000000..0e41ffa
--- /dev/null
+++ b/core/tests/ResourceLoaderTests/resources/provider1/assets/loader_asset.txt
@@ -0,0 +1 @@
+LoaderOne
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetBitmapRed.png b/core/tests/ResourceLoaderTests/resources/provider1/res/drawable-nodpi/drawable_png.png
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetBitmapRed.png
rename to core/tests/ResourceLoaderTests/resources/provider1/res/drawable-nodpi/drawable_png.png
Binary files differ
diff --git a/core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetDrawableOne.xml b/core/tests/ResourceLoaderTests/resources/provider1/res/drawable-nodpi/drawable_xml.xml
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetDrawableOne.xml
rename to core/tests/ResourceLoaderTests/resources/provider1/res/drawable-nodpi/drawable_xml.xml
diff --git a/core/tests/ResourceLoaderTests/resources/res/layout/layout_one.xml b/core/tests/ResourceLoaderTests/resources/provider1/res/layout/layout.xml
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/layout/layout_one.xml
rename to core/tests/ResourceLoaderTests/resources/provider1/res/layout/layout.xml
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/string_three.xml b/core/tests/ResourceLoaderTests/resources/provider1/res/values/values.xml
similarity index 79%
copy from core/tests/ResourceLoaderTests/resources/res/values/string_three.xml
copy to core/tests/ResourceLoaderTests/resources/provider1/res/values/values.xml
index 82cd6ec..5ef75d5 100644
--- a/core/tests/ResourceLoaderTests/resources/res/values/string_three.xml
+++ b/core/tests/ResourceLoaderTests/resources/provider1/res/values/values.xml
@@ -16,6 +16,9 @@
-->
<resources>
- <public type="string" name="cancel" id="0x01040000" />
- <string name="cancel">SomeRidiculouslyUnlikelyStringThree</string>
-</resources>
+ <dimen name="test">100dp</dimen>
+ <string name="test">One</string>
+
+ <string name="additional">One</string>
+ <public type="string" name="additional" id="0x7f0400fe" />
+</resources>
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/provider2/assets/asset.txt b/core/tests/ResourceLoaderTests/resources/provider2/assets/asset.txt
new file mode 100644
index 0000000..5673baa
--- /dev/null
+++ b/core/tests/ResourceLoaderTests/resources/provider2/assets/asset.txt
@@ -0,0 +1 @@
+Two
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/provider2/assets/loader_asset.txt b/core/tests/ResourceLoaderTests/resources/provider2/assets/loader_asset.txt
new file mode 100644
index 0000000..bca782e
--- /dev/null
+++ b/core/tests/ResourceLoaderTests/resources/provider2/assets/loader_asset.txt
@@ -0,0 +1 @@
+LoaderTwo
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetBitmapGreen.png b/core/tests/ResourceLoaderTests/resources/provider2/res/drawable-nodpi/drawable_png.png
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetBitmapGreen.png
rename to core/tests/ResourceLoaderTests/resources/provider2/res/drawable-nodpi/drawable_png.png
Binary files differ
diff --git a/core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetDrawableTwo.xml b/core/tests/ResourceLoaderTests/resources/provider2/res/drawable-nodpi/drawable_xml.xml
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetDrawableTwo.xml
rename to core/tests/ResourceLoaderTests/resources/provider2/res/drawable-nodpi/drawable_xml.xml
diff --git a/core/tests/ResourceLoaderTests/resources/res/layout/layout_two.xml b/core/tests/ResourceLoaderTests/resources/provider2/res/layout/layout.xml
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/layout/layout_two.xml
rename to core/tests/ResourceLoaderTests/resources/provider2/res/layout/layout.xml
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/string_three.xml b/core/tests/ResourceLoaderTests/resources/provider2/res/values/values.xml
similarity index 79%
copy from core/tests/ResourceLoaderTests/resources/res/values/string_three.xml
copy to core/tests/ResourceLoaderTests/resources/provider2/res/values/values.xml
index 82cd6ec..387c519 100644
--- a/core/tests/ResourceLoaderTests/resources/res/values/string_three.xml
+++ b/core/tests/ResourceLoaderTests/resources/provider2/res/values/values.xml
@@ -16,6 +16,9 @@
-->
<resources>
- <public type="string" name="cancel" id="0x01040000" />
- <string name="cancel">SomeRidiculouslyUnlikelyStringThree</string>
-</resources>
+ <dimen name="test">200dp</dimen>
+ <string name="test">Two</string>
+
+ <string name="additional">Two</string>
+ <public type="string" name="additional" id="0x7f0400fe" />
+</resources>
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/provider3/assets/asset.txt b/core/tests/ResourceLoaderTests/resources/provider3/assets/asset.txt
new file mode 100644
index 0000000..368c34d
--- /dev/null
+++ b/core/tests/ResourceLoaderTests/resources/provider3/assets/asset.txt
@@ -0,0 +1 @@
+Three
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/provider3/assets/loader_asset.txt b/core/tests/ResourceLoaderTests/resources/provider3/assets/loader_asset.txt
new file mode 100644
index 0000000..bae8ef7
--- /dev/null
+++ b/core/tests/ResourceLoaderTests/resources/provider3/assets/loader_asset.txt
@@ -0,0 +1 @@
+LoaderThree
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetBitmapBlue.png b/core/tests/ResourceLoaderTests/resources/provider3/res/drawable-nodpi/drawable_png.png
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetBitmapBlue.png
rename to core/tests/ResourceLoaderTests/resources/provider3/res/drawable-nodpi/drawable_png.png
Binary files differ
diff --git a/core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetDrawableThree.xml b/core/tests/ResourceLoaderTests/resources/provider3/res/drawable-nodpi/drawable_xml.xml
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetDrawableThree.xml
rename to core/tests/ResourceLoaderTests/resources/provider3/res/drawable-nodpi/drawable_xml.xml
diff --git a/core/tests/ResourceLoaderTests/resources/res/layout/layout_three.xml b/core/tests/ResourceLoaderTests/resources/provider3/res/layout/layout.xml
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/layout/layout_three.xml
rename to core/tests/ResourceLoaderTests/resources/provider3/res/layout/layout.xml
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/string_three.xml b/core/tests/ResourceLoaderTests/resources/provider3/res/values/values.xml
similarity index 78%
copy from core/tests/ResourceLoaderTests/resources/res/values/string_three.xml
copy to core/tests/ResourceLoaderTests/resources/provider3/res/values/values.xml
index 82cd6ec..ab75bfa 100644
--- a/core/tests/ResourceLoaderTests/resources/res/values/string_three.xml
+++ b/core/tests/ResourceLoaderTests/resources/provider3/res/values/values.xml
@@ -16,6 +16,9 @@
-->
<resources>
- <public type="string" name="cancel" id="0x01040000" />
- <string name="cancel">SomeRidiculouslyUnlikelyStringThree</string>
-</resources>
+ <dimen name="test">300dp</dimen>
+ <string name="test">Three</string>
+
+ <string name="additional">Three</string>
+ <public type="string" name="additional" id="0x7f0400fe" />
+</resources>
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/provider4/assets/asset.txt b/core/tests/ResourceLoaderTests/resources/provider4/assets/asset.txt
new file mode 100644
index 0000000..ad70cdd
--- /dev/null
+++ b/core/tests/ResourceLoaderTests/resources/provider4/assets/asset.txt
@@ -0,0 +1 @@
+Four
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/provider4/assets/loader_asset.txt b/core/tests/ResourceLoaderTests/resources/provider4/assets/loader_asset.txt
new file mode 100644
index 0000000..b75d996
--- /dev/null
+++ b/core/tests/ResourceLoaderTests/resources/provider4/assets/loader_asset.txt
@@ -0,0 +1 @@
+LoaderFour
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetBitmapWhite.png b/core/tests/ResourceLoaderTests/resources/provider4/res/drawable-nodpi/drawable_png.png
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetBitmapWhite.png
rename to core/tests/ResourceLoaderTests/resources/provider4/res/drawable-nodpi/drawable_png.png
Binary files differ
diff --git a/core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetDrawableFour.xml b/core/tests/ResourceLoaderTests/resources/provider4/res/drawable-nodpi/drawable_xml.xml
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/drawable-nodpi/nonAssetDrawableFour.xml
rename to core/tests/ResourceLoaderTests/resources/provider4/res/drawable-nodpi/drawable_xml.xml
diff --git a/core/tests/ResourceLoaderTests/resources/res/layout/layout_four.xml b/core/tests/ResourceLoaderTests/resources/provider4/res/layout/layout.xml
similarity index 100%
rename from core/tests/ResourceLoaderTests/resources/res/layout/layout_four.xml
rename to core/tests/ResourceLoaderTests/resources/provider4/res/layout/layout.xml
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/string_three.xml b/core/tests/ResourceLoaderTests/resources/provider4/res/values/values.xml
similarity index 78%
copy from core/tests/ResourceLoaderTests/resources/res/values/string_three.xml
copy to core/tests/ResourceLoaderTests/resources/provider4/res/values/values.xml
index 82cd6ec..896993e 100644
--- a/core/tests/ResourceLoaderTests/resources/res/values/string_three.xml
+++ b/core/tests/ResourceLoaderTests/resources/provider4/res/values/values.xml
@@ -16,6 +16,9 @@
-->
<resources>
- <public type="string" name="cancel" id="0x01040000" />
- <string name="cancel">SomeRidiculouslyUnlikelyStringThree</string>
-</resources>
+ <dimen name="test">400dp</dimen>
+ <string name="test">Four</string>
+
+ <string name="additional">Four</string>
+ <public type="string" name="additional" id="0x7f0400fe" />
+</resources>
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/dimen_four.xml b/core/tests/ResourceLoaderTests/resources/provider_additional/res/values/values.xml
similarity index 85%
copy from core/tests/ResourceLoaderTests/resources/res/values/dimen_four.xml
copy to core/tests/ResourceLoaderTests/resources/provider_additional/res/values/values.xml
index 5b30eba..29918d7 100644
--- a/core/tests/ResourceLoaderTests/resources/res/values/dimen_four.xml
+++ b/core/tests/ResourceLoaderTests/resources/provider_additional/res/values/values.xml
@@ -16,6 +16,5 @@
-->
<resources>
- <public type="dimen" name="app_icon_size" id="0x01050000" />
- <dimen name="app_icon_size">400dp</dimen>
+ <public type="string" name="additional" id="0x7f0400fe" />
</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/string_three.xml b/core/tests/ResourceLoaderTests/resources/provider_stable/res/values/public.xml
similarity index 69%
copy from core/tests/ResourceLoaderTests/resources/res/values/string_three.xml
copy to core/tests/ResourceLoaderTests/resources/provider_stable/res/values/public.xml
index 82cd6ec..269c40f 100644
--- a/core/tests/ResourceLoaderTests/resources/res/values/string_three.xml
+++ b/core/tests/ResourceLoaderTests/resources/provider_stable/res/values/public.xml
@@ -16,6 +16,9 @@
-->
<resources>
- <public type="string" name="cancel" id="0x01040000" />
- <string name="cancel">SomeRidiculouslyUnlikelyStringThree</string>
-</resources>
+ <public type="dimen" name="test" id="0x7f010000" />
+ <public type="drawable" name="drawable_png" id="0x7f020000" />
+ <public type="drawable" name="drawable_xml" id="0x7f020001" />
+ <public type="layout" name="layout" id="0x7f030000" />
+ <public type="string" name="test" id="0x7f040000" />
+</resources>
\ No newline at end of file
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/activity_list_item_id.xml b/core/tests/ResourceLoaderTests/resources/res/values/activity_list_item_id.xml
deleted file mode 100644
index a552431..0000000
--- a/core/tests/ResourceLoaderTests/resources/res/values/activity_list_item_id.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<resources>
- <public type="layout" name="activity_list_item" id="0x01090000" />
-</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/dimen_one.xml b/core/tests/ResourceLoaderTests/resources/res/values/dimen_one.xml
deleted file mode 100644
index b17ec1c..0000000
--- a/core/tests/ResourceLoaderTests/resources/res/values/dimen_one.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<resources>
- <public type="dimen" name="app_icon_size" id="0x01050000" />
- <dimen name="app_icon_size">100dp</dimen>
-</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/dimen_three.xml b/core/tests/ResourceLoaderTests/resources/res/values/dimen_three.xml
deleted file mode 100644
index 07a35ce..0000000
--- a/core/tests/ResourceLoaderTests/resources/res/values/dimen_three.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2020 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
- <public type="dimen" name="app_icon_size" id="0x01050000" />
- <dimen name="app_icon_size">300dp</dimen>
-</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/dimen_two.xml b/core/tests/ResourceLoaderTests/resources/res/values/dimen_two.xml
deleted file mode 100644
index 570b40a..0000000
--- a/core/tests/ResourceLoaderTests/resources/res/values/dimen_two.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<resources>
- <public type="dimen" name="app_icon_size" id="0x01050000" />
- <dimen name="app_icon_size">200dp</dimen>
-</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/drawable_one.xml b/core/tests/ResourceLoaderTests/resources/res/values/drawable_one.xml
deleted file mode 100644
index b5b4dfd..0000000
--- a/core/tests/ResourceLoaderTests/resources/res/values/drawable_one.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<resources>
- <public type="drawable" name="ic_delete" id="0x0108001d" />
-</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/layout_id.xml b/core/tests/ResourceLoaderTests/resources/res/values/layout_id.xml
deleted file mode 100644
index 4962a07..0000000
--- a/core/tests/ResourceLoaderTests/resources/res/values/layout_id.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
- <public type="layout" name="layout" id="0x7f020000" />
-</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/non_asset_drawable_id.xml b/core/tests/ResourceLoaderTests/resources/res/values/non_asset_drawable_id.xml
deleted file mode 100644
index bdd6f58..0000000
--- a/core/tests/ResourceLoaderTests/resources/res/values/non_asset_drawable_id.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
- <public type="drawable" name="non_asset_drawable" id="0x7f010001" />
-</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/string_four.xml b/core/tests/ResourceLoaderTests/resources/res/values/string_four.xml
deleted file mode 100644
index 8789bcd..0000000
--- a/core/tests/ResourceLoaderTests/resources/res/values/string_four.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2020 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
- <public type="string" name="cancel" id="0x01040000" />
- <string name="cancel">SomeRidiculouslyUnlikelyStringFour</string>
-</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/string_one.xml b/core/tests/ResourceLoaderTests/resources/res/values/string_one.xml
deleted file mode 100644
index 4fc5272..0000000
--- a/core/tests/ResourceLoaderTests/resources/res/values/string_one.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<resources>
- <public type="string" name="cancel" id="0x01040000" />
- <string name="cancel">SomeRidiculouslyUnlikelyStringOne</string>
-</resources>
diff --git a/core/tests/ResourceLoaderTests/resources/res/values/string_two.xml b/core/tests/ResourceLoaderTests/resources/res/values/string_two.xml
deleted file mode 100644
index 3604d7b..0000000
--- a/core/tests/ResourceLoaderTests/resources/res/values/string_two.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<resources>
- <public type="string" name="cancel" id="0x01040000" />
- <string name="cancel">SomeRidiculouslyUnlikelyStringTwo</string>
-</resources>
diff --git a/core/tests/ResourceLoaderTests/splits/SplitFour/Android.bp b/core/tests/ResourceLoaderTests/splits/SplitFour/Android.bp
deleted file mode 100644
index eb4d8e1..0000000
--- a/core/tests/ResourceLoaderTests/splits/SplitFour/Android.bp
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Copyright (C) 2019 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-android_test_helper_app {
- name: "FrameworksResourceLoaderTestsSplitFour"
-}
diff --git a/core/tests/ResourceLoaderTests/splits/SplitFour/res/values/string_split.xml b/core/tests/ResourceLoaderTests/splits/SplitFour/res/values/string_split.xml
deleted file mode 100644
index 4759db9..0000000
--- a/core/tests/ResourceLoaderTests/splits/SplitFour/res/values/string_split.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2020 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
- <public type="string" name="split_overlaid" id="0x7f040001" />
- <string name="split_overlaid">Split FOUR Overlaid</string>
-</resources>
diff --git a/core/tests/ResourceLoaderTests/splits/SplitOne/Android.bp b/core/tests/ResourceLoaderTests/splits/SplitOne/Android.bp
deleted file mode 100644
index 897897f..0000000
--- a/core/tests/ResourceLoaderTests/splits/SplitOne/Android.bp
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Copyright (C) 2019 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-android_test_helper_app {
- name: "FrameworksResourceLoaderTestsSplitOne"
-}
diff --git a/core/tests/ResourceLoaderTests/splits/SplitOne/AndroidManifest.xml b/core/tests/ResourceLoaderTests/splits/SplitOne/AndroidManifest.xml
deleted file mode 100644
index b14bd86..0000000
--- a/core/tests/ResourceLoaderTests/splits/SplitOne/AndroidManifest.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.content.res.loader.test"
- split="split_one"
- >
-
- <uses-sdk android:minSdkVersion="1" android:targetSdkVersion="1" />
- <application android:hasCode="false" />
-
-</manifest>
diff --git a/core/tests/ResourceLoaderTests/splits/SplitOne/res/values/string_split.xml b/core/tests/ResourceLoaderTests/splits/SplitOne/res/values/string_split.xml
deleted file mode 100644
index 3c215eb..0000000
--- a/core/tests/ResourceLoaderTests/splits/SplitOne/res/values/string_split.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
- <public type="string" name="split_overlaid" id="0x7f040001" />
- <string name="split_overlaid">Split ONE Overlaid</string>
-</resources>
diff --git a/core/tests/ResourceLoaderTests/splits/SplitThree/Android.bp b/core/tests/ResourceLoaderTests/splits/SplitThree/Android.bp
deleted file mode 100644
index bf98a74..0000000
--- a/core/tests/ResourceLoaderTests/splits/SplitThree/Android.bp
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Copyright (C) 2019 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-android_test_helper_app {
- name: "FrameworksResourceLoaderTestsSplitThree"
-}
diff --git a/core/tests/ResourceLoaderTests/splits/SplitThree/AndroidManifest.xml b/core/tests/ResourceLoaderTests/splits/SplitThree/AndroidManifest.xml
deleted file mode 100644
index ae1579b..0000000
--- a/core/tests/ResourceLoaderTests/splits/SplitThree/AndroidManifest.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2020 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.content.res.loader.test"
- split="split_three"
- >
-
- <uses-sdk android:minSdkVersion="1" android:targetSdkVersion="1" />
- <application android:hasCode="false" />
-
-</manifest>
diff --git a/core/tests/ResourceLoaderTests/splits/SplitThree/res/values/string_spli.xml b/core/tests/ResourceLoaderTests/splits/SplitThree/res/values/string_spli.xml
deleted file mode 100644
index 97682aa..0000000
--- a/core/tests/ResourceLoaderTests/splits/SplitThree/res/values/string_spli.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2020 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
- <public type="string" name="split_overlaid" id="0x7f040001" />
- <string name="split_overlaid">Split THREE Overlaid</string>
-</resources>
diff --git a/core/tests/ResourceLoaderTests/splits/SplitTwo/Android.bp b/core/tests/ResourceLoaderTests/splits/SplitTwo/Android.bp
deleted file mode 100644
index 4582808..0000000
--- a/core/tests/ResourceLoaderTests/splits/SplitTwo/Android.bp
+++ /dev/null
@@ -1,19 +0,0 @@
-//
-// Copyright (C) 2019 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-android_test_helper_app {
- name: "FrameworksResourceLoaderTestsSplitTwo"
-}
diff --git a/core/tests/ResourceLoaderTests/splits/SplitTwo/res/values/string_split.xml b/core/tests/ResourceLoaderTests/splits/SplitTwo/res/values/string_split.xml
deleted file mode 100644
index a367063..0000000
--- a/core/tests/ResourceLoaderTests/splits/SplitTwo/res/values/string_split.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2019 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License.
- -->
-
-<resources>
- <public type="string" name="split_overlaid" id="0x7f040001" />
- <string name="split_overlaid">Split TWO Overlaid</string>
-</resources>
diff --git a/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/DirectoryAssetsProviderTest.kt b/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/DirectoryAssetsProviderTest.kt
deleted file mode 100644
index afe9d7f..0000000
--- a/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/DirectoryAssetsProviderTest.kt
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.content.res.loader.test
-
-import android.content.res.loader.AssetsProvider
-import android.content.res.loader.DirectoryAssetsProvider
-import android.content.res.loader.ResourcesLoader
-import android.graphics.Color
-import android.graphics.drawable.BitmapDrawable
-import android.graphics.drawable.ColorDrawable
-import com.google.common.truth.Truth.assertThat
-import org.junit.After
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.TestName
-import java.io.File
-
-class DirectoryAssetsProviderTest : ResourceLoaderTestBase() {
-
- @get:Rule
- val testName = TestName()
-
- private lateinit var testDir: File
- private lateinit var assetsProvider: AssetsProvider
- private lateinit var loader: ResourcesLoader
-
- @Before
- fun setUpTestDir() {
- testDir = context.filesDir.resolve("DirectoryAssetsProvider_${testName.methodName}")
- assetsProvider = DirectoryAssetsProvider(testDir)
- loader = ResourcesLoader()
- resources.addLoaders(loader)
- }
-
- @After
- fun deleteTestFiles() {
- testDir.deleteRecursively()
- }
-
- @Test
- fun loadDrawableXml() {
- "nonAssetDrawableOne" writeTo "res/drawable-nodpi-v4/non_asset_drawable.xml"
- val provider = openArsc("nonAssetDrawableOne", assetsProvider)
-
- fun getValue() = (resources.getDrawable(R.drawable.non_asset_drawable) as ColorDrawable)
- .color
-
- assertThat(getValue()).isEqualTo(Color.parseColor("#B2D2F2"))
-
- loader.addProvider(provider)
-
- assertThat(getValue()).isEqualTo(Color.parseColor("#000001"))
- }
-
- @Test
- fun loadDrawableBitmap() {
- "nonAssetBitmapGreen" writeTo "res/drawable-nodpi-v4/non_asset_bitmap.png"
- val provider = openArsc("nonAssetBitmapGreen", assetsProvider)
-
- fun getValue() = (resources.getDrawable(R.drawable.non_asset_bitmap) as BitmapDrawable)
- .bitmap.getColor(0, 0).toArgb()
-
- assertThat(getValue()).isEqualTo(Color.MAGENTA)
-
- loader.addProvider(provider)
-
- assertThat(getValue()).isEqualTo(Color.GREEN)
- }
-
- @Test
- fun loadXml() {
- "layoutOne" writeTo "res/layout/layout.xml"
- val provider = openArsc("layoutOne", assetsProvider)
-
- fun getValue() = resources.getLayout(R.layout.layout).advanceToRoot().name
-
- assertThat(getValue()).isEqualTo("MysteryLayout")
-
- loader.addProvider(provider)
-
- assertThat(getValue()).isEqualTo("RelativeLayout")
- }
-
- private infix fun String.writeTo(path: String) {
- val testFile = testDir.resolve(path)
- testFile.parentFile!!.mkdirs()
- resources.openRawResource(rawFile(this))
- .copyTo(testFile.outputStream())
- }
-}
diff --git a/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/ResourceLoaderAssetsTest.kt b/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/ResourceLoaderAssetsTest.kt
deleted file mode 100644
index da5092d..0000000
--- a/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/ResourceLoaderAssetsTest.kt
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.content.res.loader.test
-
-import android.content.res.AssetManager
-import android.content.res.loader.AssetsProvider
-import android.content.res.loader.DirectoryAssetsProvider
-import android.content.res.loader.ResourcesLoader
-import android.content.res.loader.ResourcesProvider
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.rules.TestName
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-import org.mockito.Mockito.anyInt
-import org.mockito.Mockito.anyString
-import org.mockito.Mockito.doAnswer
-import org.mockito.Mockito.doReturn
-import org.mockito.Mockito.eq
-import org.mockito.Mockito.inOrder
-import org.mockito.Mockito.mock
-import java.io.File
-import java.io.FileNotFoundException
-import java.io.IOException
-import java.nio.file.Paths
-
-@RunWith(Parameterized::class)
-class ResourceLoaderAssetsTest : ResourceLoaderTestBase() {
-
- companion object {
- private const val BASE_TEST_PATH = "android/content/res/loader/test/file.txt"
- private const val TEST_TEXT = "some text"
-
- @JvmStatic
- @Parameterized.Parameters(name = "{0}")
- fun parameters(): Array<Array<out Any?>> {
- val fromInputStream: AssetsProvider.(String) -> Any? = {
- loadAsset(eq(it), anyInt())
- }
-
- val fromFileDescriptor: AssetsProvider.(String) -> Any? = {
- loadAssetParcelFd(eq(it))
- }
-
- val openAsset: AssetManager.() -> String? = {
- open(BASE_TEST_PATH).reader().readText()
- }
-
- val openNonAsset: AssetManager.() -> String? = {
- openNonAssetFd(BASE_TEST_PATH).readText()
- }
-
- return arrayOf(
- arrayOf("assets", fromInputStream, openAsset),
- arrayOf("", fromFileDescriptor, openNonAsset)
- )
- }
- }
-
- @get:Rule
- val testName = TestName()
-
- @JvmField
- @field:Parameterized.Parameter(0)
- var prefix: String? = null
-
- @field:Parameterized.Parameter(1)
- lateinit var loadAssetFunction: AssetsProvider.(String) -> Any?
-
- @field:Parameterized.Parameter(2)
- lateinit var openAssetFunction: AssetManager.() -> String?
-
- private val testPath: String
- get() = Paths.get(prefix.orEmpty(), BASE_TEST_PATH).toString()
-
- private fun AssetsProvider.loadAsset() = loadAssetFunction(testPath)
-
- private fun AssetManager.openAsset() = openAssetFunction()
-
- private lateinit var testDir: File
-
- @Before
- fun setUpTestDir() {
- testDir = context.filesDir.resolve("DirectoryAssetsProvider_${testName.methodName}")
- testDir.resolve(testPath).apply { parentFile!!.mkdirs() }.writeText(TEST_TEXT)
- }
-
- @Test
- fun multipleProvidersSearchesBackwards() {
- // DirectoryResourceLoader relies on a private field and can't be spied directly, so wrap it
- val assetsProvider = DirectoryAssetsProvider(testDir)
- val assetProviderWrapper = mock(AssetsProvider::class.java).apply {
- doAnswer { assetsProvider.loadAsset(it.arguments[0] as String, it.arguments[1] as Int) }
- .`when`(this).loadAsset(anyString(), anyInt())
- doAnswer { assetsProvider.loadAssetParcelFd(it.arguments[0] as String) }
- .`when`(this).loadAssetParcelFd(anyString())
- }
-
- val one = ResourcesProvider.empty(assetProviderWrapper)
- val two = mockProvider {
- doReturn(null).`when`(it).loadAsset()
- }
-
- val loader = ResourcesLoader()
- loader.providers = listOf(one, two)
- resources.addLoaders(loader)
-
- assertOpenedAsset()
- inOrder(two.assetsProvider, one.assetsProvider).apply {
- verify(two.assetsProvider)?.loadAsset()
- verify(one.assetsProvider)?.loadAsset()
- }
- }
-
- @Test
- fun multipleLoadersSearchesBackwards() {
- // DirectoryResourceLoader relies on a private field and can't be spied directly, so wrap it
- val assetsProvider = DirectoryAssetsProvider(testDir)
- val assetProviderWrapper = mock(AssetsProvider::class.java).apply {
- doAnswer { assetsProvider.loadAsset(it.arguments[0] as String, it.arguments[1] as Int) }
- .`when`(this).loadAsset(anyString(), anyInt())
- doAnswer { assetsProvider.loadAssetParcelFd(it.arguments[0] as String) }
- .`when`(this).loadAssetParcelFd(anyString())
- }
-
- val one = ResourcesProvider.empty(assetProviderWrapper)
- val two = mockProvider {
- doReturn(null).`when`(it).loadAsset()
- }
-
- val loader1 = ResourcesLoader()
- loader1.addProvider(one)
- val loader2 = ResourcesLoader()
- loader2.addProvider(two)
-
- resources.addLoaders(loader1, loader2)
-
- assertOpenedAsset()
- inOrder(two.assetsProvider, one.assetsProvider).apply {
- verify(two.assetsProvider)?.loadAsset()
- verify(one.assetsProvider)?.loadAsset()
- }
- }
-
- @Test(expected = FileNotFoundException::class)
- fun failToFindThrowsFileNotFound() {
- val assetsProvider1 = mock(AssetsProvider::class.java).apply {
- doReturn(null).`when`(this).loadAsset()
- }
- val assetsProvider2 = mock(AssetsProvider::class.java).apply {
- doReturn(null).`when`(this).loadAsset()
- }
-
- val loader = ResourcesLoader()
- val one = ResourcesProvider.empty(assetsProvider1)
- val two = ResourcesProvider.empty(assetsProvider2)
- resources.addLoaders(loader)
- loader.providers = listOf(one, two)
-
- assertOpenedAsset()
- }
-
- @Test
- fun throwingIOExceptionIsSkipped() {
- val assetsProvider1 = DirectoryAssetsProvider(testDir)
- val assetsProvider2 = mock(AssetsProvider::class.java).apply {
- doAnswer { throw IOException() }.`when`(this).loadAsset()
- }
-
- val loader = ResourcesLoader()
- val one = ResourcesProvider.empty(assetsProvider1)
- val two = ResourcesProvider.empty(assetsProvider2)
- resources.addLoaders(loader)
- loader.providers = listOf(one, two)
-
- assertOpenedAsset()
- }
-
- @Test(expected = IllegalStateException::class)
- fun throwingNonIOExceptionCausesFailure() {
- val assetsProvider1 = DirectoryAssetsProvider(testDir)
- val assetsProvider2 = mock(AssetsProvider::class.java).apply {
- doAnswer { throw IllegalStateException() }.`when`(this).loadAsset()
- }
-
- val loader = ResourcesLoader()
- val one = ResourcesProvider.empty(assetsProvider1)
- val two = ResourcesProvider.empty(assetsProvider2)
- resources.addLoaders(loader)
- loader.providers = listOf(one, two)
-
- assertOpenedAsset()
- }
-
- private fun mockProvider(block: (AssetsProvider) -> Unit = {}): ResourcesProvider {
- return ResourcesProvider.empty(mock(AssetsProvider::class.java).apply {
- block.invoke(this)
- })
- }
-
- private fun assertOpenedAsset() {
- assertThat(resources.assets.openAsset()).isEqualTo(TEST_TEXT)
- }
-}
diff --git a/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/ResourceLoaderTestBase.kt b/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/ResourceLoaderTestBase.kt
index 4c62955..ec6a605 100644
--- a/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/ResourceLoaderTestBase.kt
+++ b/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/ResourceLoaderTestBase.kt
@@ -17,29 +17,58 @@
package android.content.res.loader.test
import android.content.Context
-import android.content.res.AssetManager
+import android.content.res.AssetFileDescriptor
+import android.content.res.Configuration
import android.content.res.Resources
import android.content.res.loader.AssetsProvider
import android.content.res.loader.ResourcesProvider
import android.os.ParcelFileDescriptor
+import android.system.Os
+import android.util.ArrayMap
import androidx.test.InstrumentationRegistry
+import org.json.JSONObject
import org.junit.After
import org.junit.Before
-import org.mockito.ArgumentMatchers.anyInt
-import org.mockito.ArgumentMatchers.eq
-import org.mockito.Mockito.doAnswer
-import org.mockito.Mockito.mock
import java.io.Closeable
+import java.io.FileOutputStream
+import java.io.File
+import java.io.FileDescriptor
+import java.util.zip.ZipInputStream
abstract class ResourceLoaderTestBase {
+ protected val PROVIDER_ONE: String = "FrameworksResourceLoaderTests_ProviderOne"
+ protected val PROVIDER_TWO: String = "FrameworksResourceLoaderTests_ProviderTwo"
+ protected val PROVIDER_THREE: String = "FrameworksResourceLoaderTests_ProviderThree"
+ protected val PROVIDER_FOUR: String = "FrameworksResourceLoaderTests_ProviderFour"
+ protected val PROVIDER_EMPTY: String = "empty"
+ companion object {
+ /** Converts the map to a stable JSON string representation. */
+ fun mapToString(m: Map<String, String>): String {
+ return JSONObject(ArrayMap<String, String>().apply { putAll(m) }).toString()
+ }
+
+ /** Creates a lambda that runs multiple resources queries and concatenates the results. */
+ fun query(queries: Map<String, (Resources) -> String>): Resources.() -> String {
+ return {
+ val resultMap = ArrayMap<String, String>()
+ queries.forEach { q ->
+ resultMap[q.key] = try {
+ q.value.invoke(this)
+ } catch (e: Exception) {
+ e.javaClass.simpleName
+ }
+ }
+ mapToString(resultMap)
+ }
+ }
+ }
+
+ // Data type of the current test iteration
open lateinit var dataType: DataType
protected lateinit var context: Context
- protected open val resources: Resources
- get() = context.resources
- protected open val assets: AssetManager
- get() = resources.assets
+ protected lateinit var resources: Resources
// Track opened streams and ResourcesProviders to close them after testing
private val openedObjects = mutableListOf<Closeable>()
@@ -47,6 +76,8 @@
@Before
fun setUpBase() {
context = InstrumentationRegistry.getTargetContext()
+ .createConfigurationContext(Configuration())
+ resources = context.resources
}
@After
@@ -61,82 +92,207 @@
}
}
- protected fun String.openProvider(
- dataType: DataType = this@ResourceLoaderTestBase.dataType
- ): ResourcesProvider = when (dataType) {
- DataType.APK -> {
- context.copiedRawFile("${this}Apk").use {
- ResourcesProvider.loadFromApk(it, mock(AssetsProvider::class.java))
- }.also { openedObjects += it }
+ protected fun String.openProvider(dataType: DataType,
+ assetsProvider: MemoryAssetsProvider?): ResourcesProvider {
+ if (assetsProvider != null) {
+ openedObjects += assetsProvider
}
- DataType.ARSC -> {
- openArsc(this, mock(AssetsProvider::class.java))
- }
- DataType.SPLIT -> {
- ResourcesProvider.loadFromSplit(context, this)
- }
- DataType.ASSET -> {
- val assetsProvider = mock(AssetsProvider::class.java)
- doAnswer { byteInputStream() }.`when`(assetsProvider)
- .loadAsset(eq("assets/Asset.txt"), anyInt())
- ResourcesProvider.empty(assetsProvider)
- }
- DataType.ASSET_FD -> {
- val assetsProvider = mock(AssetsProvider::class.java)
- doAnswer {
- val file = context.filesDir.resolve("Asset.txt")
- file.writeText(this)
- ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
- }.`when`(assetsProvider).loadAssetParcelFd("assets/Asset.txt")
- ResourcesProvider.empty(assetsProvider)
- }
- DataType.NON_ASSET -> {
- val assetsProvider = mock(AssetsProvider::class.java)
- doAnswer {
- val file = context.filesDir.resolve("NonAsset.txt")
- file.writeText(this)
- ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
- }.`when`(assetsProvider).loadAssetParcelFd("NonAsset.txt")
- ResourcesProvider.empty(assetsProvider)
- }
- DataType.NON_ASSET_DRAWABLE -> {
- val assetsProvider = mock(AssetsProvider::class.java)
- doAnswer { context.copiedRawFile(this) }.`when`(assetsProvider)
- .loadAssetParcelFd("res/drawable-nodpi-v4/non_asset_drawable.xml")
- openArsc(this, assetsProvider)
- }
- DataType.NON_ASSET_BITMAP -> {
- val assetsProvider = mock(AssetsProvider::class.java)
- doAnswer { resources.openRawResource(rawFile(this)) }
- .`when`(assetsProvider)
- .loadAsset(eq("res/drawable-nodpi-v4/non_asset_bitmap.png"), anyInt())
- openArsc(this, assetsProvider)
- }
- DataType.NON_ASSET_LAYOUT -> {
- val assetsProvider = mock(AssetsProvider::class.java)
- doAnswer { resources.openRawResource(rawFile(this)) }.`when`(assetsProvider)
- .loadAsset(eq("res/layout/layout.xml"), anyInt())
- doAnswer { context.copiedRawFile(this) }.`when`(assetsProvider)
- .loadAssetParcelFd("res/layout/layout.xml")
- openArsc(this, assetsProvider)
+ return when (dataType) {
+ DataType.APK_DISK_FD -> {
+ val file = context.copiedAssetFile("$this.apk")
+ ResourcesProvider.loadFromApk(ParcelFileDescriptor.fromFd(file.fd),
+ assetsProvider).apply {
+ file.close()
+ }
+ }
+ DataType.APK_DISK_FD_OFFSETS -> {
+ val asset = context.assets.openFd("$this.apk")
+ ResourcesProvider.loadFromApk(asset.parcelFileDescriptor, asset.startOffset,
+ asset.length, assetsProvider).apply {
+ asset.close()
+ }
+ }
+ DataType.ARSC_DISK_FD -> {
+ val file = context.copiedAssetFile("$this.arsc")
+ ResourcesProvider.loadFromTable(ParcelFileDescriptor.fromFd(file.fd),
+ assetsProvider).apply {
+ file.close()
+ }
+ }
+ DataType.ARSC_DISK_FD_OFFSETS -> {
+ val asset = context.assets.openFd("$this.arsc")
+ ResourcesProvider.loadFromTable(asset.parcelFileDescriptor, asset.startOffset,
+ asset.length, assetsProvider).apply {
+ asset.close()
+ }
+ }
+ DataType.APK_RAM_OFFSETS -> {
+ val asset = context.assets.openFd("$this.apk")
+ val leadingGarbageSize = 100L
+ val trailingGarbageSize = 55L
+ val fd = loadAssetIntoMemory(asset, leadingGarbageSize.toInt(),
+ trailingGarbageSize.toInt())
+ ResourcesProvider.loadFromApk(fd, leadingGarbageSize, asset.declaredLength,
+ assetsProvider).apply {
+ asset.close()
+ fd.close()
+ }
+ }
+ DataType.APK_RAM_FD -> {
+ val asset = context.assets.openFd("$this.apk")
+ var fd = loadAssetIntoMemory(asset)
+ ResourcesProvider.loadFromApk(fd, assetsProvider).apply {
+ asset.close()
+ fd.close()
+ }
+ }
+ DataType.ARSC_RAM_MEMORY -> {
+ val asset = context.assets.openFd("$this.arsc")
+ var fd = loadAssetIntoMemory(asset)
+ ResourcesProvider.loadFromTable(fd, assetsProvider).apply {
+ asset.close()
+ fd.close()
+ }
+ }
+ DataType.ARSC_RAM_MEMORY_OFFSETS -> {
+ val asset = context.assets.openFd("$this.arsc")
+ val leadingGarbageSize = 100L
+ val trailingGarbageSize = 55L
+ val fd = loadAssetIntoMemory(asset, leadingGarbageSize.toInt(),
+ trailingGarbageSize.toInt())
+ ResourcesProvider.loadFromTable(fd, leadingGarbageSize, asset.declaredLength,
+ assetsProvider).apply {
+ asset.close()
+ fd.close()
+ }
+ }
+ DataType.EMPTY -> {
+ if (equals(PROVIDER_EMPTY)) {
+ ResourcesProvider.empty(EmptyAssetsProvider())
+ } else {
+ if (assetsProvider == null) ResourcesProvider.empty(ZipAssetsProvider(this))
+ else ResourcesProvider.empty(assetsProvider)
+ }
+ }
+ DataType.DIRECTORY -> {
+ ResourcesProvider.loadFromDirectory(zipToDir("$this.apk").absolutePath,
+ assetsProvider)
+ }
+ DataType.SPLIT -> {
+ ResourcesProvider.loadFromSplit(context, "${this}_Split")
+ }
}
}
- protected fun openArsc(rawName: String, assetsProvider: AssetsProvider): ResourcesProvider {
- return context.copiedRawFile("${rawName}Arsc")
- .use { ResourcesProvider.loadFromTable(it, assetsProvider) }
- .also { openedObjects += it }
+ class EmptyAssetsProvider : AssetsProvider
+
+ /** An AssetsProvider that reads from a zip asset. */
+ inner class ZipAssetsProvider(val providerName: String) : AssetsProvider {
+ val root: File = zipToDir("$providerName.apk")
+
+ override fun loadAssetFd(path: String, accessMode: Int): AssetFileDescriptor? {
+ val f = File(root, path)
+ return if (f.exists()) AssetFileDescriptor(
+ ParcelFileDescriptor.open(File(root, path),
+ ParcelFileDescriptor.MODE_READ_ONLY), 0,
+ AssetFileDescriptor.UNKNOWN_LENGTH) else null
+ }
+ }
+
+ /** AssetsProvider for testing that returns file descriptors to files in RAM. */
+ class MemoryAssetsProvider : AssetsProvider, Closeable {
+ var loadAssetResults = HashMap<String, FileDescriptor>()
+
+ fun addLoadAssetFdResult(path: String, value: String) = apply {
+ val fd = Os.memfd_create(path, 0)
+ val valueBytes = value.toByteArray()
+ Os.write(fd, valueBytes, 0, valueBytes.size)
+ loadAssetResults[path] = fd
+ }
+
+ override fun loadAssetFd(path: String, accessMode: Int): AssetFileDescriptor? {
+ return if (loadAssetResults.containsKey(path)) AssetFileDescriptor(
+ ParcelFileDescriptor.dup(loadAssetResults[path]), 0,
+ AssetFileDescriptor.UNKNOWN_LENGTH) else null
+ }
+
+ override fun close() {
+ for (f in loadAssetResults.values) {
+ Os.close(f)
+ }
+ }
+ }
+
+ /** Extracts an archive-based asset into a directory on disk. */
+ private fun zipToDir(name: String): File {
+ val root = File(context.filesDir, name.split('.')[0])
+ if (root.exists()) {
+ return root
+ }
+
+ root.mkdir()
+ ZipInputStream(context.assets.open(name)).use { zis ->
+ while (true) {
+ val entry = zis.nextEntry ?: break
+ val file = File(root, entry.name)
+ if (entry.isDirectory) {
+ continue
+ }
+
+ file.parentFile.mkdirs()
+ file.outputStream().use { output ->
+ var b = zis.read()
+ while (b != -1) {
+ output.write(b)
+ b = zis.read()
+ }
+ }
+ }
+ }
+ return root
+ }
+
+ /** Loads the asset into a temporary file stored in RAM. */
+ private fun loadAssetIntoMemory(
+ asset: AssetFileDescriptor,
+ leadingGarbageSize: Int = 0,
+ trailingGarbageSize: Int = 0
+ ): ParcelFileDescriptor {
+ val originalFd = Os.memfd_create(asset.toString(), 0 /* flags */)
+ val fd = ParcelFileDescriptor.dup(originalFd)
+ Os.close(originalFd)
+
+ val input = asset.createInputStream()
+ FileOutputStream(fd.fileDescriptor).use { output ->
+ // Add garbage before the APK data
+ for (i in 0 until leadingGarbageSize) {
+ output.write(Math.random().toInt())
+ }
+
+ for (i in 0 until asset.length.toInt()) {
+ output.write(input.read())
+ }
+
+ // Add garbage after the APK data
+ for (i in 0 until trailingGarbageSize) {
+ output.write(Math.random().toInt())
+ }
+ }
+
+ return fd
}
enum class DataType {
- APK,
- ARSC,
- SPLIT,
- ASSET,
- ASSET_FD,
- NON_ASSET,
- NON_ASSET_DRAWABLE,
- NON_ASSET_BITMAP,
- NON_ASSET_LAYOUT,
+ APK_DISK_FD,
+ APK_DISK_FD_OFFSETS,
+ APK_RAM_FD,
+ APK_RAM_OFFSETS,
+ ARSC_DISK_FD,
+ ARSC_DISK_FD_OFFSETS,
+ ARSC_RAM_MEMORY,
+ ARSC_RAM_MEMORY_OFFSETS,
+ EMPTY,
+ DIRECTORY,
+ SPLIT
}
}
diff --git a/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/ResourceLoaderValuesTest.kt b/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/ResourceLoaderValuesTest.kt
index 16eafcd..5aa8814 100644
--- a/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/ResourceLoaderValuesTest.kt
+++ b/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/ResourceLoaderValuesTest.kt
@@ -19,6 +19,7 @@
import android.app.Activity
import android.content.Context
import android.content.Intent
+import android.content.res.AssetManager
import android.content.res.Configuration
import android.content.res.Resources
import android.content.res.loader.ResourcesLoader
@@ -54,98 +55,177 @@
fun parameters(): Array<Any> {
val parameters = mutableListOf<Parameter>()
- // R.string
+ // Test resolution of resources encoded within the resources.arsc.
parameters += Parameter(
- { getString(android.R.string.cancel) },
- "stringOne", { "SomeRidiculouslyUnlikelyStringOne" },
- "stringTwo", { "SomeRidiculouslyUnlikelyStringTwo" },
- "stringThree", { "SomeRidiculouslyUnlikelyStringThree" },
- "stringFour", { "SomeRidiculouslyUnlikelyStringFour" },
- listOf(DataType.APK, DataType.ARSC)
+ "tableBased",
+ query(mapOf(
+ "getOverlaid" to { res ->
+ res.getString(R.string.test)
+ },
+ "getAdditional" to { res ->
+ res.getString(0x7f0400fe /* R.string.additional */)
+ },
+ "getIdentifier" to { res ->
+ res.getString(res.getIdentifier("test", "string",
+ "android.content.res.loader.test"))
+ },
+ "getIdentifierAdditional" to { res ->
+ res.getString(res.getIdentifier("additional", "string",
+ "android.content.res.loader.test"))
+ }
+ )),
+ mapOf("getOverlaid" to "Not overlaid",
+ "getAdditional" to "NotFoundException",
+ "getIdentifier" to "Not overlaid",
+ "getIdentifierAdditional" to "NotFoundException"),
+
+ mapOf("getOverlaid" to "One",
+ "getAdditional" to "One",
+ "getIdentifier" to "One",
+ "getIdentifierAdditional" to "One"),
+
+ mapOf("getOverlaid" to "Two",
+ "getAdditional" to "Two",
+ "getIdentifier" to "Two",
+ "getIdentifierAdditional" to "Two"),
+
+ mapOf("getOverlaid" to "Three",
+ "getAdditional" to "Three",
+ "getIdentifier" to "Three",
+ "getIdentifierAdditional" to "Three"),
+
+ mapOf("getOverlaid" to "Four",
+ "getAdditional" to "Four",
+ "getIdentifier" to "Four",
+ "getIdentifierAdditional" to "Four"),
+ listOf(DataType.APK_DISK_FD, DataType.APK_DISK_FD_OFFSETS, DataType.APK_RAM_FD,
+ DataType.APK_RAM_OFFSETS, DataType.ARSC_DISK_FD,
+ DataType.ARSC_DISK_FD_OFFSETS, DataType.ARSC_RAM_MEMORY,
+ DataType.ARSC_RAM_MEMORY_OFFSETS, DataType.SPLIT, DataType.DIRECTORY)
)
- // R.dimen
+ // Test resolution of file-based resources and assets with no assets provider.
parameters += Parameter(
- { getDimensionPixelSize(android.R.dimen.app_icon_size) },
- "dimenOne", { 100.dpToPx(resources) },
- "dimenTwo", { 200.dpToPx(resources) },
- "dimenThree", { 300.dpToPx(resources) },
- "dimenFour", { 400.dpToPx(resources) },
- listOf(DataType.APK, DataType.ARSC)
+ "tableFileBased",
+ query(mapOf(
+ // Drawable xml in res directory
+ "drawableXml" to { res ->
+ (res.getDrawable(R.drawable.drawable_xml) as ColorDrawable)
+ .color.toString()
+ },
+ // Asset as compiled XML layout in res directory
+ "layout" to { res ->
+ res.getLayout(R.layout.layout).advanceToRoot().name
+ },
+ // Bitmap drawable in res directory
+ "drawablePng" to { res ->
+ (res.getDrawable(R.drawable.drawable_png) as BitmapDrawable)
+ .bitmap.getColor(0, 0).toArgb().toString()
+ }
+ )),
+ mapOf("drawableXml" to Color.parseColor("#B2D2F2").toString(),
+ "layout" to "MysteryLayout",
+ "drawablePng" to Color.parseColor("#FF00FF").toString()),
+
+ mapOf("drawableXml" to Color.parseColor("#000001").toString(),
+ "layout" to "RelativeLayout",
+ "drawablePng" to Color.RED.toString()),
+
+ mapOf("drawableXml" to Color.parseColor("#000002").toString(),
+ "layout" to "LinearLayout",
+ "drawablePng" to Color.GREEN.toString()),
+
+ mapOf("drawableXml" to Color.parseColor("#000003").toString(),
+ "layout" to "FrameLayout",
+ "drawablePng" to Color.BLUE.toString()),
+
+ mapOf("drawableXml" to Color.parseColor("#000004").toString(),
+ "layout" to "TableLayout",
+ "drawablePng" to Color.WHITE.toString()),
+ listOf(DataType.APK_DISK_FD, DataType.APK_DISK_FD_OFFSETS, DataType.APK_RAM_FD,
+ DataType.APK_RAM_OFFSETS, DataType.SPLIT, DataType.DIRECTORY)
)
- // File in the assets directory
+ // Test resolution of assets.
parameters += Parameter(
- { assets.open("Asset.txt").reader().readText() },
- "assetOne", { "assetOne" },
- "assetTwo", { "assetTwo" },
- "assetFour", { "assetFour" },
- "assetThree", { "assetThree" },
- listOf(DataType.ASSET)
+ "fileBased",
+ query(mapOf(
+ // File in the assets directory
+ "openAsset" to { res ->
+ res.assets.open("asset.txt").reader().readText()
+ },
+ // From assets directory returning file descriptor
+ "openAssetFd" to { res ->
+ res.assets.openFd("asset.txt").readText()
+ },
+ // Asset as compiled XML layout in res directory
+ "layout" to { res ->
+ res.assets.openXmlResourceParser("res/layout/layout.xml")
+ .advanceToRoot().name
+ }
+ )),
+ mapOf("openAsset" to "In assets directory",
+ "openAssetFd" to "In assets directory",
+ "layout" to "MysteryLayout"),
+
+ mapOf("openAsset" to "One",
+ "openAssetFd" to "One",
+ "layout" to "RelativeLayout"),
+
+ mapOf("openAsset" to "Two",
+ "openAssetFd" to "Two",
+ "layout" to "LinearLayout"),
+
+ mapOf("openAsset" to "Three",
+ "openAssetFd" to "Three",
+ "layout" to "FrameLayout"),
+
+ mapOf("openAsset" to "Four",
+ "openAssetFd" to "Four",
+ "layout" to "TableLayout"),
+ listOf(DataType.EMPTY)
)
- // From assets directory returning file descriptor
+ // Test assets from apk and provider
parameters += Parameter(
- { assets.openFd("Asset.txt").readText() },
- "assetOne", { "assetOne" },
- "assetTwo", { "assetTwo" },
- "assetFour", { "assetFour" },
- "assetThree", { "assetThree" },
- listOf(DataType.ASSET_FD)
+ "fileBasedApkAssetsProvider",
+ query(mapOf(
+ // File in the assets directory
+ "openAsset" to { res ->
+ res.assets.open("asset.txt").reader().readText()
+ },
+ // From assets directory returning file descriptor
+ "openAssetFd" to { res ->
+ res.assets.openFd("asset.txt").readText()
+ }
+ )),
+ mapOf("openAsset" to "In assets directory",
+ "openAssetFd" to "In assets directory"),
+
+ mapOf("openAsset" to "AssetsOne",
+ "openAssetFd" to "AssetsOne"),
+ { MemoryAssetsProvider().addLoadAssetFdResult("assets/asset.txt",
+ "AssetsOne") },
+
+ mapOf("openAsset" to "Two",
+ "openAssetFd" to "Two"),
+ null /* assetProviderTwo */,
+
+ mapOf("openAsset" to "AssetsThree",
+ "openAssetFd" to "AssetsThree"),
+ { MemoryAssetsProvider().addLoadAssetFdResult("assets/asset.txt",
+ "AssetsThree") },
+
+ mapOf("openAsset" to "Four",
+ "openAssetFd" to "Four"),
+ null /* assetProviderFour */,
+ listOf(DataType.APK_DISK_FD, DataType.APK_DISK_FD_OFFSETS, DataType.APK_RAM_FD,
+ DataType.APK_RAM_OFFSETS, DataType.DIRECTORY)
+
)
- // From root directory returning file descriptor
- parameters += Parameter(
- { assets.openNonAssetFd("NonAsset.txt").readText() },
- "NonAssetOne", { "NonAssetOne" },
- "NonAssetTwo", { "NonAssetTwo" },
- "NonAssetThree", { "NonAssetThree" },
- "NonAssetFour", { "NonAssetFour" },
- listOf(DataType.NON_ASSET)
- )
-
- // Asset as compiled XML drawable
- parameters += Parameter(
- { (getDrawable(R.drawable.non_asset_drawable) as ColorDrawable).color },
- "nonAssetDrawableOne", { Color.parseColor("#000001") },
- "nonAssetDrawableTwo", { Color.parseColor("#000002") },
- "nonAssetDrawableThree", { Color.parseColor("#000003") },
- "nonAssetDrawableFour", { Color.parseColor("#000004") },
- listOf(DataType.NON_ASSET_DRAWABLE)
- )
-
- // Asset as compiled bitmap drawable
- parameters += Parameter(
- {
- (getDrawable(R.drawable.non_asset_bitmap) as BitmapDrawable)
- .bitmap.getColor(0, 0).toArgb()
- },
- "nonAssetBitmapRed", { Color.RED },
- "nonAssetBitmapGreen", { Color.GREEN },
- "nonAssetBitmapBlue", { Color.BLUE },
- "nonAssetBitmapWhite", { Color.WHITE },
- listOf(DataType.NON_ASSET_BITMAP)
- )
-
- // Asset as compiled XML layout
- parameters += Parameter(
- { getLayout(R.layout.layout).advanceToRoot().name },
- "layoutOne", { "RelativeLayout" },
- "layoutTwo", { "LinearLayout" },
- "layoutThree", { "FrameLayout" },
- "layoutFour", { "TableLayout" },
- listOf(DataType.NON_ASSET_LAYOUT)
- )
-
- // Isolated resource split
- parameters += Parameter(
- { getString(R.string.split_overlaid) },
- "split_one", { "Split ONE Overlaid" },
- "split_two", { "Split TWO Overlaid" },
- "split_three", { "Split THREE Overlaid" },
- "split_four", { "Split FOUR Overlaid" },
- listOf(DataType.SPLIT)
- )
+ // TODO(151949807): Increase testing for cookie based APIs and for what happens when
+ // some providers do not overlay base resources
return parameters.flatMap { parameter ->
parameter.dataTypes.map { dataType ->
@@ -162,23 +242,31 @@
@field:Parameterized.Parameter(1)
lateinit var parameter: Parameter
- private val valueOne by lazy { parameter.valueOne(this) }
- private val valueTwo by lazy { parameter.valueTwo(this) }
- private val valueThree by lazy { parameter.valueThree(this) }
- private val valueFour by lazy { parameter.valueFour(this) }
+ private val valueOriginal by lazy { mapToString(parameter.valueOriginal) }
+ private val valueOne by lazy { mapToString(parameter.valueOne) }
+ private val valueTwo by lazy { mapToString(parameter.valueTwo) }
+ private val valueThree by lazy { mapToString(parameter.valueThree) }
+ private val valueFour by lazy { mapToString(parameter.valueFour) }
- private fun openOne() = parameter.providerOne.openProvider()
- private fun openTwo() = parameter.providerTwo.openProvider()
- private fun openThree() = parameter.providerThree.openProvider()
- private fun openFour() = parameter.providerFour.openProvider()
+ private fun openOne() = PROVIDER_ONE.openProvider(dataType,
+ parameter.assetProviderOne?.invoke())
+ private fun openTwo() = PROVIDER_TWO.openProvider(dataType,
+ parameter.assetProviderTwo?.invoke())
+ private fun openThree() = PROVIDER_THREE.openProvider(dataType,
+ parameter.assetProviderThree?.invoke())
+ private fun openFour() = PROVIDER_FOUR.openProvider(dataType,
+ parameter.assetProviderFour?.invoke())
+ private fun openEmpty() = PROVIDER_EMPTY.openProvider(DataType.EMPTY, null)
// Class method for syntax highlighting purposes
private fun getValue(c: Context = context) = parameter.getValue(c.resources)
+ private fun getValue(r: Resources) = parameter.getValue(r)
@Test
fun assertValueUniqueness() {
// Ensure the parameters are valid in case of coding errors
val original = getValue()
+ assertEquals(valueOriginal, original)
assertNotEquals(valueOne, original)
assertNotEquals(valueTwo, original)
assertNotEquals(valueThree, original)
@@ -193,7 +281,6 @@
@Test
fun addProvidersRepeatedly() {
- val originalValue = getValue()
val testOne = openOne()
val testTwo = openTwo()
val loader = ResourcesLoader()
@@ -209,12 +296,11 @@
assertEquals(valueTwo, getValue())
loader.removeProvider(testTwo)
- assertEquals(originalValue, getValue())
+ assertEquals(valueOriginal, getValue())
}
@Test
fun addLoadersRepeatedly() {
- val originalValue = getValue()
val testOne = openOne()
val testTwo = openTwo()
val loader1 = ResourcesLoader()
@@ -232,12 +318,11 @@
assertEquals(valueTwo, getValue())
resources.removeLoaders(loader2)
- assertEquals(originalValue, getValue())
+ assertEquals(valueOriginal, getValue())
}
@Test
fun setMultipleProviders() {
- val originalValue = getValue()
val testOne = openOne()
val testTwo = openTwo()
val loader = ResourcesLoader()
@@ -250,12 +335,11 @@
assertEquals(valueOne, getValue())
loader.providers = Collections.emptyList()
- assertEquals(originalValue, getValue())
+ assertEquals(valueOriginal, getValue())
}
@Test
fun addMultipleLoaders() {
- val originalValue = getValue()
val loader1 = ResourcesLoader()
loader1.addProvider(openOne())
val loader2 = ResourcesLoader()
@@ -268,7 +352,28 @@
assertEquals(valueOne, getValue())
resources.removeLoaders(loader1)
- assertEquals(originalValue, getValue())
+ assertEquals(valueOriginal, getValue())
+ }
+
+ @Test
+ fun emptyProvider() {
+ val testOne = openOne()
+ val testTwo = openTwo()
+ val testEmpty = openEmpty()
+ val loader = ResourcesLoader()
+
+ resources.addLoaders(loader)
+ loader.providers = listOf(testOne, testEmpty, testTwo)
+ assertEquals(valueTwo, getValue())
+
+ loader.removeProvider(testTwo)
+ assertEquals(valueOne, getValue())
+
+ loader.removeProvider(testOne)
+ assertEquals(valueOriginal, getValue())
+
+ loader.providers = Collections.emptyList()
+ assertEquals(valueOriginal, getValue())
}
@Test(expected = UnsupportedOperationException::class)
@@ -385,7 +490,6 @@
@Test
fun reorderProviders() {
- val originalValue = getValue()
val testOne = openOne()
val testTwo = openTwo()
val loader = ResourcesLoader()
@@ -405,12 +509,11 @@
assertEquals(valueOne, getValue())
loader.removeProvider(testOne)
- assertEquals(originalValue, getValue())
+ assertEquals(valueOriginal, getValue())
}
@Test
fun reorderLoaders() {
- val originalValue = getValue()
val testOne = openOne()
val testTwo = openTwo()
val loader1 = ResourcesLoader()
@@ -432,7 +535,7 @@
assertEquals(valueOne, getValue())
resources.removeLoaders(loader1)
- assertEquals(originalValue, getValue())
+ assertEquals(valueOriginal, getValue())
}
@Test
@@ -460,6 +563,9 @@
loader1.removeProvider(testOne)
assertEquals(valueFour, getValue())
+
+ loader2.removeProvider(testFour)
+ assertEquals(valueThree, getValue())
}
private fun createContext(context: Context, id: Int): Context {
@@ -470,7 +576,6 @@
@Test
fun copyContextLoaders() {
- val originalValue = getValue()
val loader1 = ResourcesLoader()
loader1.addProvider(openOne())
val loader2 = ResourcesLoader()
@@ -490,13 +595,13 @@
// Changing the loaders of the original context should not affect the child context.
resources.removeLoaders(loader1)
- assertEquals(originalValue, getValue())
+ assertEquals(valueOriginal, getValue())
assertEquals(valueTwo, getValue(childContext))
// A new context created from the original after an update to the original's loaders should
// have the updated loaders.
val originalPrime = createContext(context, 2)
- assertEquals(originalValue, getValue(originalPrime))
+ assertEquals(valueOriginal, getValue(originalPrime))
// A new context created from the child context after an update to the child's loaders
// should have the updated loaders.
@@ -506,7 +611,6 @@
@Test
fun loaderUpdatesAffectContexts() {
- val originalValue = getValue()
val testOne = openOne()
val testTwo = openTwo()
val loader = ResourcesLoader()
@@ -525,15 +629,15 @@
// Changes to the loaders for a context do not affect providers.
resources.clearLoaders()
- assertEquals(originalValue, getValue())
+ assertEquals(valueOriginal, getValue())
assertEquals(valueTwo, getValue(childContext))
val childContext2 = createContext(context, 1)
- assertEquals(originalValue, getValue())
- assertEquals(originalValue, getValue(childContext2))
+ assertEquals(valueOriginal, getValue())
+ assertEquals(valueOriginal, getValue(childContext2))
childContext2.resources.addLoaders(loader)
- assertEquals(originalValue, getValue())
+ assertEquals(valueOriginal, getValue())
assertEquals(valueTwo, getValue(childContext))
assertEquals(valueTwo, getValue(childContext2))
}
@@ -629,22 +733,82 @@
provider.close()
}
+ @Test
+ fun addLoadersRepeatedlyCustomResources() {
+ val res = Resources(AssetManager::class.java.newInstance(), resources.displayMetrics,
+ resources.configuration!!)
+ val originalValue = getValue(res)
+ val testOne = openOne()
+ val testTwo = openTwo()
+ val loader1 = ResourcesLoader()
+ val loader2 = ResourcesLoader()
+
+ res.addLoaders(loader1)
+ loader1.addProvider(testOne)
+ assertEquals(valueOne, getValue(res))
+
+ res.addLoaders(loader2)
+ loader2.addProvider(testTwo)
+ assertEquals(valueTwo, getValue(res))
+
+ res.removeLoaders(loader1)
+ res.addLoaders(loader1)
+ assertEquals(valueOne, getValue(res))
+
+ res.removeLoaders(loader1)
+ assertEquals(valueTwo, getValue(res))
+
+ res.removeLoaders(loader2)
+ assertEquals(originalValue, getValue(res))
+ }
+
+ @Test
+ fun setMultipleProvidersCustomResources() {
+ val res = Resources(AssetManager::class.java.newInstance(), resources.displayMetrics,
+ resources.configuration!!)
+ val originalValue = getValue(res)
+ val testOne = openOne()
+ val testTwo = openTwo()
+ val loader = ResourcesLoader()
+
+ res.addLoaders(loader)
+ loader.providers = listOf(testOne, testTwo)
+ assertEquals(valueTwo, getValue(res))
+
+ loader.removeProvider(testTwo)
+ assertEquals(valueOne, getValue(res))
+
+ loader.providers = Collections.emptyList()
+ assertEquals(originalValue, getValue(res))
+ }
+
data class Parameter(
- val getValue: Resources.() -> Any,
- val providerOne: String,
- val valueOne: ResourceLoaderValuesTest.() -> Any,
- val providerTwo: String,
- val valueTwo: ResourceLoaderValuesTest.() -> Any,
- val providerThree: String,
- val valueThree: ResourceLoaderValuesTest.() -> Any,
- val providerFour: String,
- val valueFour: ResourceLoaderValuesTest.() -> Any,
+ val testPrefix: String,
+ val getValue: Resources.() -> String,
+ val valueOriginal: Map<String, String>,
+ val valueOne: Map<String, String>,
+ val assetProviderOne: (() -> MemoryAssetsProvider)? = null,
+ val valueTwo: Map<String, String>,
+ val assetProviderTwo: (() -> MemoryAssetsProvider)? = null,
+ val valueThree: Map<String, String>,
+ val assetProviderThree: (() -> MemoryAssetsProvider)? = null,
+ val valueFour: Map<String, String>,
+ val assetProviderFour: (() -> MemoryAssetsProvider)? = null,
val dataTypes: List<DataType>
) {
- override fun toString(): String {
- val prefix = providerOne.commonPrefixWith(providerTwo)
- return "$prefix${providerOne.removePrefix(prefix)}|${providerTwo.removePrefix(prefix)}"
- }
+ constructor(
+ testPrefix: String,
+ getValue: Resources.() -> String,
+ valueOriginal: Map<String, String>,
+ valueOne: Map<String, String>,
+ valueTwo: Map<String, String>,
+ valueThree: Map<String, String>,
+ valueFour: Map<String, String>,
+ dataTypes: List<DataType>
+ ): this(testPrefix, getValue, valueOriginal, valueOne,
+ null, valueTwo, null, valueThree, null, valueFour, null, dataTypes)
+
+ override fun toString() = testPrefix
}
}
diff --git a/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/Utils.kt b/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/Utils.kt
index 4e8ee5c..526160d 100644
--- a/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/Utils.kt
+++ b/core/tests/ResourceLoaderTests/src/android/content/res/loader/test/Utils.kt
@@ -44,25 +44,20 @@
fun AssetFileDescriptor.readText() = createInputStream().reader().readText()
-fun rawFile(fileName: String) = R.raw::class.java.getDeclaredField(fileName).getInt(null)
-
fun XmlPullParser.advanceToRoot() = apply {
while (next() != XmlPullParser.START_TAG) {
// Empty
}
}
-fun Context.copiedRawFile(fileName: String): ParcelFileDescriptor {
- return resources.openRawResourceFd(rawFile(fileName)).use { asset ->
+fun Context.copiedAssetFile(fileName: String): ParcelFileDescriptor {
+ return resources.assets.open(fileName).use { input ->
// AssetManager doesn't expose a direct file descriptor to the asset, so copy it to
// an individual file so one can be created manually.
val copiedFile = File(filesDir, fileName)
- asset.createInputStream().use { input ->
- copiedFile.outputStream().use { output ->
- input.copyTo(output)
- }
+ copiedFile.outputStream().use { output ->
+ input.copyTo(output)
}
-
ParcelFileDescriptor.open(copiedFile, ParcelFileDescriptor.MODE_READ_WRITE)
}
}
diff --git a/core/tests/coretests/BstatsTestApp/src/com/android/coretests/apps/bstatstestapp/TestService.java b/core/tests/coretests/BstatsTestApp/src/com/android/coretests/apps/bstatstestapp/TestService.java
index a027f9e..79b803a 100644
--- a/core/tests/coretests/BstatsTestApp/src/com/android/coretests/apps/bstatstestapp/TestService.java
+++ b/core/tests/coretests/BstatsTestApp/src/com/android/coretests/apps/bstatstestapp/TestService.java
@@ -15,19 +15,24 @@
*/
package com.android.coretests.apps.bstatstestapp;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
+
import android.R;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
+import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
+import android.hardware.display.DisplayManager;
import android.os.Handler;
import android.os.IBinder;
import android.os.Process;
import android.os.RemoteException;
import android.util.Log;
import android.util.Size;
+import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
@@ -46,11 +51,17 @@
private static final int TIMEOUT_OVERLAY_SEC = 2;
+ private Context mOverlayContext;
private View mOverlay;
@Override
public void onCreate() {
Log.d(TAG, "onCreate called. myUid=" + Process.myUid());
+
+ final DisplayManager dm = getSystemService(DisplayManager.class);
+ final Display defaultDisplay = dm.getDisplay(Display.DEFAULT_DISPLAY);
+ final Context defaultDisplayContext = createDisplayContext(defaultDisplay);
+ mOverlayContext = defaultDisplayContext.createWindowContext(TYPE_APPLICATION_OVERLAY, null);
}
@Override
@@ -93,7 +104,7 @@
private void removeOverlays() {
if (mOverlay != null) {
- final WindowManager wm = TestService.this.getSystemService(WindowManager.class);
+ final WindowManager wm = mOverlayContext.getSystemService(WindowManager.class);
wm.removeView(mOverlay);
mOverlay = null;
}
@@ -107,11 +118,11 @@
@Override
public void showApplicationOverlay() throws RemoteException {
- final WindowManager wm = TestService.this.getSystemService(WindowManager.class);
+ final WindowManager wm = mOverlayContext.getSystemService(WindowManager.class);
final Size size = wm.getCurrentWindowMetrics().getSize();
final WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(
- WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
+ TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
@@ -124,7 +135,7 @@
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
- mOverlay = new View(TestService.this);
+ mOverlay = new View(mOverlayContext);
mOverlay.setBackgroundColor(Color.GREEN);
mOverlay.setLayoutParams(vglp);
diff --git a/core/tests/coretests/src/android/view/InsetsSourceTest.java b/core/tests/coretests/src/android/view/InsetsSourceTest.java
index 756d63d..b3f6fe9 100644
--- a/core/tests/coretests/src/android/view/InsetsSourceTest.java
+++ b/core/tests/coretests/src/android/view/InsetsSourceTest.java
@@ -127,6 +127,48 @@
}
@Test
+ public void testCalculateInsets_noIntersection_vertical() {
+ mSource.setFrame(new Rect(0, 0, 500, 100));
+ Insets insets = mSource.calculateInsets(new Rect(0, 100, 500, 500), false);
+ assertEquals(Insets.NONE, insets);
+ }
+
+ @Test
+ public void testCalculateInsets_zeroWidthIntersection_vertical_start() {
+ mSource.setFrame(new Rect(0, 0, 500, 100));
+ Insets insets = mSource.calculateInsets(new Rect(0, 0, 0, 500), false);
+ assertEquals(Insets.of(0, 100, 0, 0), insets);
+ }
+
+ @Test
+ public void testCalculateInsets_zeroWidthIntersection_vertical_end() {
+ mSource.setFrame(new Rect(0, 0, 500, 100));
+ Insets insets = mSource.calculateInsets(new Rect(500, 0, 500, 500), false);
+ assertEquals(Insets.of(0, 100, 0, 0), insets);
+ }
+
+ @Test
+ public void testCalculateInsets_noIntersection_horizontal() {
+ mSource.setFrame(new Rect(0, 0, 100, 500));
+ Insets insets = mSource.calculateInsets(new Rect(100, 0, 500, 500), false);
+ assertEquals(Insets.NONE, insets);
+ }
+
+ @Test
+ public void testCalculateInsets_zeroWidthIntersection_horizontal_start() {
+ mSource.setFrame(new Rect(0, 0, 100, 500));
+ Insets insets = mSource.calculateInsets(new Rect(0, 0, 500, 0), false);
+ assertEquals(Insets.of(100, 0, 0, 0), insets);
+ }
+
+ @Test
+ public void testCalculateInsets_zeroWidthIntersection_horizontal_end() {
+ mSource.setFrame(new Rect(0, 0, 100, 500));
+ Insets insets = mSource.calculateInsets(new Rect(0, 500, 500, 500), false);
+ assertEquals(Insets.of(100, 0, 0, 0), insets);
+ }
+
+ @Test
public void testCalculateVisibleInsets_override() {
mSource.setFrame(new Rect(0, 0, 500, 100));
mSource.setVisibleFrame(new Rect(0, 0, 500, 200));
diff --git a/libs/androidfw/ApkAssets.cpp b/libs/androidfw/ApkAssets.cpp
index 18934fd..918e7af 100644
--- a/libs/androidfw/ApkAssets.cpp
+++ b/libs/androidfw/ApkAssets.cpp
@@ -21,6 +21,7 @@
#include "android-base/errors.h"
#include "android-base/file.h"
#include "android-base/logging.h"
+#include "android-base/stringprintf.h"
#include "android-base/unique_fd.h"
#include "android-base/utf8.h"
#include "utils/Compat.h"
@@ -40,29 +41,342 @@
static const std::string kResourcesArsc("resources.arsc");
-ApkAssets::ApkAssets(ZipArchiveHandle unmanaged_handle,
- const std::string& path,
+ApkAssets::ApkAssets(std::unique_ptr<const AssetsProvider> assets_provider,
+ std::string path,
time_t last_mod_time,
package_property_t property_flags)
- : zip_handle_(unmanaged_handle, ::CloseArchive), path_(path), last_mod_time_(last_mod_time),
+ : assets_provider_(std::move(assets_provider)),
+ path_(std::move(path)),
+ last_mod_time_(last_mod_time),
property_flags_(property_flags) {
}
-std::unique_ptr<const ApkAssets> ApkAssets::Load(const std::string& path, bool system,
- bool for_loader) {
- package_property_t flags = (system ? PROPERTY_SYSTEM : 0U) |
- (for_loader ? PROPERTY_LOADER : 0U);
- return LoadImpl({} /*fd*/, path, nullptr, nullptr, flags);
+// Provides asset files from a zip file.
+class ZipAssetsProvider : public AssetsProvider {
+ public:
+ ~ZipAssetsProvider() override = default;
+
+ static std::unique_ptr<const AssetsProvider> Create(const std::string& path) {
+ ::ZipArchiveHandle unmanaged_handle;
+ const int32_t result = ::OpenArchive(path.c_str(), &unmanaged_handle);
+ if (result != 0) {
+ LOG(ERROR) << "Failed to open APK '" << path << "' " << ::ErrorCodeString(result);
+ ::CloseArchive(unmanaged_handle);
+ return {};
+ }
+
+ return std::unique_ptr<AssetsProvider>(new ZipAssetsProvider(path, path, unmanaged_handle));
+ }
+
+ static std::unique_ptr<const AssetsProvider> Create(
+ unique_fd fd, const std::string& friendly_name, const off64_t offset = 0,
+ const off64_t length = ApkAssets::kUnknownLength) {
+
+ ::ZipArchiveHandle unmanaged_handle;
+ const int32_t result = (length == ApkAssets::kUnknownLength)
+ ? ::OpenArchiveFd(fd.release(), friendly_name.c_str(), &unmanaged_handle)
+ : ::OpenArchiveFdRange(fd.release(), friendly_name.c_str(), &unmanaged_handle, length,
+ offset);
+
+ if (result != 0) {
+ LOG(ERROR) << "Failed to open APK '" << friendly_name << "' through FD with offset " << offset
+ << " and length " << length << ": " << ::ErrorCodeString(result);
+ ::CloseArchive(unmanaged_handle);
+ return {};
+ }
+
+ return std::unique_ptr<AssetsProvider>(new ZipAssetsProvider({}, friendly_name,
+ unmanaged_handle));
+ }
+
+ // Iterate over all files and directories within the zip. The order of iteration is not
+ // guaranteed to be the same as the order of elements in the central directory but is stable for a
+ // given zip file.
+ bool ForEachFile(const std::string& root_path,
+ const std::function<void(const StringPiece&, FileType)>& f) const override {
+ // If this is a resource loader from an .arsc, there will be no zip handle
+ if (zip_handle_ == nullptr) {
+ return false;
+ }
+
+ std::string root_path_full = root_path;
+ if (root_path_full.back() != '/') {
+ root_path_full += '/';
+ }
+
+ void* cookie;
+ if (::StartIteration(zip_handle_.get(), &cookie, root_path_full, "") != 0) {
+ return false;
+ }
+
+ std::string name;
+ ::ZipEntry entry{};
+
+ // We need to hold back directories because many paths will contain them and we want to only
+ // surface one.
+ std::set<std::string> dirs{};
+
+ int32_t result;
+ while ((result = ::Next(cookie, &entry, &name)) == 0) {
+ StringPiece full_file_path(name);
+ StringPiece leaf_file_path = full_file_path.substr(root_path_full.size());
+
+ if (!leaf_file_path.empty()) {
+ auto iter = std::find(leaf_file_path.begin(), leaf_file_path.end(), '/');
+ if (iter != leaf_file_path.end()) {
+ std::string dir =
+ leaf_file_path.substr(0, std::distance(leaf_file_path.begin(), iter)).to_string();
+ dirs.insert(std::move(dir));
+ } else {
+ f(leaf_file_path, kFileTypeRegular);
+ }
+ }
+ }
+ ::EndIteration(cookie);
+
+ // Now present the unique directories.
+ for (const std::string& dir : dirs) {
+ f(dir, kFileTypeDirectory);
+ }
+
+ // -1 is end of iteration, anything else is an error.
+ return result == -1;
+ }
+
+ protected:
+ std::unique_ptr<Asset> OpenInternal(
+ const std::string& path, Asset::AccessMode mode, bool* file_exists) const override {
+ if (file_exists) {
+ *file_exists = false;
+ }
+
+ ::ZipEntry entry;
+ int32_t result = ::FindEntry(zip_handle_.get(), path, &entry);
+ if (result != 0) {
+ return {};
+ }
+
+ if (file_exists) {
+ *file_exists = true;
+ }
+
+ const int fd = ::GetFileDescriptor(zip_handle_.get());
+ const off64_t fd_offset = ::GetFileDescriptorOffset(zip_handle_.get());
+ if (entry.method == kCompressDeflated) {
+ std::unique_ptr<FileMap> map = util::make_unique<FileMap>();
+ if (!map->create(GetPath(), fd, entry.offset + fd_offset, entry.compressed_length,
+ true /*readOnly*/)) {
+ LOG(ERROR) << "Failed to mmap file '" << path << "' in APK '" << friendly_name_ << "'";
+ return {};
+ }
+
+ std::unique_ptr<Asset> asset =
+ Asset::createFromCompressedMap(std::move(map), entry.uncompressed_length, mode);
+ if (asset == nullptr) {
+ LOG(ERROR) << "Failed to decompress '" << path << "' in APK '" << friendly_name_ << "'";
+ return {};
+ }
+ return asset;
+ } else {
+ std::unique_ptr<FileMap> map = util::make_unique<FileMap>();
+ if (!map->create(GetPath(), fd, entry.offset + fd_offset, entry.uncompressed_length,
+ true /*readOnly*/)) {
+ LOG(ERROR) << "Failed to mmap file '" << path << "' in APK '" << friendly_name_ << "'";
+ return {};
+ }
+
+ unique_fd ufd;
+ if (!GetPath()) {
+ // If the `path` is not set, create a new `fd` for the new Asset to own in order to create
+ // new file descriptors using Asset::openFileDescriptor. If the path is set, it will be used
+ // to create new file descriptors.
+ ufd = unique_fd(dup(fd));
+ if (!ufd.ok()) {
+ LOG(ERROR) << "Unable to dup fd '" << path << "' in APK '" << friendly_name_ << "'";
+ return {};
+ }
+ }
+
+ std::unique_ptr<Asset> asset = Asset::createFromUncompressedMap(std::move(map),
+ std::move(ufd), mode);
+ if (asset == nullptr) {
+ LOG(ERROR) << "Failed to mmap file '" << path << "' in APK '" << friendly_name_ << "'";
+ return {};
+ }
+ return asset;
+ }
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ZipAssetsProvider);
+
+ explicit ZipAssetsProvider(std::string path,
+ std::string friendly_name,
+ ZipArchiveHandle unmanaged_handle)
+ : zip_handle_(unmanaged_handle, ::CloseArchive),
+ path_(std::move(path)),
+ friendly_name_(std::move(friendly_name)) { }
+
+ const char* GetPath() const {
+ return path_.empty() ? nullptr : path_.c_str();
+ }
+
+ using ZipArchivePtr = std::unique_ptr<ZipArchive, void (*)(ZipArchiveHandle)>;
+ ZipArchivePtr zip_handle_;
+ std::string path_;
+ std::string friendly_name_;
+};
+
+class DirectoryAssetsProvider : AssetsProvider {
+ public:
+ ~DirectoryAssetsProvider() override = default;
+
+ static std::unique_ptr<const AssetsProvider> Create(const std::string& path) {
+ struct stat sb{};
+ const int result = stat(path.c_str(), &sb);
+ if (result == -1) {
+ LOG(ERROR) << "Failed to find directory '" << path << "'.";
+ return nullptr;
+ }
+
+ if (!S_ISDIR(sb.st_mode)) {
+ LOG(ERROR) << "Path '" << path << "' is not a directory.";
+ return nullptr;
+ }
+
+ return std::unique_ptr<AssetsProvider>(new DirectoryAssetsProvider(path));
+ }
+
+ protected:
+ std::unique_ptr<Asset> OpenInternal(
+ const std::string& path, Asset::AccessMode /* mode */, bool* file_exists) const override {
+ const std::string resolved_path = ResolvePath(path);
+ if (file_exists) {
+ struct stat sb{};
+ const int result = stat(resolved_path.c_str(), &sb);
+ *file_exists = result != -1 && S_ISREG(sb.st_mode);
+ }
+
+ return ApkAssets::CreateAssetFromFile(resolved_path);
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(DirectoryAssetsProvider);
+
+ explicit DirectoryAssetsProvider(std::string path) : path_(std::move(path)) { }
+
+ inline std::string ResolvePath(const std::string& path) const {
+ return base::StringPrintf("%s%c%s", path_.c_str(), OS_PATH_SEPARATOR, path.c_str());
+ }
+
+ const std::string path_;
+};
+
+// AssetProvider implementation that does not provide any assets. Used for ApkAssets::LoadEmpty.
+class EmptyAssetsProvider : public AssetsProvider {
+ public:
+ EmptyAssetsProvider() = default;
+ ~EmptyAssetsProvider() override = default;
+
+ protected:
+ std::unique_ptr<Asset> OpenInternal(const std::string& /*path */,
+ Asset::AccessMode /* mode */,
+ bool* file_exists) const override {
+ if (file_exists) {
+ *file_exists = false;
+ }
+ return nullptr;
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(EmptyAssetsProvider);
+};
+
+// AssetProvider implementation
+class MultiAssetsProvider : public AssetsProvider {
+ public:
+ ~MultiAssetsProvider() override = default;
+
+ static std::unique_ptr<const AssetsProvider> Create(
+ std::unique_ptr<const AssetsProvider> child, std::unique_ptr<const AssetsProvider> parent) {
+ CHECK(parent != nullptr) << "parent provider must not be null";
+ return (!child) ? std::move(parent)
+ : std::unique_ptr<const AssetsProvider>(new MultiAssetsProvider(
+ std::move(child), std::move(parent)));
+ }
+
+ bool ForEachFile(const std::string& root_path,
+ const std::function<void(const StringPiece&, FileType)>& f) const override {
+ // TODO: Only call the function once for files defined in the parent and child
+ return child_->ForEachFile(root_path, f) && parent_->ForEachFile(root_path, f);
+ }
+
+ protected:
+ std::unique_ptr<Asset> OpenInternal(
+ const std::string& path, Asset::AccessMode mode, bool* file_exists) const override {
+ auto asset = child_->Open(path, mode, file_exists);
+ return (asset) ? std::move(asset) : parent_->Open(path, mode, file_exists);
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MultiAssetsProvider);
+
+ MultiAssetsProvider(std::unique_ptr<const AssetsProvider> child,
+ std::unique_ptr<const AssetsProvider> parent)
+ : child_(std::move(child)), parent_(std::move(parent)) { }
+
+ std::unique_ptr<const AssetsProvider> child_;
+ std::unique_ptr<const AssetsProvider> parent_;
+};
+
+// Opens the archive using the file path. Calling CloseArchive on the zip handle will close the
+// file.
+std::unique_ptr<const ApkAssets> ApkAssets::Load(
+ const std::string& path, const package_property_t flags,
+ std::unique_ptr<const AssetsProvider> override_asset) {
+ auto assets = ZipAssetsProvider::Create(path);
+ return (assets) ? LoadImpl(std::move(assets), path, flags, std::move(override_asset))
+ : nullptr;
}
-std::unique_ptr<const ApkAssets> ApkAssets::LoadAsSharedLibrary(const std::string& path,
- bool system) {
- package_property_t flags = PROPERTY_DYNAMIC | (system ? PROPERTY_SYSTEM : 0U);
- return LoadImpl({} /*fd*/, path, nullptr, nullptr, flags);
+// Opens the archive using the file file descriptor with the specified file offset and read length.
+// If the `assume_ownership` parameter is 'true' calling CloseArchive will close the file.
+std::unique_ptr<const ApkAssets> ApkAssets::LoadFromFd(
+ unique_fd fd, const std::string& friendly_name, const package_property_t flags,
+ std::unique_ptr<const AssetsProvider> override_asset, const off64_t offset,
+ const off64_t length) {
+ CHECK(length >= kUnknownLength) << "length must be greater than or equal to " << kUnknownLength;
+ CHECK(length != kUnknownLength || offset == 0) << "offset must be 0 if length is "
+ << kUnknownLength;
+
+ auto assets = ZipAssetsProvider::Create(std::move(fd), friendly_name, offset, length);
+ return (assets) ? LoadImpl(std::move(assets), friendly_name, flags, std::move(override_asset))
+ : nullptr;
+}
+
+std::unique_ptr<const ApkAssets> ApkAssets::LoadTable(
+ const std::string& path, const package_property_t flags,
+ std::unique_ptr<const AssetsProvider> override_asset) {
+
+ auto assets = CreateAssetFromFile(path);
+ return (assets) ? LoadTableImpl(std::move(assets), path, flags, std::move(override_asset))
+ : nullptr;
+}
+
+std::unique_ptr<const ApkAssets> ApkAssets::LoadTableFromFd(
+ unique_fd fd, const std::string& friendly_name, const package_property_t flags,
+ std::unique_ptr<const AssetsProvider> override_asset, const off64_t offset,
+ const off64_t length) {
+
+ auto assets = CreateAssetFromFd(std::move(fd), nullptr /* path */, offset, length);
+ return (assets) ? LoadTableImpl(std::move(assets), friendly_name, flags,
+ std::move(override_asset))
+ : nullptr;
}
std::unique_ptr<const ApkAssets> ApkAssets::LoadOverlay(const std::string& idmap_path,
- bool system) {
+ const package_property_t flags) {
+ CHECK((flags & PROPERTY_LOADER) == 0U) << "Cannot load RROs through loaders";
std::unique_ptr<Asset> idmap_asset = CreateAssetFromFile(idmap_path);
if (idmap_asset == nullptr) {
return {};
@@ -76,110 +390,115 @@
LOG(ERROR) << "failed to load IDMAP " << idmap_path;
return {};
}
-
- return LoadImpl({} /*fd*/, loaded_idmap->OverlayApkPath(),
- std::move(idmap_asset),
- std::move(loaded_idmap),
- PROPERTY_OVERLAY | (system ? PROPERTY_SYSTEM : 0U));
+
+ auto overlay_path = loaded_idmap->OverlayApkPath();
+ auto assets = ZipAssetsProvider::Create(overlay_path);
+ return (assets) ? LoadImpl(std::move(assets), overlay_path, flags | PROPERTY_OVERLAY,
+ nullptr /* override_asset */, std::move(idmap_asset),
+ std::move(loaded_idmap))
+ : nullptr;
}
-std::unique_ptr<const ApkAssets> ApkAssets::LoadFromFd(unique_fd fd,
- const std::string& friendly_name,
- bool system, bool force_shared_lib,
- bool for_loader) {
- package_property_t flags = (system ? PROPERTY_SYSTEM : 0U) |
- (force_shared_lib ? PROPERTY_DYNAMIC : 0U) |
- (for_loader ? PROPERTY_LOADER : 0U);
- return LoadImpl(std::move(fd), friendly_name, nullptr /*idmap_asset*/, nullptr /*loaded_idmap*/,
- flags);
+std::unique_ptr<const ApkAssets> ApkAssets::LoadFromDir(
+ const std::string& path, const package_property_t flags,
+ std::unique_ptr<const AssetsProvider> override_asset) {
+
+ auto assets = DirectoryAssetsProvider::Create(path);
+ return (assets) ? LoadImpl(std::move(assets), path, flags, std::move(override_asset))
+ : nullptr;
}
-std::unique_ptr<const ApkAssets> ApkAssets::LoadArsc(const std::string& path,
- bool for_loader) {
- return LoadArscImpl({} /*fd*/, path, for_loader ? PROPERTY_LOADER : 0U);
-}
+std::unique_ptr<const ApkAssets> ApkAssets::LoadEmpty(
+ const package_property_t flags, std::unique_ptr<const AssetsProvider> override_asset) {
-std::unique_ptr<const ApkAssets> ApkAssets::LoadArsc(unique_fd fd,
- const std::string& friendly_name,
- bool for_loader) {
- return LoadArscImpl(std::move(fd), friendly_name, for_loader ? PROPERTY_LOADER : 0U);
+ auto assets = (override_asset) ? std::move(override_asset)
+ : std::unique_ptr<const AssetsProvider>(new EmptyAssetsProvider());
+ std::unique_ptr<ApkAssets> loaded_apk(new ApkAssets(std::move(assets), "empty" /* path */,
+ -1 /* last_mod-time */, flags));
+ loaded_apk->loaded_arsc_ = LoadedArsc::CreateEmpty();
+ // Need to force a move for mingw32.
+ return std::move(loaded_apk);
}
std::unique_ptr<Asset> ApkAssets::CreateAssetFromFile(const std::string& path) {
unique_fd fd(base::utf8::open(path.c_str(), O_RDONLY | O_BINARY | O_CLOEXEC));
- if (fd == -1) {
+ if (!fd.ok()) {
LOG(ERROR) << "Failed to open file '" << path << "': " << SystemErrorCodeToString(errno);
return {};
}
- const off64_t file_len = lseek64(fd, 0, SEEK_END);
- if (file_len < 0) {
- LOG(ERROR) << "Failed to get size of file '" << path << "': " << SystemErrorCodeToString(errno);
- return {};
+ return CreateAssetFromFd(std::move(fd), path.c_str());
+}
+
+std::unique_ptr<Asset> ApkAssets::CreateAssetFromFd(base::unique_fd fd,
+ const char* path,
+ off64_t offset,
+ off64_t length) {
+ CHECK(length >= kUnknownLength) << "length must be greater than or equal to " << kUnknownLength;
+ CHECK(length != kUnknownLength || offset == 0) << "offset must be 0 if length is "
+ << kUnknownLength;
+ if (length == kUnknownLength) {
+ length = lseek64(fd, 0, SEEK_END);
+ if (length < 0) {
+ LOG(ERROR) << "Failed to get size of file '" << ((path) ? path : "anon") << "': "
+ << SystemErrorCodeToString(errno);
+ return {};
+ }
}
std::unique_ptr<FileMap> file_map = util::make_unique<FileMap>();
- if (!file_map->create(path.c_str(), fd, 0, static_cast<size_t>(file_len), true /*readOnly*/)) {
- LOG(ERROR) << "Failed to mmap file '" << path << "': " << SystemErrorCodeToString(errno);
+ if (!file_map->create(path, fd, offset, static_cast<size_t>(length), true /*readOnly*/)) {
+ LOG(ERROR) << "Failed to mmap file '" << ((path) ? path : "anon") << "': "
+ << SystemErrorCodeToString(errno);
return {};
}
- return Asset::createFromUncompressedMap(std::move(file_map), Asset::AccessMode::ACCESS_RANDOM);
+
+ // If `path` is set, do not pass ownership of the `fd` to the new Asset since
+ // Asset::openFileDescriptor can use `path` to create new file descriptors.
+ return Asset::createFromUncompressedMap(std::move(file_map),
+ (path) ? base::unique_fd(-1) : std::move(fd),
+ Asset::AccessMode::ACCESS_RANDOM);
}
std::unique_ptr<const ApkAssets> ApkAssets::LoadImpl(
- unique_fd fd, const std::string& path, std::unique_ptr<Asset> idmap_asset,
- std::unique_ptr<const LoadedIdmap> loaded_idmap, package_property_t property_flags) {
- ::ZipArchiveHandle unmanaged_handle;
- int32_t result;
- if (fd >= 0) {
- result =
- ::OpenArchiveFd(fd.release(), path.c_str(), &unmanaged_handle, true /*assume_ownership*/);
- } else {
- result = ::OpenArchive(path.c_str(), &unmanaged_handle);
- }
+ std::unique_ptr<const AssetsProvider> assets, const std::string& path,
+ package_property_t property_flags, std::unique_ptr<const AssetsProvider> override_assets,
+ std::unique_ptr<Asset> idmap_asset, std::unique_ptr<const LoadedIdmap> idmap) {
- if (result != 0) {
- LOG(ERROR) << "Failed to open APK '" << path << "' " << ::ErrorCodeString(result);
- ::CloseArchive(unmanaged_handle);
- return {};
- }
+ const time_t last_mod_time = getFileModDate(path.c_str());
- time_t last_mod_time = getFileModDate(path.c_str());
+ // Open the resource table via mmap unless it is compressed. This logic is taken care of by Open.
+ bool resources_asset_exists = false;
+ auto resources_asset_ = assets->Open(kResourcesArsc, Asset::AccessMode::ACCESS_BUFFER,
+ &resources_asset_exists);
+
+ assets = MultiAssetsProvider::Create(std::move(override_assets), std::move(assets));
// Wrap the handle in a unique_ptr so it gets automatically closed.
std::unique_ptr<ApkAssets>
- loaded_apk(new ApkAssets(unmanaged_handle, path, last_mod_time, property_flags));
+ loaded_apk(new ApkAssets(std::move(assets), path, last_mod_time, property_flags));
- // Find the resource table.
- ::ZipEntry entry;
- result = ::FindEntry(loaded_apk->zip_handle_.get(), kResourcesArsc, &entry);
- if (result != 0) {
- // There is no resources.arsc, so create an empty LoadedArsc and return.
+ if (!resources_asset_exists) {
loaded_apk->loaded_arsc_ = LoadedArsc::CreateEmpty();
return std::move(loaded_apk);
}
- if (entry.method == kCompressDeflated) {
- ANDROID_LOG(WARNING) << kResourcesArsc << " in APK '" << path << "' is compressed.";
- }
-
- // Open the resource table via mmap unless it is compressed. This logic is taken care of by Open.
- loaded_apk->resources_asset_ = loaded_apk->Open(kResourcesArsc, Asset::AccessMode::ACCESS_BUFFER);
- if (loaded_apk->resources_asset_ == nullptr) {
+ loaded_apk->resources_asset_ = std::move(resources_asset_);
+ if (!loaded_apk->resources_asset_) {
LOG(ERROR) << "Failed to open '" << kResourcesArsc << "' in APK '" << path << "'.";
return {};
}
// Must retain ownership of the IDMAP Asset so that all pointers to its mmapped data remain valid.
loaded_apk->idmap_asset_ = std::move(idmap_asset);
- loaded_apk->loaded_idmap_ = std::move(loaded_idmap);
+ loaded_apk->loaded_idmap_ = std::move(idmap);
const StringPiece data(
reinterpret_cast<const char*>(loaded_apk->resources_asset_->getBuffer(true /*wordAligned*/)),
loaded_apk->resources_asset_->getLength());
loaded_apk->loaded_arsc_ = LoadedArsc::Load(data, loaded_apk->loaded_idmap_.get(),
property_flags);
- if (loaded_apk->loaded_arsc_ == nullptr) {
+ if (!loaded_apk->loaded_arsc_) {
LOG(ERROR) << "Failed to load '" << kResourcesArsc << "' in APK '" << path << "'.";
return {};
}
@@ -188,27 +507,17 @@
return std::move(loaded_apk);
}
-std::unique_ptr<const ApkAssets> ApkAssets::LoadArscImpl(unique_fd fd,
- const std::string& path,
- package_property_t property_flags) {
- std::unique_ptr<Asset> resources_asset;
+std::unique_ptr<const ApkAssets> ApkAssets::LoadTableImpl(
+ std::unique_ptr<Asset> resources_asset, const std::string& path,
+ package_property_t property_flags, std::unique_ptr<const AssetsProvider> override_assets) {
- if (fd >= 0) {
- resources_asset = std::unique_ptr<Asset>(Asset::createFromFd(fd.release(), nullptr,
- Asset::AccessMode::ACCESS_BUFFER));
- } else {
- resources_asset = CreateAssetFromFile(path);
- }
+ const time_t last_mod_time = getFileModDate(path.c_str());
- if (resources_asset == nullptr) {
- LOG(ERROR) << "Failed to open ARSC '" << path;
- return {};
- }
-
- time_t last_mod_time = getFileModDate(path.c_str());
+ auto assets = (override_assets) ? std::move(override_assets)
+ : std::unique_ptr<AssetsProvider>(new EmptyAssetsProvider());
std::unique_ptr<ApkAssets> loaded_apk(
- new ApkAssets(nullptr, path, last_mod_time, property_flags));
+ new ApkAssets(std::move(assets), path, last_mod_time, property_flags));
loaded_apk->resources_asset_ = std::move(resources_asset);
const StringPiece data(
@@ -224,111 +533,9 @@
return std::move(loaded_apk);
}
-std::unique_ptr<const ApkAssets> ApkAssets::LoadEmpty(bool for_loader) {
- std::unique_ptr<ApkAssets> loaded_apk(new ApkAssets(nullptr, "", -1, for_loader));
- loaded_apk->loaded_arsc_ = LoadedArsc::CreateEmpty();
- // Need to force a move for mingw32.
- return std::move(loaded_apk);
-}
-
-std::unique_ptr<Asset> ApkAssets::Open(const std::string& path, Asset::AccessMode mode) const {
- // If this is a resource loader from an .arsc, there will be no zip handle
- if (zip_handle_ == nullptr) {
- return {};
- }
-
- ::ZipEntry entry;
- int32_t result = ::FindEntry(zip_handle_.get(), path, &entry);
- if (result != 0) {
- return {};
- }
-
- if (entry.method == kCompressDeflated) {
- std::unique_ptr<FileMap> map = util::make_unique<FileMap>();
- if (!map->create(path_.c_str(), ::GetFileDescriptor(zip_handle_.get()), entry.offset,
- entry.compressed_length, true /*readOnly*/)) {
- LOG(ERROR) << "Failed to mmap file '" << path << "' in APK '" << path_ << "'";
- return {};
- }
-
- std::unique_ptr<Asset> asset =
- Asset::createFromCompressedMap(std::move(map), entry.uncompressed_length, mode);
- if (asset == nullptr) {
- LOG(ERROR) << "Failed to decompress '" << path << "'.";
- return {};
- }
- return asset;
- } else {
- std::unique_ptr<FileMap> map = util::make_unique<FileMap>();
- if (!map->create(path_.c_str(), ::GetFileDescriptor(zip_handle_.get()), entry.offset,
- entry.uncompressed_length, true /*readOnly*/)) {
- LOG(ERROR) << "Failed to mmap file '" << path << "' in APK '" << path_ << "'";
- return {};
- }
-
- std::unique_ptr<Asset> asset = Asset::createFromUncompressedMap(std::move(map), mode);
- if (asset == nullptr) {
- LOG(ERROR) << "Failed to mmap file '" << path << "' in APK '" << path_ << "'";
- return {};
- }
- return asset;
- }
-}
-
-bool ApkAssets::ForEachFile(const std::string& root_path,
- const std::function<void(const StringPiece&, FileType)>& f) const {
- // If this is a resource loader from an .arsc, there will be no zip handle
- if (zip_handle_ == nullptr) {
- return false;
- }
-
- std::string root_path_full = root_path;
- if (root_path_full.back() != '/') {
- root_path_full += '/';
- }
-
- void* cookie;
- if (::StartIteration(zip_handle_.get(), &cookie, root_path_full, "") != 0) {
- return false;
- }
-
- std::string name;
- ::ZipEntry entry;
-
- // We need to hold back directories because many paths will contain them and we want to only
- // surface one.
- std::set<std::string> dirs;
-
- int32_t result;
- while ((result = ::Next(cookie, &entry, &name)) == 0) {
- StringPiece full_file_path(name);
- StringPiece leaf_file_path = full_file_path.substr(root_path_full.size());
-
- if (!leaf_file_path.empty()) {
- auto iter = std::find(leaf_file_path.begin(), leaf_file_path.end(), '/');
- if (iter != leaf_file_path.end()) {
- std::string dir =
- leaf_file_path.substr(0, std::distance(leaf_file_path.begin(), iter)).to_string();
- dirs.insert(std::move(dir));
- } else {
- f(leaf_file_path, kFileTypeRegular);
- }
- }
- }
- ::EndIteration(cookie);
-
- // Now present the unique directories.
- for (const std::string& dir : dirs) {
- f(dir, kFileTypeDirectory);
- }
-
- // -1 is end of iteration, anything else is an error.
- return result == -1;
-}
-
bool ApkAssets::IsUpToDate() const {
if (IsLoader()) {
- // Loaders are invalidated by the app, not the system, so assume up to date.
+ // Loaders are invalidated by the app, not the system, so assume they are up to date.
return true;
}
diff --git a/libs/androidfw/Asset.cpp b/libs/androidfw/Asset.cpp
index c132f34..cd30c18 100644
--- a/libs/androidfw/Asset.cpp
+++ b/libs/androidfw/Asset.cpp
@@ -298,14 +298,13 @@
/*
* Create a new Asset from a memory mapping.
*/
-/*static*/ Asset* Asset::createFromUncompressedMap(FileMap* dataMap,
- AccessMode mode)
+/*static*/ Asset* Asset::createFromUncompressedMap(FileMap* dataMap, AccessMode mode)
{
_FileAsset* pAsset;
status_t result;
pAsset = new _FileAsset;
- result = pAsset->openChunk(dataMap);
+ result = pAsset->openChunk(dataMap, base::unique_fd(-1));
if (result != NO_ERROR) {
delete pAsset;
return NULL;
@@ -316,11 +315,11 @@
}
/*static*/ std::unique_ptr<Asset> Asset::createFromUncompressedMap(std::unique_ptr<FileMap> dataMap,
- AccessMode mode)
+ base::unique_fd fd, AccessMode mode)
{
std::unique_ptr<_FileAsset> pAsset = util::make_unique<_FileAsset>();
- status_t result = pAsset->openChunk(dataMap.get());
+ status_t result = pAsset->openChunk(dataMap.get(), std::move(fd));
if (result != NO_ERROR) {
return NULL;
}
@@ -415,7 +414,7 @@
* Constructor.
*/
_FileAsset::_FileAsset(void)
- : mStart(0), mLength(0), mOffset(0), mFp(NULL), mFileName(NULL), mMap(NULL), mBuf(NULL)
+ : mStart(0), mLength(0), mOffset(0), mFp(NULL), mFileName(NULL), mFd(-1), mMap(NULL), mBuf(NULL)
{
// Register the Asset with the global list here after it is fully constructed and its
// vtable pointer points to this concrete type. b/31113965
@@ -485,7 +484,7 @@
/*
* Create the chunk from the map.
*/
-status_t _FileAsset::openChunk(FileMap* dataMap)
+status_t _FileAsset::openChunk(FileMap* dataMap, base::unique_fd fd)
{
assert(mFp == NULL); // no reopen
assert(mMap == NULL);
@@ -494,6 +493,7 @@
mMap = dataMap;
mStart = -1; // not used
mLength = dataMap->getDataLength();
+ mFd = std::move(fd);
assert(mOffset == 0);
return NO_ERROR;
@@ -692,6 +692,17 @@
int _FileAsset::openFileDescriptor(off64_t* outStart, off64_t* outLength) const
{
if (mMap != NULL) {
+ if (mFd.ok()) {
+ *outStart = mMap->getDataOffset();
+ *outLength = mMap->getDataLength();
+ const int fd = dup(mFd);
+ if (fd < 0) {
+ ALOGE("Unable to dup fd (%d).", mFd.get());
+ return -1;
+ }
+ lseek64(fd, 0, SEEK_SET);
+ return fd;
+ }
const char* fname = mMap->getFileName();
if (fname == NULL) {
fname = mFileName;
diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp
index 3208662..f20e184 100644
--- a/libs/androidfw/AssetManager2.cpp
+++ b/libs/androidfw/AssetManager2.cpp
@@ -463,7 +463,7 @@
files->add(info);
};
- if (!apk_assets->ForEachFile(full_path, func)) {
+ if (!apk_assets->GetAssetsProvider()->ForEachFile(full_path, func)) {
return {};
}
}
@@ -487,7 +487,7 @@
continue;
}
- std::unique_ptr<Asset> asset = apk_assets_[i]->Open(filename, mode);
+ std::unique_ptr<Asset> asset = apk_assets_[i]->GetAssetsProvider()->Open(filename, mode);
if (asset) {
if (out_cookie != nullptr) {
*out_cookie = i;
@@ -508,7 +508,7 @@
if (cookie < 0 || static_cast<size_t>(cookie) >= apk_assets_.size()) {
return {};
}
- return apk_assets_[cookie]->Open(filename, mode);
+ return apk_assets_[cookie]->GetAssetsProvider()->Open(filename, mode);
}
ApkAssetsCookie AssetManager2::FindEntry(uint32_t resid, uint16_t density_override,
diff --git a/libs/androidfw/LoadedArsc.cpp b/libs/androidfw/LoadedArsc.cpp
index e35c024..70bb441 100644
--- a/libs/androidfw/LoadedArsc.cpp
+++ b/libs/androidfw/LoadedArsc.cpp
@@ -749,7 +749,7 @@
std::unique_ptr<const LoadedArsc> LoadedArsc::Load(const StringPiece& data,
const LoadedIdmap* loaded_idmap,
- package_property_t property_flags) {
+ const package_property_t property_flags) {
ATRACE_NAME("LoadedArsc::Load");
// Not using make_unique because the constructor is private.
diff --git a/libs/androidfw/include/androidfw/ApkAssets.h b/libs/androidfw/include/androidfw/ApkAssets.h
index af802b0..879b050 100644
--- a/libs/androidfw/include/androidfw/ApkAssets.h
+++ b/libs/androidfw/include/androidfw/ApkAssets.h
@@ -35,62 +35,98 @@
class LoadedIdmap;
+// Interface for retrieving assets provided by an ApkAssets.
+class AssetsProvider {
+ public:
+ virtual ~AssetsProvider() = default;
+
+ // Opens a file for reading.
+ std::unique_ptr<Asset> Open(const std::string& path,
+ Asset::AccessMode mode = Asset::AccessMode::ACCESS_RANDOM,
+ bool* file_exists = nullptr) const {
+ return OpenInternal(path, mode, file_exists);
+ }
+
+ // Iterate over all files and directories provided by the zip. The order of iteration is stable.
+ virtual bool ForEachFile(const std::string& /* path */,
+ const std::function<void(const StringPiece&, FileType)>& /* f */) const {
+ return true;
+ }
+
+ protected:
+ AssetsProvider() = default;
+
+ virtual std::unique_ptr<Asset> OpenInternal(const std::string& path,
+ Asset::AccessMode mode,
+ bool* file_exists) const = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(AssetsProvider);
+};
+
+class ZipAssetsProvider;
+
// Holds an APK.
class ApkAssets {
public:
+ // This means the data extends to the end of the file.
+ static constexpr off64_t kUnknownLength = -1;
+
// Creates an ApkAssets.
// If `system` is true, the package is marked as a system package, and allows some functions to
// filter out this package when computing what configurations/resources are available.
- static std::unique_ptr<const ApkAssets> Load(const std::string& path, bool system = false,
- bool for_loader = false);
-
- // Creates an ApkAssets, but forces any package with ID 0x7f to be loaded as a shared library.
- // If `system` is true, the package is marked as a system package, and allows some functions to
- // filter out this package when computing what configurations/resources are available.
- static std::unique_ptr<const ApkAssets> LoadAsSharedLibrary(const std::string& path,
- bool system = false);
-
- // Creates an ApkAssets from an IDMAP, which contains the original APK path, and the overlay
- // data.
- // If `system` is true, the package is marked as a system package, and allows some functions to
- // filter out this package when computing what configurations/resources are available.
- static std::unique_ptr<const ApkAssets> LoadOverlay(const std::string& idmap_path,
- bool system = false);
+ static std::unique_ptr<const ApkAssets> Load(
+ const std::string& path, package_property_t flags = 0U,
+ std::unique_ptr<const AssetsProvider> override_asset = nullptr);
// Creates an ApkAssets from the given file descriptor, and takes ownership of the file
// descriptor. The `friendly_name` is some name that will be used to identify the source of
// this ApkAssets in log messages and other debug scenarios.
- // If `system` is true, the package is marked as a system package, and allows some functions to
- // filter out this package when computing what configurations/resources are available.
- // If `force_shared_lib` is true, any package with ID 0x7f is loaded as a shared library.
- static std::unique_ptr<const ApkAssets> LoadFromFd(base::unique_fd fd,
- const std::string& friendly_name, bool system,
- bool force_shared_lib,
- bool for_loader = false);
+ // If `length` equals kUnknownLength, offset must equal 0; otherwise, the apk data will be read
+ // using the `offset` into the file descriptor and will be `length` bytes long.
+ static std::unique_ptr<const ApkAssets> LoadFromFd(
+ base::unique_fd fd, const std::string& friendly_name, package_property_t flags = 0U,
+ std::unique_ptr<const AssetsProvider> override_asset = nullptr, off64_t offset = 0,
+ off64_t length = kUnknownLength);
- // Creates an empty wrapper ApkAssets from the given path which points to an .arsc.
- static std::unique_ptr<const ApkAssets> LoadArsc(const std::string& path,
- bool for_loader = false);
+ // Creates an ApkAssets from the given path which points to a resources.arsc.
+ static std::unique_ptr<const ApkAssets> LoadTable(
+ const std::string& path, package_property_t flags = 0U,
+ std::unique_ptr<const AssetsProvider> override_asset = nullptr);
- // Creates an empty wrapper ApkAssets from the given file descriptor which points to an .arsc,
- // Takes ownership of the file descriptor.
- static std::unique_ptr<const ApkAssets> LoadArsc(base::unique_fd fd,
- const std::string& friendly_name,
- bool for_loader = false);
+ // Creates an ApkAssets from the given file descriptor which points to an resources.arsc, and
+ // takes ownership of the file descriptor.
+ // If `length` equals kUnknownLength, offset must equal 0; otherwise, the .arsc data will be read
+ // using the `offset` into the file descriptor and will be `length` bytes long.
+ static std::unique_ptr<const ApkAssets> LoadTableFromFd(
+ base::unique_fd fd, const std::string& friendly_name, package_property_t flags = 0U,
+ std::unique_ptr<const AssetsProvider> override_asset = nullptr, off64_t offset = 0,
+ off64_t length = kUnknownLength);
+
+ // Creates an ApkAssets from an IDMAP, which contains the original APK path, and the overlay
+ // data.
+ static std::unique_ptr<const ApkAssets> LoadOverlay(const std::string& idmap_path,
+ package_property_t flags = 0U);
+
+ // Creates an ApkAssets from the directory path. File-based resources are read within the
+ // directory as if the directory is an APK.
+ static std::unique_ptr<const ApkAssets> LoadFromDir(
+ const std::string& path, package_property_t flags = 0U,
+ std::unique_ptr<const AssetsProvider> override_asset = nullptr);
// Creates a totally empty ApkAssets with no resources table and no file entries.
- static std::unique_ptr<const ApkAssets> LoadEmpty(bool for_loader = false);
-
- std::unique_ptr<Asset> Open(const std::string& path,
- Asset::AccessMode mode = Asset::AccessMode::ACCESS_RANDOM) const;
-
- bool ForEachFile(const std::string& path,
- const std::function<void(const StringPiece&, FileType)>& f) const;
+ static std::unique_ptr<const ApkAssets> LoadEmpty(
+ package_property_t flags = 0U,
+ std::unique_ptr<const AssetsProvider> override_asset = nullptr);
inline const std::string& GetPath() const {
return path_;
}
+ inline const AssetsProvider* GetAssetsProvider() const {
+ return assets_provider_.get();
+ }
+
// This is never nullptr.
inline const LoadedArsc* GetLoadedArsc() const {
return loaded_arsc_.get();
@@ -105,34 +141,44 @@
}
inline bool IsOverlay() const {
- return (property_flags_ & PROPERTY_OVERLAY) != 0;
+ return loaded_idmap_ != nullptr;
}
bool IsUpToDate() const;
- // Creates an Asset from any file on the file system.
+ // Creates an Asset from a file on disk.
static std::unique_ptr<Asset> CreateAssetFromFile(const std::string& path);
+ // Creates an Asset from a file descriptor.
+ //
+ // The asset takes ownership of the file descriptor. If `length` equals kUnknownLength, offset
+ // must equal 0; otherwise, the asset data will be read using the `offset` into the file
+ // descriptor and will be `length` bytes long.
+ static std::unique_ptr<Asset> CreateAssetFromFd(base::unique_fd fd,
+ const char* path,
+ off64_t offset = 0,
+ off64_t length = kUnknownLength);
private:
DISALLOW_COPY_AND_ASSIGN(ApkAssets);
- static std::unique_ptr<const ApkAssets> LoadImpl(base::unique_fd fd, const std::string& path,
- std::unique_ptr<Asset> idmap_asset,
- std::unique_ptr<const LoadedIdmap> loaded_idmap,
- package_property_t property_flags);
+ static std::unique_ptr<const ApkAssets> LoadImpl(
+ std::unique_ptr<const AssetsProvider> assets, const std::string& path,
+ package_property_t property_flags,
+ std::unique_ptr<const AssetsProvider> override_assets = nullptr,
+ std::unique_ptr<Asset> idmap_asset = nullptr,
+ std::unique_ptr<const LoadedIdmap> idmap = nullptr);
- static std::unique_ptr<const ApkAssets> LoadArscImpl(base::unique_fd fd,
- const std::string& path,
- package_property_t property_flags);
+ static std::unique_ptr<const ApkAssets> LoadTableImpl(
+ std::unique_ptr<Asset> resources_asset, const std::string& path,
+ package_property_t property_flags,
+ std::unique_ptr<const AssetsProvider> override_assets = nullptr);
- ApkAssets(ZipArchiveHandle unmanaged_handle,
- const std::string& path,
+ ApkAssets(std::unique_ptr<const AssetsProvider> assets_provider,
+ std::string path,
time_t last_mod_time,
package_property_t property_flags);
- using ZipArchivePtr = std::unique_ptr<ZipArchive, void (*)(ZipArchiveHandle)>;
-
- ZipArchivePtr zip_handle_;
+ std::unique_ptr<const AssetsProvider> assets_provider_;
const std::string path_;
time_t last_mod_time_;
package_property_t property_flags_ = 0U;
diff --git a/libs/androidfw/include/androidfw/Asset.h b/libs/androidfw/include/androidfw/Asset.h
index 053dbb7..298509e 100644
--- a/libs/androidfw/include/androidfw/Asset.h
+++ b/libs/androidfw/include/androidfw/Asset.h
@@ -26,6 +26,7 @@
#include <memory>
+#include <android-base/unique_fd.h>
#include <utils/Compat.h>
#include <utils/Errors.h>
#include <utils/String8.h>
@@ -158,6 +159,7 @@
/* AssetManager needs access to our "create" functions */
friend class AssetManager;
friend class ApkAssets;
+ friend class ZipAssetsProvider;
/*
* Create the asset from a named file on disk.
@@ -202,8 +204,14 @@
*/
static Asset* createFromUncompressedMap(FileMap* dataMap, AccessMode mode);
+ /*
+ * Create the asset from a memory-mapped file segment.
+ *
+ * The asset takes ownership of the FileMap and the file descriptor "fd". The file descriptor is
+ * used to request new file descriptors using "openFileDescriptor".
+ */
static std::unique_ptr<Asset> createFromUncompressedMap(std::unique_ptr<FileMap> dataMap,
- AccessMode mode);
+ base::unique_fd fd, AccessMode mode);
/*
* Create the asset from a memory-mapped file segment with compressed
@@ -256,9 +264,9 @@
/*
* Use a memory-mapped region.
*
- * On success, the object takes ownership of "dataMap".
+ * On success, the object takes ownership of "dataMap" and "fd".
*/
- status_t openChunk(FileMap* dataMap);
+ status_t openChunk(FileMap* dataMap, base::unique_fd fd);
/*
* Standard Asset interfaces.
@@ -273,11 +281,12 @@
virtual bool isAllocated(void) const { return mBuf != NULL; }
private:
- off64_t mStart; // absolute file offset of start of chunk
- off64_t mLength; // length of the chunk
- off64_t mOffset; // current local offset, 0 == mStart
- FILE* mFp; // for read/seek
- char* mFileName; // for opening
+ off64_t mStart; // absolute file offset of start of chunk
+ off64_t mLength; // length of the chunk
+ off64_t mOffset; // current local offset, 0 == mStart
+ FILE* mFp; // for read/seek
+ char* mFileName; // for opening
+ base::unique_fd mFd; // for opening file descriptors
/*
* To support getBuffer() we either need to read the entire thing into
diff --git a/libs/androidfw/include/androidfw/LoadedArsc.h b/libs/androidfw/include/androidfw/LoadedArsc.h
index b5d3a1f..89ff9f5 100644
--- a/libs/androidfw/include/androidfw/LoadedArsc.h
+++ b/libs/androidfw/include/androidfw/LoadedArsc.h
@@ -69,12 +69,24 @@
}
};
+// Flags that change the behavior of loaded packages.
+// Keep in sync with f/b/android/content/res/ApkAssets.java
using package_property_t = uint32_t;
enum : package_property_t {
- PROPERTY_DYNAMIC = 1,
- PROPERTY_LOADER = 2,
- PROPERTY_OVERLAY = 4,
- PROPERTY_SYSTEM = 8,
+ // The package contains framework resource values specified by the system.
+ // This allows some functions to filter out this package when computing
+ // what configurations/resources are available.
+ PROPERTY_SYSTEM = 1U << 0U,
+
+ // The package is a shared library or has a package id of 7f and is loaded as a shared library by
+ // force.
+ PROPERTY_DYNAMIC = 1U << 1U,
+
+ // The package has been loaded dynamically using a ResourcesProvider.
+ PROPERTY_LOADER = 1U << 2U,
+
+ // The package is a RRO.
+ PROPERTY_OVERLAY = 1U << 3U,
};
// TypeSpecPtr points to a block of memory that holds a TypeSpec struct, followed by an array of
diff --git a/libs/androidfw/tests/ApkAssets_test.cpp b/libs/androidfw/tests/ApkAssets_test.cpp
index 0f2ee6f..19db25c 100644
--- a/libs/androidfw/tests/ApkAssets_test.cpp
+++ b/libs/androidfw/tests/ApkAssets_test.cpp
@@ -42,7 +42,7 @@
const LoadedArsc* loaded_arsc = loaded_apk->GetLoadedArsc();
ASSERT_THAT(loaded_arsc, NotNull());
ASSERT_THAT(loaded_arsc->GetPackageById(0x7fu), NotNull());
- ASSERT_THAT(loaded_apk->Open("res/layout/main.xml"), NotNull());
+ ASSERT_THAT(loaded_apk->GetAssetsProvider()->Open("res/layout/main.xml"), NotNull());
}
TEST(ApkAssetsTest, LoadApkFromFd) {
@@ -50,14 +50,13 @@
unique_fd fd(::open(path.c_str(), O_RDONLY | O_BINARY));
ASSERT_THAT(fd.get(), Ge(0));
- std::unique_ptr<const ApkAssets> loaded_apk =
- ApkAssets::LoadFromFd(std::move(fd), path, false /*system*/, false /*force_shared_lib*/);
+ std::unique_ptr<const ApkAssets> loaded_apk = ApkAssets::LoadFromFd(std::move(fd), path);
ASSERT_THAT(loaded_apk, NotNull());
const LoadedArsc* loaded_arsc = loaded_apk->GetLoadedArsc();
ASSERT_THAT(loaded_arsc, NotNull());
ASSERT_THAT(loaded_arsc->GetPackageById(0x7fu), NotNull());
- ASSERT_THAT(loaded_apk->Open("res/layout/main.xml"), NotNull());
+ ASSERT_THAT(loaded_apk->GetAssetsProvider()->Open("res/layout/main.xml"), NotNull());
}
TEST(ApkAssetsTest, LoadApkAsSharedLibrary) {
@@ -70,7 +69,7 @@
ASSERT_THAT(loaded_arsc->GetPackages(), SizeIs(1u));
EXPECT_FALSE(loaded_arsc->GetPackages()[0]->IsDynamic());
- loaded_apk = ApkAssets::LoadAsSharedLibrary(GetTestDataPath() + "/appaslib/appaslib.apk");
+ loaded_apk = ApkAssets::Load(GetTestDataPath() + "/appaslib/appaslib.apk", PROPERTY_DYNAMIC);
ASSERT_THAT(loaded_apk, NotNull());
loaded_arsc = loaded_apk->GetLoadedArsc();
@@ -84,9 +83,11 @@
ApkAssets::Load(GetTestDataPath() + "/basic/basic.apk");
ASSERT_THAT(loaded_apk, NotNull());
- { ASSERT_THAT(loaded_apk->Open("res/layout/main.xml", Asset::ACCESS_BUFFER), NotNull()); }
+ { ASSERT_THAT(loaded_apk->GetAssetsProvider()->Open("res/layout/main.xml",
+ Asset::ACCESS_BUFFER), NotNull()); }
- { ASSERT_THAT(loaded_apk->Open("res/layout/main.xml", Asset::ACCESS_BUFFER), NotNull()); }
+ { ASSERT_THAT(loaded_apk->GetAssetsProvider()->Open("res/layout/main.xml",
+ Asset::ACCESS_BUFFER), NotNull()); }
}
TEST(ApkAssetsTest, OpenUncompressedAssetFd) {
@@ -94,7 +95,8 @@
ApkAssets::Load(GetTestDataPath() + "/basic/basic.apk");
ASSERT_THAT(loaded_apk, NotNull());
- auto asset = loaded_apk->Open("assets/uncompressed.txt", Asset::ACCESS_UNKNOWN);
+ auto asset = loaded_apk->GetAssetsProvider()->Open("assets/uncompressed.txt",
+ Asset::ACCESS_UNKNOWN);
ASSERT_THAT(asset, NotNull());
off64_t start, length;
diff --git a/libs/androidfw/tests/AssetManager2_test.cpp b/libs/androidfw/tests/AssetManager2_test.cpp
index 35fea7a..ac32699 100644
--- a/libs/androidfw/tests/AssetManager2_test.cpp
+++ b/libs/androidfw/tests/AssetManager2_test.cpp
@@ -63,10 +63,12 @@
libclient_assets_ = ApkAssets::Load(GetTestDataPath() + "/libclient/libclient.apk");
ASSERT_NE(nullptr, libclient_assets_);
- appaslib_assets_ = ApkAssets::LoadAsSharedLibrary(GetTestDataPath() + "/appaslib/appaslib.apk");
+ appaslib_assets_ = ApkAssets::Load(GetTestDataPath() + "/appaslib/appaslib.apk",
+ PROPERTY_DYNAMIC);
ASSERT_NE(nullptr, appaslib_assets_);
- system_assets_ = ApkAssets::Load(GetTestDataPath() + "/system/system.apk", true /*system*/);
+ system_assets_ = ApkAssets::Load(GetTestDataPath() + "/system/system.apk",
+ PROPERTY_SYSTEM);
ASSERT_NE(nullptr, system_assets_);
app_assets_ = ApkAssets::Load(GetTestDataPath() + "/app/app.apk");
diff --git a/libs/androidfw/tests/AttributeResolution_test.cpp b/libs/androidfw/tests/AttributeResolution_test.cpp
index c8dbe20..24361b5 100644
--- a/libs/androidfw/tests/AttributeResolution_test.cpp
+++ b/libs/androidfw/tests/AttributeResolution_test.cpp
@@ -67,7 +67,7 @@
TEST(AttributeResolutionLibraryTest, ApplyStyleWithDefaultStyleResId) {
AssetManager2 assetmanager;
- auto apk_assets = ApkAssets::LoadAsSharedLibrary(GetTestDataPath() + "/styles/styles.apk");
+ auto apk_assets = ApkAssets::Load(GetTestDataPath() + "/styles/styles.apk", PROPERTY_DYNAMIC);
ASSERT_NE(nullptr, apk_assets);
assetmanager.SetApkAssets({apk_assets.get()});
diff --git a/libs/androidfw/tests/Idmap_test.cpp b/libs/androidfw/tests/Idmap_test.cpp
index b679672..41ba637 100644
--- a/libs/androidfw/tests/Idmap_test.cpp
+++ b/libs/androidfw/tests/Idmap_test.cpp
@@ -221,8 +221,8 @@
TEST_F(IdmapTest, OverlayLoaderInterop) {
std::string contents;
- auto loader_assets = ApkAssets::LoadArsc(GetTestDataPath() + "/loader/resources.arsc",
- /* for_loader */ true);
+ auto loader_assets = ApkAssets::LoadTable(GetTestDataPath() + "/loader/resources.arsc",
+ PROPERTY_LOADER);
AssetManager2 asset_manager;
asset_manager.SetApkAssets({overlayable_assets_.get(), loader_assets.get(),
diff --git a/libs/androidfw/tests/Theme_test.cpp b/libs/androidfw/tests/Theme_test.cpp
index be5ecd9..16b9c75 100644
--- a/libs/androidfw/tests/Theme_test.cpp
+++ b/libs/androidfw/tests/Theme_test.cpp
@@ -36,7 +36,7 @@
class ThemeTest : public ::testing::Test {
public:
void SetUp() override {
- system_assets_ = ApkAssets::Load(GetTestDataPath() + "/system/system.apk", true /*system*/);
+ system_assets_ = ApkAssets::Load(GetTestDataPath() + "/system/system.apk", PROPERTY_SYSTEM);
ASSERT_NE(nullptr, system_assets_);
style_assets_ = ApkAssets::Load(GetTestDataPath() + "/styles/styles.apk");
diff --git a/libs/hwui/jni/GraphicsStatsService.cpp b/libs/hwui/jni/GraphicsStatsService.cpp
index 6076552..1591ffa 100644
--- a/libs/hwui/jni/GraphicsStatsService.cpp
+++ b/libs/hwui/jni/GraphicsStatsService.cpp
@@ -158,17 +158,17 @@
static void nativeInit(JNIEnv* env, jobject javaObject) {
gGraphicsStatsServiceObject = env->NewGlobalRef(javaObject);
AStatsManager_PullAtomMetadata* metadata = AStatsManager_PullAtomMetadata_obtain();
- AStatsManager_PullAtomMetadata_setCoolDownNs(metadata, 10 * 1000000); // 10 milliseconds
- AStatsManager_PullAtomMetadata_setTimeoutNs(metadata, 2 * NS_PER_SEC); // 2 seconds
+ AStatsManager_PullAtomMetadata_setCoolDownMillis(metadata, 10); // 10 milliseconds
+ AStatsManager_PullAtomMetadata_setTimeoutMillis(metadata, 2 * MS_PER_SEC); // 2 seconds
- AStatsManager_registerPullAtomCallback(android::util::GRAPHICS_STATS,
- &graphicsStatsPullCallback, metadata, nullptr);
+ AStatsManager_setPullAtomCallback(android::util::GRAPHICS_STATS, metadata,
+ &graphicsStatsPullCallback, nullptr);
AStatsManager_PullAtomMetadata_release(metadata);
}
static void nativeDestructor(JNIEnv* env, jobject javaObject) {
- AStatsManager_unregisterPullAtomCallback(android::util::GRAPHICS_STATS);
+ AStatsManager_clearPullAtomCallback(android::util::GRAPHICS_STATS);
env->DeleteGlobalRef(gGraphicsStatsServiceObject);
gGraphicsStatsServiceObject = nullptr;
}
diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java
index 6e63d17..9950f05 100644
--- a/media/java/android/media/AudioDeviceInfo.java
+++ b/media/java/android/media/AudioDeviceInfo.java
@@ -425,9 +425,9 @@
/**
* Returns an array of supported encapsulation modes for the device.
*
- * The array can include any of
- * {@link AudioTrack#ENCAPSULATION_MODE_ELEMENTARY_STREAM},
- * {@link AudioTrack#ENCAPSULATION_MODE_HANDLE}.
+ * The array can include any of the {@code AudioTrack} encapsulation modes,
+ * e.g. {@link AudioTrack#ENCAPSULATION_MODE_NONE},
+ * or {@link AudioTrack#ENCAPSULATION_MODE_ELEMENTARY_STREAM}.
*
* @return An array of supported encapsulation modes for the device. This
* may be an empty array if no encapsulation modes are supported.
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index 94d4fcc..d17e429 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -22,6 +22,8 @@
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Binder;
@@ -229,7 +231,7 @@
@IntDef({
ENCAPSULATION_MODE_NONE,
ENCAPSULATION_MODE_ELEMENTARY_STREAM,
- ENCAPSULATION_MODE_HANDLE,
+ // ENCAPSULATION_MODE_HANDLE, @SystemApi
})
@Retention(RetentionPolicy.SOURCE)
public @interface EncapsulationMode {}
@@ -244,16 +246,17 @@
/**
* This mode indicates metadata encapsulation with an elementary stream payload.
* Both compressed and PCM format is allowed.
- *
- * TODO(b/147778408) Link: See the Android developers guide for more information.
*/
public static final int ENCAPSULATION_MODE_ELEMENTARY_STREAM = 1;
/**
- * This mode indicates metadata encapsulation with a handle payload.
- * The handle is a 64 bit long, provided by the Tuner API.
- *
- * TODO(b/147778408) Link: Fill in Tuner API to obtain the handle.
+ * This mode indicates metadata encapsulation with a handle payload
+ * and is set through {@link Builder#setEncapsulationMode(int)}.
+ * The handle is a 64 bit long, provided by the Tuner API
+ * in {@link android.os.Build.VERSION_CODES#R}.
+ * @hide
*/
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public static final int ENCAPSULATION_MODE_HANDLE = 2;
/* Enumeration of metadata types permitted for use by
@@ -908,7 +911,9 @@
*
* Use the Builder to construct the TunerConfiguration object,
* which is then used by the {@link AudioTrack.Builder} to create an AudioTrack.
+ * @hide
*/
+ @SystemApi
public static class TunerConfiguration {
private final int mContentId;
private final int mSyncId;
@@ -921,15 +926,17 @@
/**
* Returns the contentId.
*/
- public int getContentId() {
- return mContentId;
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public @IntRange(from = 1) int getContentId() {
+ return mContentId; // The Builder ensures this is > 0.
}
/**
* Returns the syncId.
*/
- public int getSyncId() {
- return mSyncId;
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public @IntRange(from = 1) int getSyncId() {
+ return mSyncId; // The Builder ensures this is > 0.
}
/**
@@ -943,11 +950,13 @@
* Sets the contentId from the Tuner filter.
*
* @param contentId selects the audio stream to use.
- * See android.media.tv.tuner.filter.Filter#getId().
+ * The contentId may be obtained from
+ * {@link android.media.tv.tuner.filter.Filter#getId()}.
* This is always a positive number.
- * TODO(b/147778408) Link to tuner filter doc when unhidden.
+ *
* @return the same Builder instance.
*/
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public @NonNull Builder setContentId(@IntRange(from = 1) int contentId) {
if (contentId < 1) {
throw new IllegalArgumentException(
@@ -962,11 +971,13 @@
*
* @param syncId selects the clock to use for synchronization
* of audio with other streams such as video.
- * See android.media.tv.tuner.Tuner#getAvSyncHwId().
+ * The syncId may be obtained from
+ * {@link android.media.tv.tuner.Tuner#getAvSyncHwId()}.
* This is always a positive number.
- * TODO(b/147778408) Link to tuner filter doc when unhidden.
+ *
* @return the same Builder instance.
*/
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public @NonNull Builder setSyncId(@IntRange(from = 1) int syncId) {
if (syncId < 1) {
throw new IllegalArgumentException("syncId " + syncId + " must be positive");
@@ -983,11 +994,12 @@
* @throws UnsupportedOperationException if the parameters set on the
* {@code Builder} are incompatible.
*/
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public @NonNull TunerConfiguration build() {
if (mContentId < 1 || mSyncId < 1) {
throw new UnsupportedOperationException(
- "contentId " + mContentId
- + " syncId " + mSyncId
+ "mContentId " + mContentId
+ + " mSyncId " + mSyncId
+ " must be set");
}
return new TunerConfiguration(mContentId, mSyncId);
@@ -1113,15 +1125,14 @@
*
* Encapsulation mode allows metadata to be sent together with
* the audio data payload in a {@code ByteBuffer}.
- * The data format is specified in the Android developers site.
- *
- * TODO(b/147778408) Link to doc page.
+ * This requires a compatible hardware audio codec.
*
* @param encapsulationMode one of {@link AudioTrack#ENCAPSULATION_MODE_NONE},
- * {@link AudioTrack#ENCAPSULATION_MODE_ELEMENTARY_STREAM},
- * {@link AudioTrack#ENCAPSULATION_MODE_HANDLE}.
+ * or {@link AudioTrack#ENCAPSULATION_MODE_ELEMENTARY_STREAM}.
* @return the same Builder instance.
*/
+ // Note: with the correct permission {@code AudioTrack#ENCAPSULATION_MODE_HANDLE}
+ // may be used as well.
public @NonNull Builder setEncapsulationMode(@EncapsulationMode int encapsulationMode) {
switch (encapsulationMode) {
case ENCAPSULATION_MODE_NONE:
@@ -1225,7 +1236,10 @@
*
* @param tunerConfiguration obtained by {@link AudioTrack.TunerConfiguration.Builder}.
* @return the same Builder instance.
+ * @hide
*/
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public @NonNull Builder setTunerConfiguration(
@NonNull TunerConfiguration tunerConfiguration) {
if (tunerConfiguration == null) {
@@ -1475,7 +1489,7 @@
*
* For AudioTracks incorporating a secondary Audio Description stream
* (where such contents may be sent through an Encapsulation Mode
- * {@link #ENCAPSULATION_MODE_ELEMENTARY_STREAM} or {@link #ENCAPSULATION_MODE_HANDLE}
+ * other than {@link #ENCAPSULATION_MODE_NONE}).
* or internally by a HW channel),
* the level of mixing of the Audio Description to the Main Audio stream
* is controlled by this method.
diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java
index a8f7185..cbf2364 100644
--- a/media/java/android/media/MediaFormat.java
+++ b/media/java/android/media/MediaFormat.java
@@ -316,7 +316,7 @@
* A key describing the hardware AV sync id.
* The associated value is an integer
*
- * @see android.media.tv.tuner.Tuner#getAvSyncHwId
+ * See android.media.tv.tuner.Tuner#getAvSyncHwId.
*/
public static final String KEY_HARDWARE_AV_SYNC_ID = "hw-av-sync-id";
diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java
index 36ccf00..9985613 100644
--- a/media/java/android/media/MediaRoute2Info.java
+++ b/media/java/android/media/MediaRoute2Info.java
@@ -238,7 +238,7 @@
* Refer to the class documentation for details about live audio routes.
* </p>
*/
- public static final String FEATURE_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
+ public static final String FEATURE_LIVE_AUDIO = "android.media.route.feature.LIVE_AUDIO";
/**
* Media feature: Live video.
@@ -259,13 +259,15 @@
*
* @see android.app.Presentation
*/
- public static final String FEATURE_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
+ public static final String FEATURE_LIVE_VIDEO = "android.media.route.feature.LIVE_VIDEO";
/**
* Media feature: Remote playback.
* <p>
* A route that supports remote playback routing will allow an application to send
* requests to play content remotely to supported destinations.
+ * A route may only support {@link #FEATURE_REMOTE_AUDIO_PLAYBACK audio playback} or
+ * {@link #FEATURE_REMOTE_VIDEO_PLAYBACK video playback}.
* </p><p>
* Remote playback routes destinations operate independently of the local device.
* When a remote playback route is selected, the application can control the content
@@ -274,9 +276,35 @@
* </p><p>
* Refer to the class documentation for details about remote playback routes.
* </p>
+ * @see #FEATURE_REMOTE_AUDIO_PLAYBACK
+ * @see #FEATURE_REMOTE_VIDEO_PLAYBACK
*/
public static final String FEATURE_REMOTE_PLAYBACK =
- "android.media.intent.category.REMOTE_PLAYBACK";
+ "android.media.route.feature.REMOTE_PLAYBACK";
+
+ /**
+ * Media feature: Remote audio playback.
+ * <p>
+ * A route that supports remote audio playback routing will allow an application to send
+ * requests to play audio content remotely to supported destinations.
+ *
+ * @see #FEATURE_REMOTE_PLAYBACK
+ * @see #FEATURE_REMOTE_VIDEO_PLAYBACK
+ */
+ public static final String FEATURE_REMOTE_AUDIO_PLAYBACK =
+ "android.media.route.feature.REMOTE_AUDIO_PLAYBACK";
+
+ /**
+ * Media feature: Remote video playback.
+ * <p>
+ * A route that supports remote video playback routing will allow an application to send
+ * requests to play video content remotely to supported destinations.
+ *
+ * @see #FEATURE_REMOTE_PLAYBACK
+ * @see #FEATURE_REMOTE_AUDIO_PLAYBACK
+ */
+ public static final String FEATURE_REMOTE_VIDEO_PLAYBACK =
+ "android.media.route.feature.REMOTE_VIDEO_PLAYBACK";
final String mId;
final CharSequence mName;
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index bde45d7..25f6059 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -374,8 +374,8 @@
* @param route the route you want to transfer the current media to. Pass {@code null} to
* stop routing of the current media.
*
- * @see TransferCallback#onTransferred
- * @see TransferCallback#onTransferFailed
+ * @see TransferCallback#onTransfer
+ * @see TransferCallback#onTransferFailure
*/
public void transferTo(@NonNull MediaRoute2Info route) {
Objects.requireNonNull(route, "route must not be null");
@@ -565,9 +565,9 @@
}
/**
- * Creates a controller and calls the {@link TransferCallback#onTransferred}.
+ * Creates a controller and calls the {@link TransferCallback#onTransfer}.
* If the controller creation has failed, then it calls
- * {@link TransferCallback#onTransferFailed}.
+ * {@link TransferCallback#onTransferFailure}.
* <p>
* Pass {@code null} to sessionInfo for the failure case.
*/
@@ -740,21 +740,21 @@
RoutingController newController) {
for (TransferCallbackRecord record: mTransferCallbackRecords) {
record.mExecutor.execute(
- () -> record.mTransferCallback.onTransferred(oldController, newController));
+ () -> record.mTransferCallback.onTransfer(oldController, newController));
}
}
private void notifyTransferFailed(MediaRoute2Info route) {
for (TransferCallbackRecord record: mTransferCallbackRecords) {
record.mExecutor.execute(
- () -> record.mTransferCallback.onTransferFailed(route));
+ () -> record.mTransferCallback.onTransferFailure(route));
}
}
private void notifyStopped(RoutingController controller) {
for (TransferCallbackRecord record: mTransferCallbackRecords) {
record.mExecutor.execute(
- () -> record.mTransferCallback.onStopped(controller));
+ () -> record.mTransferCallback.onStop(controller));
}
}
@@ -805,7 +805,7 @@
* @param newController the new controller to control routing
* @see #transferTo(MediaRoute2Info)
*/
- public void onTransferred(@NonNull RoutingController oldController,
+ public void onTransfer(@NonNull RoutingController oldController,
@NonNull RoutingController newController) {}
/**
@@ -813,14 +813,14 @@
*
* @param requestedRoute the route info which was used for the transfer
*/
- public void onTransferFailed(@NonNull MediaRoute2Info requestedRoute) {}
+ public void onTransferFailure(@NonNull MediaRoute2Info requestedRoute) {}
/**
* Called when a media routing stops. It can be stopped by a user or a provider.
*
* @param controller the controller that controlled the stopped media routing.
*/
- public void onStopped(@NonNull RoutingController controller) { }
+ public void onStop(@NonNull RoutingController controller) { }
}
/**
diff --git a/media/jni/soundpool/StreamManager.cpp b/media/jni/soundpool/StreamManager.cpp
index 79e4d8a..c612218 100644
--- a/media/jni/soundpool/StreamManager.cpp
+++ b/media/jni/soundpool/StreamManager.cpp
@@ -340,8 +340,10 @@
int64_t waitTimeNs = kWaitTimeBeforeCloseNs;
std::unique_lock lock(mStreamManagerLock);
while (!mQuit) {
- mStreamManagerCondition.wait_for(
- lock, std::chrono::duration<int64_t, std::nano>(waitTimeNs));
+ if (mRestartStreams.empty()) { // on thread start, mRestartStreams can be non-empty.
+ mStreamManagerCondition.wait_for(
+ lock, std::chrono::duration<int64_t, std::nano>(waitTimeNs));
+ }
ALOGV("%s(%d) awake", __func__, id);
sanityCheckQueue_l();
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
index a97baaf..77e8f97 100644
--- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
+++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java
@@ -204,7 +204,7 @@
addRouterCallback(new MediaRouter2.RouteCallback() {});
addTransferCallback(new MediaRouter2.TransferCallback() {
@Override
- public void onTransferred(MediaRouter2.RoutingController oldController,
+ public void onTransfer(MediaRouter2.RoutingController oldController,
MediaRouter2.RoutingController newController) {
if (newController == null) {
return;
diff --git a/packages/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml
index 2392c96..87f89ce 100644
--- a/packages/PackageInstaller/res/values-ar/strings.xml
+++ b/packages/PackageInstaller/res/values-ar/strings.xml
@@ -24,8 +24,8 @@
<string name="installing_app" msgid="1165095864863849422">"جارٍ تثبيت <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string>
<string name="install_done" msgid="5987363587661783896">"تم تثبيت التطبيق."</string>
<string name="install_confirm_question" msgid="8176284075816604590">"هل تريد تثبيت هذا التطبيق؟"</string>
- <string name="install_confirm_question_update" msgid="7942235418781274635">"هل تريد تثبيت إعادة تحميل لهذا التطبيق الحالي؟ لن تفقد بياناتك الحالية."</string>
- <string name="install_confirm_question_update_system" msgid="4713001702777910263">"هل تريد تثبيت إعادة تحميل لهذا التطبيق المضمَّن؟ لن تفقد بياناتك الحالية."</string>
+ <string name="install_confirm_question_update" msgid="7942235418781274635">"هل تريد تثبيت تحديث لهذا التطبيق الحالي؟ لن تفقد بياناتك الحالية."</string>
+ <string name="install_confirm_question_update_system" msgid="4713001702777910263">"هل تريد تثبيت تحديث لهذا التطبيق المضمَّن؟ لن تفقد بياناتك الحالية."</string>
<string name="install_failed" msgid="5777824004474125469">"التطبيق ليس مثبتًا."</string>
<string name="install_failed_blocked" msgid="8512284352994752094">"تم حظر تثبيت الحزمة."</string>
<string name="install_failed_conflict" msgid="3493184212162521426">"لم يتم تثبيت التطبيق لأن حزمة التثبيت تتعارض مع حزمة حالية."</string>
diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml
index 2011013..65e75cd 100644
--- a/packages/PackageInstaller/res/values-eu/strings.xml
+++ b/packages/PackageInstaller/res/values-eu/strings.xml
@@ -83,9 +83,9 @@
<string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak tableta honetan."</string>
<string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telebista honetan."</string>
<string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Segurtasuna bermatzeko, ezin dira instalatu iturburu honetako aplikazio ezezagunak telefono honetan."</string>
- <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonoak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zu zarela hura erabiltzeagatik telefonoak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string>
- <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zu zarela hura erabiltzeagatik tabletak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string>
- <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Telebistak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zu zarela hura erabiltzeagatik telebistak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string>
+ <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Telefonoak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telefonoak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string>
+ <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Tabletak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik tabletak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string>
+ <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"Telebistak eta datu pertsonalek aplikazio ezezagunen erasoak jaso ditzakete. Aplikazio hau instalatzen baduzu, onartu egingo duzu zeu zarela hura erabiltzeagatik telebistak jasan ditzakeen kalteen edo datu-galeren erantzulea."</string>
<string name="anonymous_source_continue" msgid="4375745439457209366">"Egin aurrera"</string>
<string name="external_sources_settings" msgid="4046964413071713807">"Ezarpenak"</string>
<string name="wear_app_channel" msgid="1960809674709107850">"Wear aplikazioak instalatzea/desinstalatzea"</string>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 649fcb1..77691a3 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (rooi-groen)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (blou-geel)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Kleurregstelling"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Kleurregstelling help mense met kleurblindheid om akkurater kleure te sien"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Geneutraliseer deur <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index f55b30e..af89d6a 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"ፕሮታኖማሊ (ቀይ-አረንጓዴ)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ትራይታኖማሊ (ሰማያዊ-ቢጫ)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"የቀለም ማስተካከያ"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"ቀለም ማስተካከያ ቀለም ማየት የማይችሉ ሰዎች ተጨማሪ ትክክለኛ ቀለማትን እንዲመለከቱ ያስችላቸዋል"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"በ<xliff:g id="TITLE">%1$s</xliff:g> ተሽሯል"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ገደማ ቀርቷል"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 1798e45..83408d4 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"غطش الأحمر (الأحمر والأخضر)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"غمش الأزرق (الأزرق والأصفر)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"تصحيح الألوان"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"تساعد ميزة تصحيح الألوان المصابين بعمى الألوان على رؤية الألوان بدقة أكبر"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"تم الاستبدال بـ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"يتبقى <xliff:g id="TIME_REMAINING">%1$s</xliff:g> تقريبًا"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 48af12a..2a154f4 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"প্ৰ’টানোমালি (ৰঙা-সেউজীয়া)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ট্ৰাইটান\'মেলী (নীলা-হালধীয়া)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ৰং শুধৰণী"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"ৰং শুধৰণি কৰা কার্যই বর্ণান্ধ লোকসকলক ৰংবোৰ অধিক সঠিককৈ দেখাত সহায় কৰে"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g>ৰ দ্বাৰা অগ্ৰাহ্য কৰা হৈছে"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"প্রায় <xliff:g id="TIME_REMAINING">%1$s</xliff:g> বাকী আছে"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 29624ab..0225d29 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaliya (qırmızı-yaşıl)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaliya (göy-sarı)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Rəng düzəlişi"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Rəng korreksiyası rəng korluğu olan insanlara rəngləri daha dəqiq görməkdə kömək edir"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> tərəfindən qəbul edilmir"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Təxminən <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qalıb"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 2d28006..7f6f7f2 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalija (crveno-zeleno)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalija (plavo-žuto)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Korekcija boja"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Korekcija boja pomaže ljudima koji su daltonisti da preciznije vide boje"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Zamenjuje ga <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g>–<xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Preostalo je oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index bd6fdf3..c731191 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Пратанамалія (чырвоны-зялёны)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Трытанамалія (сіні-жоўты)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Карэкцыя колеру"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Карэкцыя колеру дазваляе людзям з парушэннямі колеравага зроку лепш распазнаваць выявы на экране"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Перавызначаны <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Зараду хопіць прыблізна на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 3d27f63..48234ae 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалия (червено – зелено)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалия (синьо – жълто)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Корекция на цветове"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Коригирането на цветовете помага на хората с цветна слепота да виждат по-точни цветове"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Заменено от „<xliff:g id="TITLE">%1$s</xliff:g>“"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Още около <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index c06100e..6ff8ec1 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"প্রোটানোম্যালি (লাল-সবুজ)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ট্রিট্যানোম্যালি (নীল-হলুদ)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"রঙ সংশোধন"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"রঙ অ্যাডজাস্ট করার সেটিংস, বর্ণান্ধতা আছে এমন ব্যক্তিদের আরও সঠিকভাবে রঙ দেখতে সাহায্য করে"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> এর দ্বারা ওভাররাইড করা হয়েছে"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"আর আনুমানিক <xliff:g id="TIME_REMAINING">%1$s</xliff:g> চলবে"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index e4c6e0c..387fd30 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalija (crveno-zeleno)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalija (plavo-žuto)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Ispravka boje"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Ispravka boje pomaže daltonistima da preciznije vide boje"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Zamjenjuje <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Preostalo je još oko <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 1a6e078..f1be138 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (vermell-verd)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (blau-groc)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correcció del color"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"La correcció del color ajuda les persones daltòniques a veure colors més precisos"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"S\'ha substituït per <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g>: <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Temps restant aproximat: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index cdec461..0959bb7 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomálie (červená a zelená)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomálie (modrá a žlutá)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Korekce barev"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Korekce barev pomáhá barvoslepým lidem vidět přesnější barvy"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Přepsáno nastavením <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Zbývá asi <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index d88c149..8e4a63f 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanopi (rød-grøn)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanopi (blå-gul)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Korriger farver"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Farvekorrigering gør det nemmere for farveblinde at se farver mere nøjagtigt"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Tilsidesat af <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Ca. <xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 721163b..326d8e3 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (Rot-Grün-Sehschwäche)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (Blau-Gelb-Sehschwäche)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Farbkorrektur"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Die Farbkorrektur hilft farbenblinden Menschen, Farben besser zu erkennen"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Außer Kraft gesetzt von \"<xliff:g id="TITLE">%1$s</xliff:g>\""</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Noch etwa <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 07f73c3..112d5c5 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Πρωτανοπία (κόκκινο-πράσινο)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Τριτανοπία (μπλε-κίτρινο)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Διόρθωση χρωμάτων"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Η διόρθωση χρωμάτων βοηθάει τα άτομα με αχρωματοψία να βλέπουν τα χρώματα με μεγαλύτερη ακρίβεια"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Αντικαταστάθηκε από <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Απομένει/ουν περίπου <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 79cf4df..3ac6987 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -416,7 +416,7 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (red-green)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (blue-yellow)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Colour correction"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Colour correction helps people with colour blindness see more accurate colours"</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Colour correction allows you to adjust how colours are displayed on your device"</string>
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 79cf4df..3ac6987 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -416,7 +416,7 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (red-green)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (blue-yellow)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Colour correction"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Colour correction helps people with colour blindness see more accurate colours"</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Colour correction allows you to adjust how colours are displayed on your device"</string>
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 79cf4df..3ac6987 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -416,7 +416,7 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (red-green)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (blue-yellow)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Colour correction"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Colour correction helps people with colour blindness see more accurate colours"</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Colour correction allows you to adjust how colours are displayed on your device"</string>
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 79cf4df..3ac6987 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -416,7 +416,7 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (red-green)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (blue-yellow)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Colour correction"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Colour correction helps people with colour blindness see more accurate colours"</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Colour correction allows you to adjust how colours are displayed on your device"</string>
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index c128e2c..60ffc60 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -416,7 +416,7 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (red-green)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (blue-yellow)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Color correction"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Color correction helps people with colorblindness see more accurate colors"</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1284746051652993443">"Color correction allows you to adjust how colors are displayed on your device"</string>
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"About <xliff:g id="TIME_REMAINING">%1$s</xliff:g> left"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 06660ee..cde9c74 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalía (rojo-verde)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalía (azul-amarillo)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Corrección de color"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"La corrección de color ayuda a las personas daltónicas a ver mejor los colores"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Reemplazado por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Tiempo restante: aproximadamente <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 2e5adb8..e4041ed 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalía (rojo-verde)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalía (azul-amarillo)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Corrección de color"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"La corrección de color ayuda a que los usuarios con daltonismo vean colores similares a los que perciben otras personas"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Anulado por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g>: <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Tiempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 027ab1a..70d6c10 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaalia (punane-roheline)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaalia (sinine-kollane)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Värvide korrigeerimine"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Värviparanduse funktsioon aitab värvipimedatel värve täpsemini näha"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Alistas <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Ligikaudu <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäänud"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index e035a81..e76f8a3 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -27,7 +27,7 @@
<string name="wifi_disabled_generic" msgid="2651916945380294607">"Desgaituta"</string>
<string name="wifi_disabled_network_failure" msgid="2660396183242399585">"Ezin izan da konfiguratu IP helbidea"</string>
<string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Ez dago konektatuta sarearen kalitate eskasagatik"</string>
- <string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"Ezin izan da konektatu Wi-Fi sarera"</string>
+ <string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"Ezin izan da konektatu wifi-sarera"</string>
<string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Autentifikazio-arazoa"</string>
<string name="wifi_cant_connect" msgid="5718417542623056783">"Ezin da konektatu"</string>
<string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"Ezin da konektatu \"<xliff:g id="AP_NAME">%1$s</xliff:g>\" sarera"</string>
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanopia (gorri-berdeak)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanopia (urdin-horia)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Koloreen zuzenketa"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Koloreen zuzenketak kolore zehatzagoak ikusten laguntzen die kolore-itsutasuna duten pertsonei"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> hobespena gainjarri zaio"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> inguru gelditzen dira"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 4cc6974..c6fe4c0 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"قرمزدشواربینی (قرمز-سبز)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"آبیدشواربینی (آبی-زرد)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"تصحیح رنگ"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"تصحیح رنگ به افراد مبتلا به کوررنگی کمک میکند رنگها را دقیقتر ببینند"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"توسط <xliff:g id="TITLE">%1$s</xliff:g> لغو شد"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> شارژ باقی مانده است"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index a2531d5..82ae0f0 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (puna-vihersokeus)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (sini-keltasokeus)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Värikorjaus"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Värinkorjaus auttaa värisokeita tulkitsemaan värejä"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Tämän ohittaa <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Noin <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index e1ff83f..6cfc5eb 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (rouge/vert)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (bleu/jaune)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correction des couleurs"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"La correction des couleurs aide les personnes atteintes de daltonisme à mieux percevoir les couleurs"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Remplacé par <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> : <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Il reste environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 271c52b..2a3bd81 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (rouge/vert)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (bleu-jaune)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correction couleur"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"La correction des couleurs aide les personnes atteintes de daltonisme à mieux percevoir les couleurs"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Remplacé par <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Temps restant : environ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index ec600c0..1f0acf2 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalía (vermello-verde)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalía (azul-amarelo)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Corrección da cor"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"A corrección da cor axuda ás persoas con daltonismo a ver as cores con maior precisión"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Anulado por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Tempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index b81eba3..387f326 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"પ્રોટેનોમલી (લાલ-લીલો)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ટ્રાઇટેનોમલી(વાદળી-પીળો)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"રંગ સુધારણા"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"રંગ સુધારણા રંગ અંધત્વવાળા લોકોને વધુ સચોટ રંગો જોવામાં સહાય કરે છે"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> દ્વારા ઓવરરાઇડ થયું"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"લગભગ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> બાકી છે"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 414b876..91e7c5d 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -418,7 +418,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"लाल रंग पहचान न पाना (लाल-हरा)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"नीला रंग पहचान न पाना (नीला-पीला)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"रंग सुधार"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"रंग में सुधार करने की सेटिंग, वर्णान्धता (कलर ब्लाइंडनेस) वाले लोगों को ज़्यादा सटीक रंग देखने में मदद करती है"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> के द्वारा ओवरराइड किया गया"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"बैटरी करीब <xliff:g id="TIME_REMAINING">%1$s</xliff:g> में खत्म हो जाएगी"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index a3d1b95..7accd8a 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalija (crveno – zeleno)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalija (plavo – žuto)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Korekcija boje"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Korekcija boje pomaže slijepima za boje da vide preciznije boje"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Premošćeno postavkom <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Još otprilike <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index e1c49c8..83d51eb 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomália (piros– zöld)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomália (kék–sárga)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Színkorrekció"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"A színkorrekció segít a színtévesztőknek abban, hogy pontosabban lássák a színeket"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Felülírva erre: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Körülbelül <xliff:g id="TIME_REMAINING">%1$s</xliff:g> maradt hátra"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index db1748d..7da17f1 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Պրոտանոմալիա (կարմիր-կանաչ)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Տրիտանոմալիա (կապույտ-դեղին)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Գունաշտկում"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Գունաշտկումն օգնում է դալթոնիզմ ունեցող մարդկանց ավելի ճշգրիտ տեսնել գույները"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Գերազանցված է <xliff:g id="TITLE">%1$s</xliff:g>-ից"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Լիցքը կբավարարի մոտ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 02500ef..2e4ee801 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (merah-hijau)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (biru-kuning)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Koreksi warna"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Koreksi warna membantu orang penderita buta warna melihat warna yang lebih akurat"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Digantikan oleh <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Sekitar <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 002709c..130ba6e 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Litblinda (rauðgræn)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Litblinda (blágul)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Litaleiðrétting"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Litaleiðrétting hjálpar fólki með litblindu að sjá réttari liti"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Hnekkt af <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Um það bil <xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 01d7a65..e51cceb 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalìa (rosso-verde)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalìa (blu-giallo)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correzione del colore"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"La correzione del colore consente alle persone daltoniche di vedere colori più accurati"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Valore sostituito da <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Tempo rimanente: <xliff:g id="TIME_REMAINING">%1$s</xliff:g> circa"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 975ccdc..de32b79 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"פרוטנומליה (אדום-ירוק)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"טריטנומליה (כחול-צהוב)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"תיקון צבע"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"תיקון צבע עוזר לאנשים עם עיוורון צבעים לראות צבעים באופן מדויק יותר"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"נעקף על ידי <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"הזמן הנותר: בערך <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index c7380f6..db362c9 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"第一色弱(赤緑)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"第三色弱(青黄)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"色補正"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"色補正機能を利用すると、色覚障がいのある方がより正確に色を判別できるようになります"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g>によって上書き済み"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"残り時間: 約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 43a52f3..1bff192 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"პროტოანომალია (წითელი-მწვანე)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ტრიტანომალია (ლურჯი-ყვითელი)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ფერის კორექცია"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"ფერის კორექცია ეხმარება ფერითი სიბრმავის მქონე ადამიანებს, უფრო ზუსტად გაარჩიონ ფერები"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"უკუგებულია <xliff:g id="TITLE">%1$s</xliff:g>-ის მიერ"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"დარჩა დაახლოებით <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 2b2093b..fa3997c 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалия (қызыл-жасыл)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалия (көк-сары)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Түсті түзету"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Түсті түзету функциясы түстерді ажырата алмайтын адамдарға оларды дәлірек көруге көмектеседі"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> үстінен басқан"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Шамамен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> қалды"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 0ceda18..79d4429 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (ក្រហមពណ៌បៃតង)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (ពណ៌ខៀវ-លឿង)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ការកែពណ៌"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"ការកែតម្រូវពណ៌ជួយដល់អ្នកដែលមិនអាចបែងចែកពណ៌ឱ្យមើលឃើញពណ៌ដែលត្រឹមត្រូវជាងមុន"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"បដិសេធដោយ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"នៅសល់ប្រហែល <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ទៀត"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index d23aeff..ac289c1 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"ಪ್ರೊಟನೋಮಲಿ (ಕೆಂಪು-ಹಸಿರು)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ಟ್ರಿಟನೋಮಲಿ (ನೀಲಿ-ಹಳದಿ)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ಬಣ್ಣದ ತಿದ್ದುಪಡಿ"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"ವರ್ಣ ಅಂಧತ್ವ ಹೊಂದಿರುವ ಜನರಿಗೆ ಬಣ್ಣಗಳನ್ನು ಹೆಚ್ಚು ನಿಖರವಾಗಿ ವೀಕ್ಷಿಸಲು ಬಣ್ಣ ತಿದ್ದುಪಡಿ ಸಹಾಯ ಮಾಡುತ್ತದೆ"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ಮೂಲಕ ಅತಿಕ್ರಮಿಸುತ್ತದೆ"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಸಮಯ ಬಾಕಿ ಉಳಿದಿದೆ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 991bc22..2cff293 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"적색약(적녹)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"청색약(청황)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"색보정"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"색상 보정을 사용하면 색맹인 사용자가 색상을 정확하게 구분하는 데 도움이 됩니다."</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> 우선 적용됨"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g>, <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"남은 시간 약 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index d6ed074..bc6c395 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалия (кызыл-жашыл)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалия (көк-сары)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Түсүн тууралоо"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Түстү тууралоо жөндөөсү түстөрдү айырмалап көрбөгөн адамдарга түстөрдү тагыраак билүүгө жардам берет"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> менен алмаштырылган"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Болжол менен <xliff:g id="TIME_REMAINING">%1$s</xliff:g> калды"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 5f58dfb..16a641b 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (ສີແດງ-ສີຂຽວ)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (ສີຟ້າ-ສີເຫຼືອງ)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ການປັບແຕ່ງສີ"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"ການແກ້ໄຂສີຈະຊ່ວຍໃຫ້ຄົນທີ່ຕາບອດສີສາມາດເບິ່ງເຫັນສີໄດ້ຖືກຕ້ອງຍິ່ງຂຶ້ນ"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"ຖືກແທນໂດຍ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"ເຫຼືອອີກປະມານ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index ce41bc5..828a2f3 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalija (raudona, žalia)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalija (mėlyna, geltona)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Spalvų taisymas"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Naudojant spalvų taisymo funkciją daltonikai gali geriau matyti spalvas"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Nepaisyta naudojant nuostatą „<xliff:g id="TITLE">%1$s</xliff:g>“"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Liko maždaug <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 7c2dfbd..f837e66 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomālija (sarkans/zaļš)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomālija (zils/dzeltens)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Krāsu korekcija"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Krāsu korekcija palīdz lietotājiem ar krāsu aklumu redzēt precīzākas krāsas."</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Jaunā preference: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> — <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Aptuvenais atlikušais laiks: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 33f8f45..99255c4 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалија (слепило за црвена и зелена)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалија (слепило за сина и жолта)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Корекција на бои"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Корекцијата на бои им помага на луѓето што не ги разликуваат боите попрецизно да ги гледаат"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Прескокнато според <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Уште околу <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 06ee219..f751510 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"പ്രോട്ടാനോമലി (ചുവപ്പ്-പച്ച)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ട്രിട്ടാനോമലി (നീല-മഞ്ഞ)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"വർണ്ണം ക്രമീകരിക്കൽ"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"വർണ്ണം ശരിയാക്കൽ, വർണ്ണാന്ധത ബാധിച്ച ആളുകൾക്ക് നിറങ്ങൾ കൂടുതൽ കൃത്യമായി കാണാൻ സഹായിക്കുന്നു"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ഉപയോഗിച്ച് അസാധുവാക്കി"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"ഏതാണ്ട് <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index c8fb2a5..3905817 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномаль (улаан-ногоон)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомаль (цэнхэр-шар)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Өнгө тохируулах"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Өнгөний залруулга нь өнгө ялгадаггүй хүмүүст өнгийг илүү оновчтой харахад тусалдаг"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Давхарласан <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Ойролцоогоор <xliff:g id="TIME_REMAINING">%1$s</xliff:g> үлдсэн"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 543152a..60b728b 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"क्षीण रक्तवर्णांधता (लाल-हिरवा)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"रंग दृष्टी कमतरता (निळा-पिवळा)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"रंग सुधारणा"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"रंग सुधारणा ही रंगांधळेपणा असलेल्या लोकांना रंग अधिक अचूक दिसण्यात मदत करते"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> द्वारे अधिलिखित"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"अंदाजे <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाकी आहे"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 2c59768..895413d 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (merah-hijau)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (biru-kuning)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Pembetulan warna"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Pembetulan warna membantu orang yang mengalami kebutaan warna melihat warna yang lebih tepat"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Diatasi oleh <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Kira-kira <xliff:g id="TIME_REMAINING">%1$s</xliff:g> lagi"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index ff24590..28a5897 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (အနီ-အစိမ်း)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (အပြာ-အဝါ)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"အရောင်ပြင်ဆင်မှု"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"အရောင်ပြင်ဆင်ခြင်းက အရောင်မကွဲသူများအတွက် ပိုမိုတိကျသော အရောင်များ ကြည့်နိုင်ရန် ကူညီပေးသည်"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> မှ ကျော်၍ လုပ်ထားသည်။"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ခန့် ကျန်သည်"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 8c4e241..3af5305 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (rød-grønn)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (blå-gul)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Fargekorrigering"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Med fargekorrigering kan personer med fargeblindhet se mer nøyaktige farger"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overstyres av <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Omtrent <xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 89d66ab..c8ae00f 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"प्रोटानेमली (रातो, हरियो)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ट्रिटानोमेली (निलो-पंहेलो)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"रङ्ग सुधार"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"रङ सुधार गर्नुले रङ छुट्याउन नसक्ने मान्छेलाई थप सटीक रूपमा रङहरू छुट्याउन मद्दत गर्दछ"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> द्वारा अधिरोहित"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"लगभग <xliff:g id="TIME_REMAINING">%1$s</xliff:g> बाँकी छ"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 221ba53..dffb209 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (rood-groen)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (blauw-geel)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Kleurcorrectie"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Met behulp van kleurcorrectie kunnen mensen die kleurenblind zijn, nauwkeurigere kleuren te zien krijgen"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Overschreven door <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Nog ongeveer <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index b475846de..0fac20b 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -218,7 +218,7 @@
<string name="adb_paired_devices_title" msgid="5268997341526217362">"ପେୟାର୍ ହୋଇଥିବା ଡିଭାଇସଗୁଡ଼ିକ"</string>
<string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"ବର୍ତ୍ତମାନ ସଂଯୁକ୍ତ ଅଛି"</string>
<string name="adb_wireless_device_details_title" msgid="7129369670526565786">"ଡିଭାଇସ୍ ବିବରଣୀ"</string>
- <string name="adb_device_forget" msgid="193072400783068417">"ଭୁଲିଗଲେ"</string>
+ <string name="adb_device_forget" msgid="193072400783068417">"ଭୁଲିଯାଆନ୍ତୁ"</string>
<string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"ଡିଭାଇସ୍ ଫିଙ୍ଗରପ୍ରିଣ୍ଟ: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string>
<string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"ସଂଯୋଗ ବିଫଳ ହେଲା"</string>
<string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ଫୋନ୍ ନେଟୱାର୍କ ସହ ସଂଯୁକ୍ତ ଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string>
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"ପ୍ରୋଟାନୋମାଲି (ଲାଲ୍-ସବୁଜ)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (ନୀଳ-ହଳଦିଆ)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ରଙ୍ଗ ସଠିକତା"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"ରଙ୍ଗ ଚିହ୍ନିବାରେ ସମସ୍ୟା ଥିବା ଲୋକମାନଙ୍କୁ କଲର୍ କରେକ୍ସନ୍ ସଠିକ୍ ରଙ୍ଗ ଦେଖିବାରେ ସାହାଯ୍ୟ କରିଥାଏ"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ଦ୍ୱାରା ଓଭର୍ରାଇଡ୍ କରାଯାଇଛି"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"ପାଖାପାଖି <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ବଳକା ଅଛି"</string>
@@ -453,7 +454,7 @@
<string name="battery_info_status_full" msgid="4443168946046847468">"ଚାର୍ଜ ସମ୍ପୂର୍ଣ୍ଣ"</string>
<string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ଆଡ୍ମିନ୍ ଦ୍ୱାରା ନିୟନ୍ତ୍ରିତ"</string>
<string name="disabled" msgid="8017887509554714950">"ଅକ୍ଷମ ହୋଇଛି"</string>
- <string name="external_source_trusted" msgid="1146522036773132905">"ଅନୁମୋଦିତ"</string>
+ <string name="external_source_trusted" msgid="1146522036773132905">"ଅନୁମତି ଦିଆଯାଇଛି"</string>
<string name="external_source_untrusted" msgid="5037891688911672227">"ଅନୁମତି ନାହିଁ"</string>
<string name="install_other_apps" msgid="3232595082023199454">"ଅଜଣା ଆପ୍ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
<string name="home" msgid="973834627243661438">"ସେଟିଙ୍ଗ ହୋମ୍"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 6cd3d84..0c899d0 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (ਲਾਲ-ਹਰਾ)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (ਨੀਲਾ-ਪੀਲਾ)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"ਰੰਗ ਸੁਧਾਈ"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"ਰੰਗ ਸੁਧਾਈ ਨਾਲ ਰੰਗਾਂ ਦੇ ਅੰਨ੍ਹੇਪਣ ਦੇ ਸ਼ਿਕਾਰ ਲੋਕਾਂ ਦੀ ਵਧੇਰੇ ਸਟੀਕ ਰੰਗਾਂ ਨੂੰ ਦੇਖਣ ਵਿੱਚ ਮਦਦ ਕੀਤੀ ਜਾਂਦੀ ਹੈ"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ਦੁਆਰਾ ਓਵਰਰਾਈਡ ਕੀਤਾ"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"ਲਗਭਗ <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਬਾਕੀ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 8ab91fa..f701341 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (czerwony-zielony)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (niebieski-żółty)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Korekcja kolorów"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Korekcja kolorów pomaga osobom z zaburzeniami rozpoznawania barw lepiej je widzieć"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Nadpisana przez <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Jeszcze około <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 16b92e9..003356c 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (vermelho-verde)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (azul-amarelo)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correção de cor"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"A correção de cores ajuda pessoas com daltonismo a ver cores de forma mais precisa"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Substituído por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Tempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index f1cb113..989ddde 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (vermelho-verde)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (azul-amarelo)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correção da cor"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"A correção de cor ajuda as pessoas com daltonismo a ver cores mais precisas."</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Substituído por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Resta(m) cerca de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 16b92e9..003356c 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalia (vermelho-verde)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalia (azul-amarelo)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Correção de cor"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"A correção de cores ajuda pessoas com daltonismo a ver cores de forma mais precisa"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Substituído por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Tempo restante aproximado: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 06a83f5..75fb590 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalie (roșu-verde)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalie (albastru-galben)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Corecția culorii"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Corecția culorii ajută persoanele cu daltonism să vadă culori mai exacte"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Valoare înlocuită de <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Timp aproximativ rămas: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 5439979..3be2d33 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалия (красный/зеленый)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалия (синий/желтый)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Коррекция цвета"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Коррекция цвета помогает пользователям с нарушениями цветового зрения лучше различать изображение на экране"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Новая настройка: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"Уровень заряда – <xliff:g id="PERCENTAGE">%1$s</xliff:g>. <xliff:g id="TIME_STRING">%2$s</xliff:g>."</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Заряда хватит примерно на <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index b441209..faeb9a4e 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"වර්ණ දුර්වලතාවය (රතු-කොළ)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"වර්ණ අන්ධතාවය (නිල්-කහ)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"වර්ණ නිවැරදි කිරීම"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"වර්ණ අන්ධතාවෙන් පෙළෙන පුද්ගලයන්ට වඩාත් නිරවද්ය වර්ණ බැලීමට වර්ණ නිවැරදි කිරීම සහාය වේ"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> මගින් ඉක්මවන ලදී"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ක් පමණ ඉතිරියි"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 41a858d..7353bcf 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomália (červená a zelená)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomália (modrá a žltá)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Úprava farieb"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Korekcia farieb pomáha farboslepým ľuďom vidieť presnejšie farby"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Prekonané predvoľbou <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Zostáva približne <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 50b8ef2..7a44b48 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomalija (rdeča – zelena)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomalija (modra – rumena)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Popravljanje barv"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Popravljanje barv osebam z barvno slepoto pomaga, da vidijo razločnejše barve"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Preglasila nastavitev: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Še približno <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index e3f2680..f8496d1 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (e kuqe - e gjelbër)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (e kaltër - e verdhë)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Korrigjimi i ngjyrës"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Korrigjimi i ngjyrës i ndihmon njerëzit me daltonizëm të shohin ngjyra më të sakta"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Mbivendosur nga <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Rreth <xliff:g id="TIME_REMAINING">%1$s</xliff:g> të mbetura"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 31e395c..79ca8f5 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалија (црвено-зелено)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалија (плаво-жуто)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Корекција боја"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Корекција боја помаже људима који су далтонисти да прецизније виде боје"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Замењује га <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g>–<xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Преостало је око <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 634a16e..259cddf 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (rött-grönt)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomali (blått-gult)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Färgkorrigering"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Med färgkorrigering kan färgblinda personer se mer korrekta färger"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Har åsidosatts av <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Cirka <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kvar"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 3263a6c..32b1b5a 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (nyekundu-kijani)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (samawati-manjano)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Usahihishaji wa rangi"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Urekebishaji wa rangi huwasaidia watu wenye matatizo ya kutofautisha rangi ili waone rangi nyingi sahihi"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Imetanguliwa na <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Zimesalia takribani <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 2508d74..2e6faf4 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"ప్రొటానోమలీ (ఎరుపు-ఆకుపచ్చ రంగు)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ట్రైటనోమలీ (నీలం-పసుపు రంగు)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"రంగు సవరణ"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"రంగులను సరి చేయడం వల్ల, కలర్ బ్లైండ్నెస్ ఉన్నవారు మరింత ఖచ్చితమైన రంగులను చూడగలుగుతారు"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> ద్వారా భర్తీ చేయబడింది"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> సమయం మిగిలి ఉంది"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index bc0970c..b32f949 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"ตาบอดจางสีแดง (สีแดง/เขียว)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"ตาบอดจางสีน้ำเงิน (สีน้ำเงิน/เหลือง)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"การแก้สี"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"การแก้ไขสีช่วยให้ผู้ที่มีอาการตาบอดสีเห็นสีต่างๆ ได้ตรงตามจริงยิ่งขึ้น"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"แทนที่โดย <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"เหลืออีกประมาณ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 9ed2d9a..6650a45 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (pula-berde)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (asul-dilaw)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Pagtatama ng kulay"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Tinutulungan ng color correction ang mga taong colorblind na makakita ng mas tumpak na kulay"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Na-override ng <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Humigit-kumulang <xliff:g id="TIME_REMAINING">%1$s</xliff:g> ang natitira"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 1a489d1..c39a1ea 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Kırmızı renk körlüğü (kırmızı-yeşil)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Mavi renk körlüğü (mavi-sarı)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Renk düzeltme"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Renk düzeltme, renk körlüğü olan kişilerin daha doğru renkler görmelerine yardımcı olur"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> tarafından geçersiz kılındı"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Yaklaşık <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index fbe2ba6..30d9891 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Протаномалія (червоний – зелений)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Тританомалія (синій – жовтий)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Корекція кольору"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Корекція кольору допомагає людям із дальтонізмом бачити точніші кольори"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Замінено на <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Залишилося приблизно <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 56f4f06..f00c8f9 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaly (سرخ سبز)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaly (نیلا پیلا)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"رنگ کی اصلاح"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"رنگ کی درستگی رنگ نہ دکھائی دینے والے لوگوں کی رنگوں کو مزید درست طریقے سے دیکھنے میں مدد کرتی ہے"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> کے ذریعہ منسوخ کردیا گیا"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"تقریباً <xliff:g id="TIME_REMAINING">%1$s</xliff:g> باقی ہے"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index df11004..d37959d 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomaliya (qizil/yashil)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanomaliya (ko‘k/sariq)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Rangni tuzatish"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Ranglarni sozlash ranglarni farqlashda muammosi bor insonlarga (masalan, daltoniklarga) aniq koʻrishda yordam beradi"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"<xliff:g id="TITLE">%1$s</xliff:g> bilan almashtirildi"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> – <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Taxminan <xliff:g id="TIME_REMAINING">%1$s</xliff:g> qoldi"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 9863bfe..d2462a6 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Mù màu đỏ không hoàn toàn (đỏ-xanh lục)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Mù màu (xanh lam-vàng)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Sửa màu"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Tính năng hiệu chỉnh màu sắc giúp những người bị mù màu thấy màu sắc chính xác hơn"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Bị ghi đè bởi <xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Còn khoảng <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index b83469b..73f1e31 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"红色弱视(红绿不分)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"蓝色弱视(蓝黄不分)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"色彩校正"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"颜色校正功能有助于色盲用户看到更准确的颜色"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"已被“<xliff:g id="TITLE">%1$s</xliff:g>”覆盖"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"大约还可使用 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 992cb5f..b3039a2 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"紅色弱視 (紅綠)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"藍色弱視 (藍黃)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"色彩校正"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"色彩校正可以協助色盲人士睇到更加準確嘅顏色"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"已由「<xliff:g id="TITLE">%1$s</xliff:g>」覆寫"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"還有大約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 6c664d9..4203ae8 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"紅色弱視 (紅-綠)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"藍色弱視 (藍-黃)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"色彩校正"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"色彩校正可協助色盲使用者看見較準確的色彩"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"已改為<xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"還能使用約 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 6def217..9043543 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -416,7 +416,8 @@
<string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"I-Protanomaly (bomvu-luhlaza)"</string>
<string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"I-Tritanomaly (luhlaza okwesibhakabhaka-phuzi)"</string>
<string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Ukulungiswa kombala"</string>
- <string name="accessibility_display_daltonizer_preference_subtitle" msgid="6178138727195403796">"Ukulungisa umbala kusiza abantu abangaboni imibala bobone imibala enembe kakhulu"</string>
+ <!-- no translation found for accessibility_display_daltonizer_preference_subtitle (1284746051652993443) -->
+ <skip />
<string name="daltonizer_type_overridden" msgid="4509604753672535721">"Igitshezwe ngaphezulu yi-<xliff:g id="TITLE">%1$s</xliff:g>"</string>
<string name="power_remaining_settings_home_page" msgid="4885165789445462557">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> - <xliff:g id="TIME_STRING">%2$s</xliff:g>"</string>
<string name="power_remaining_duration_only" msgid="8264199158671531431">"Cishe u-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> osele"</string>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index a797066..73f08c68 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -605,6 +605,8 @@
<string name="adb_wireless_qrcode_pairing_title">Scan QR code</string>
<!-- [CHAR LIMIT=NONE] Adb Wireless QR code pairing description -->
<string name="adb_wireless_qrcode_pairing_description">Pair device over Wi\u2011Fi by scanning a QR Code</string>
+ <!-- [CHAR LIMIT=NONE] Toast message when trying to enable Wi-Fi debugging and no Wi-Fi network connected -->
+ <string name="adb_wireless_no_network_msg">Please connect to a Wi\u2011Fi network</string>
<!--Adb wireless search Keywords [CHAR LIMIT=NONE]-->
<string name="keywords_adb_wireless">adb, debug, dev</string>
<!-- [CHAR LIMIT=NONE] Setting checkbox title for Whether to include bug report item in power menu. -->
@@ -1066,8 +1068,8 @@
<string name="power_discharge_by_only">Should last until about <xliff:g id="time">%1$s</xliff:g></string>
<!-- [CHAR_LIMIT=20] Label for estimated time that phone will run out of battery -->
<string name="power_discharge_by_only_short">Until <xliff:g id="time" example="12 PM">%1$s</xliff:g></string>
- <!-- [CHAR_LIMIT=100] Extend the battery life past a certain time -->
- <string name="power_suggestion_extend_battery">Extend battery life past <xliff:g id="time" example="12 PM">%1$s</xliff:g></string>
+ <!-- [CHAR_LIMIT=100] Label for estimated time that phone will run out of battery -->
+ <string name="power_suggestion_battery_run_out">Battery may run out by <xliff:g id="time" example="12 PM">%1$s</xliff:g></string>
<!-- [CHAR_LIMIT=60] label for estimated remaining duration of battery when under a certain amount -->
<string name="power_remaining_less_than_duration_only">Less than <xliff:g id="threshold">%1$s</xliff:g> remaining</string>
@@ -1279,4 +1281,28 @@
<!-- Name of the 3.5mm audio device. [CHAR LIMIT=40] -->
<string name="media_transfer_wired_device_name">Wired audio device</string>
+
+ <!-- Help button label [CHAR LIMIT=40] -->
+ <string name="help_label">Help & feedback</string>
+
+ <!-- Preference category for storage development settings. [CHAR LIMIT=50] -->
+ <string name="storage_category">Storage</string>
+ <!-- Storage: view and access information about shared blobs [CHAR LIMIT=50] -->
+ <string name="shared_data_title">Shared data</string>
+ <!-- Storage: shared data summary [CHAR LIMIT=80] -->
+ <string name="shared_data_summary">View and modify shared data</string>
+ <!-- Shared data: shared data id [CHAR LIMIT=50] -->
+ <string name="blob_id_text">Shared data ID: <xliff:g id="blob_id" example="100">%d</xliff:g></string>
+ <!-- Shared data: label to indicate when the shared data expires [CHAR LIMIT=80] -->
+ <string name="blob_expires_text">Expires at <xliff:g id="date" example="Mar 20, 2020 11:59:59 GMT">%s</xliff:g></string>
+ <!-- Shared data: title for screen showing list of packages accessing some shared data [CHAR LIMIT=50] -->
+ <string name="accessor_info_title">Apps sharing data</string>
+ <!-- Shared data: text indicating that no description was provided by the app for this shared data [CHAR LIMIT=80] -->
+ <string name="accessor_no_description_text">No description provided by the app.</string>
+ <!-- Shared data: label to indicate when the lease acquired by an app expires [CHAR LIMIT=80] -->
+ <string name="accessor_expires_text">Lease expires at <xliff:g id="date" example="Mar 20, 2020 11:59:59 GMT">%s</xliff:g></string>
+ <!-- Shared data: button text for deleting some shared data [CHAR LIMIT=50] -->
+ <string name="delete_blob_text">Delete shared data</string>
+ <!-- Shared data: confirmation dialog text when attempting delete some shared data [CHAR LIMIT=NONE] -->
+ <string name="delete_blob_confirmation_text">Are you sure you want to delete this shared data?</string>
</resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
index eb0ddfb..24cd551 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
@@ -181,9 +181,13 @@
return false;
}
- final RoutingSessionInfo info = getRoutingSessionInfo();
- if (info != null) {
- mRouterManager.getControllerForSession(info).release();
+
+ final List<RoutingSessionInfo> sessionInfos =
+ mRouterManager.getRoutingSessions(mPackageName);
+ final RoutingSessionInfo sessionInfo = sessionInfos.get(sessionInfos.size() - 1);
+
+ if (sessionInfo != null) {
+ mRouterManager.releaseSession(sessionInfo);
return true;
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java b/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java
index 7046d23..0a70f72 100644
--- a/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java
@@ -119,7 +119,7 @@
return null;
}
if (drainTimeMs <= ONE_DAY_MILLIS) {
- return context.getString(R.string.power_suggestion_extend_battery,
+ return context.getString(R.string.power_suggestion_battery_run_out,
getDateTimeStringFromMs(context, drainTimeMs));
} else {
return getMoreThanOneDayShortString(context, drainTimeMs,
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiEntryPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiEntryPreference.java
index c63c34c..8aa0aec 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiEntryPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiEntryPreference.java
@@ -107,6 +107,7 @@
final ImageView frictionImageView = (ImageView) view.findViewById(
R.id.friction_icon);
if (mWifiEntry.canManageSubscription() && !mWifiEntry.isSaved()
+ && !mWifiEntry.isSubscription()
&& mWifiEntry.getConnectedState() == WifiEntry.CONNECTED_STATE_DISCONNECTED) {
final Drawable drawablehelp = getDrawable(R.drawable.ic_help);
drawablehelp.setTintList(
@@ -114,6 +115,9 @@
((ImageView) imageButton).setImageDrawable(drawablehelp);
imageButton.setVisibility(View.VISIBLE);
imageButton.setOnClickListener(this);
+ imageButton.setContentDescription(
+ getContext().getText(R.string.help_label));
+
if (frictionImageView != null) {
frictionImageView.setVisibility(View.GONE);
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java
index ed308c8..342d127a 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java
@@ -42,7 +42,7 @@
private static final long THIRTY_HOURS_MILLIS = Duration.ofHours(30).toMillis();
private static final String NORMAL_CASE_EXPECTED_PREFIX = "Should last until about";
private static final String ENHANCED_SUFFIX = " based on your usage";
- private static final String EXTEND_PREFIX = "Extend battery life past";
+ private static final String BATTERY_RUN_OUT_PREFIX = "Battery may run out by";
// matches a time (ex: '1:15 PM', '2 AM', '23:00')
private static final String TIME_OF_DAY_REGEX = " (\\d)+:?(\\d)* ((AM)*)|((PM)*)";
// matches a percentage with parenthesis (ex: '(10%)')
@@ -189,9 +189,9 @@
String info = PowerUtil.getBatteryTipStringFormatted(mContext,
SEVENTEEN_MIN_MILLIS);
- // ex: Extend battery life past 1:15 PM
+ // ex: Battery may run out by 1:15 PM
assertThat(info).containsMatch(Pattern.compile(
- EXTEND_PREFIX + TIME_OF_DAY_REGEX));
+ BATTERY_RUN_OUT_PREFIX + TIME_OF_DAY_REGEX));
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiEntryPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiEntryPreferenceTest.java
index 47836c0..a9f31ce 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiEntryPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiEntryPreferenceTest.java
@@ -167,4 +167,35 @@
assertThat(view.findViewById(R.id.icon_button).getVisibility()).isEqualTo(View.VISIBLE);
}
+
+ @Test
+ public void helpButton_whenCanManageSubscription_shouldSetCorrectContentDescription() {
+ when(mMockWifiEntry.canManageSubscription()).thenReturn(true);
+ final WifiEntryPreference pref =
+ new WifiEntryPreference(mContext, mMockWifiEntry, mMockIconInjector);
+ final LayoutInflater inflater = LayoutInflater.from(mContext);
+ final View view = inflater.inflate(pref.getLayoutResource(), new LinearLayout(mContext),
+ false);
+ final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(view);
+
+ pref.onBindViewHolder(holder);
+
+ assertThat(view.findViewById(R.id.icon_button).getContentDescription()).isEqualTo(
+ mContext.getString(R.string.help_label));
+ }
+
+ @Test
+ public void subscriptionEntry_shouldSetImageButtonGone() {
+ when(mMockWifiEntry.isSubscription()).thenReturn(true);
+ final WifiEntryPreference pref =
+ new WifiEntryPreference(mContext, mMockWifiEntry, mMockIconInjector);
+ final LayoutInflater inflater = LayoutInflater.from(mContext);
+ final View view = inflater.inflate(pref.getLayoutResource(), new LinearLayout(mContext),
+ false);
+ final PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(view);
+
+ pref.onBindViewHolder(holder);
+
+ assertThat(view.findViewById(R.id.icon_button).getVisibility()).isEqualTo(View.GONE);
+ }
}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
index 2d351c7..d93c015 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
@@ -1313,7 +1313,8 @@
}
// isValuePreservedInRestore shouldn't change back to false if it has been set to true.
- boolean isPreserved = shouldPreserveSetting(overrideableByRestore, resetToDefault);
+ boolean isPreserved = shouldPreserveSetting(overrideableByRestore, resetToDefault,
+ packageName, value);
// Is something gonna change?
if (Objects.equals(value, this.value)
@@ -1339,11 +1340,16 @@
}
private boolean shouldPreserveSetting(boolean overrideableByRestore,
- boolean resetToDefault) {
+ boolean resetToDefault, String packageName, String value) {
if (resetToDefault) {
// By default settings are not marked as preserved.
return false;
}
+ if (value != null && value.equals(this.value)
+ && SYSTEM_PACKAGE_NAME.equals(packageName)) {
+ // Do not mark preserved if it's the system reinitializing to the same value.
+ return false;
+ }
// isValuePreservedInRestore shouldn't change back to false if it has been set to true.
return this.isValuePreservedInRestore || !overrideableByRestore;
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java
index 6a3c661..9f448af 100644
--- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java
@@ -47,6 +47,7 @@
"日本語";
private static final String TEST_PACKAGE = "package";
+ private static final String SYSTEM_PACKAGE = "android";
private static final String SETTING_NAME = "test_setting";
private final Object mLock = new Object();
@@ -253,6 +254,26 @@
}
+ public void testModifySettingBySystemPackage_sameValue_preserveFlagNotSet() {
+ SettingsState settingsState = getSettingStateObject();
+ // Initialize the setting.
+ settingsState.insertSettingLocked(SETTING_NAME, "1", null, false, SYSTEM_PACKAGE);
+ // Update the setting.
+ settingsState.insertSettingLocked(SETTING_NAME, "1", null, false, SYSTEM_PACKAGE);
+
+ assertFalse(settingsState.getSettingLocked(SETTING_NAME).isValuePreservedInRestore());
+ }
+
+ public void testModifySettingBySystemPackage_newValue_preserveFlagSet() {
+ SettingsState settingsState = getSettingStateObject();
+ // Initialize the setting.
+ settingsState.insertSettingLocked(SETTING_NAME, "1", null, false, SYSTEM_PACKAGE);
+ // Update the setting.
+ settingsState.insertSettingLocked(SETTING_NAME, "2", null, false, SYSTEM_PACKAGE);
+
+ assertTrue(settingsState.getSettingLocked(SETTING_NAME).isValuePreservedInRestore());
+ }
+
private SettingsState getSettingStateObject() {
SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1,
SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper());
diff --git a/packages/SystemUI/res/layout/controls_management.xml b/packages/SystemUI/res/layout/controls_management.xml
index 34a966c..9d5eb63 100644
--- a/packages/SystemUI/res/layout/controls_management.xml
+++ b/packages/SystemUI/res/layout/controls_management.xml
@@ -105,7 +105,7 @@
android:id="@+id/done"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:text="Done"
+ android:text="@string/save"
style="@*android:style/Widget.DeviceDefault.Button.Colored"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
@@ -114,4 +114,4 @@
</FrameLayout>
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/notification_conversation_info.xml b/packages/SystemUI/res/layout/notification_conversation_info.xml
index 6a7f9e2..87cb5c7f 100644
--- a/packages/SystemUI/res/layout/notification_conversation_info.xml
+++ b/packages/SystemUI/res/layout/notification_conversation_info.xml
@@ -53,8 +53,7 @@
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:layout_alignEnd="@id/conversation_icon"
- android:layout_toEndOf="@id/conversation_icon"
- android:layout_alignStart="@id/mute">
+ android:layout_toEndOf="@id/conversation_icon">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -127,96 +126,230 @@
<!-- end aligned fields -->
<ImageButton
- android:id="@+id/mute"
+ android:id="@+id/info"
android:layout_width="@dimen/notification_importance_toggle_size"
android:layout_height="@dimen/notification_importance_toggle_size"
android:layout_centerVertical="true"
android:background="@drawable/ripple_drawable"
- android:layout_toStartOf="@id/fave"
- android:tint="@color/notification_guts_link_icon_tint"/>
- <ImageButton
- android:id="@+id/fave"
- android:layout_width="@dimen/notification_importance_toggle_size"
- android:layout_height="@dimen/notification_importance_toggle_size"
- android:layout_centerVertical="true"
- android:background="@drawable/ripple_drawable"
+ android:contentDescription="@string/notification_more_settings"
+ android:src="@drawable/ic_settings"
android:layout_alignParentEnd="true"
android:tint="@color/notification_guts_link_icon_tint"/>
</LinearLayout>
<LinearLayout
- android:id="@+id/actions"
+ android:id="@+id/inline_controls"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginEnd="@*android:dimen/notification_content_margin_end"
+ android:paddingEnd="@*android:dimen/notification_content_margin_end"
+ android:layout_marginTop="@dimen/notification_guts_option_vertical_padding"
android:clipChildren="false"
android:clipToPadding="false"
android:orientation="vertical">
- <View
+ <!-- Non configurable app/channel text. appears instead of @+id/interruptiveness_settings-->
+ <TextView
+ android:id="@+id/non_configurable_text"
+ android:text="@string/notification_unblockable_desc"
+ android:visibility="gone"
android:layout_width="match_parent"
- android:layout_height="0.5dp"
- android:background="@color/GM2_grey_300" />
+ android:layout_height="wrap_content"
+ style="@*android:style/TextAppearance.DeviceDefault.Notification" />
- <Button
- android:id="@+id/snooze"
- android:layout_height="@dimen/notification_guts_conversation_action_height"
+ <!-- Non configurable multichannel text. appears instead of @+id/interruptiveness_settings-->
+ <TextView
+ android:id="@+id/non_configurable_multichannel_text"
+ android:text="@string/notification_multichannel_desc"
+ android:visibility="gone"
android:layout_width="match_parent"
- style="?android:attr/borderlessButtonStyle"
- android:text="@string/notification_menu_snooze_action"
- android:gravity="left|center_vertical"
- android:drawableStart="@drawable/ic_snooze"
- android:drawablePadding="@dimen/notification_guts_conversation_action_text_padding_start"
- android:drawableTint="@color/notification_guts_link_icon_tint"/>
+ android:layout_height="wrap_content"
+ style="@*android:style/TextAppearance.DeviceDefault.Notification" />
- <View
+ <LinearLayout
+ android:id="@+id/interruptiveness_settings"
android:layout_width="match_parent"
- android:layout_height="0.5dp"
- android:background="@color/GM2_grey_300" />
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:orientation="vertical">
- <Button
- android:id="@+id/bubble"
- android:layout_height="@dimen/notification_guts_conversation_action_height"
- android:layout_width="match_parent"
- style="?android:attr/borderlessButtonStyle"
- android:text="@string/notification_conversation_favorite"
- android:gravity="left|center_vertical"
- android:drawableStart="@drawable/ic_create_bubble"
- android:drawablePadding="@dimen/notification_guts_conversation_action_text_padding_start"
- android:drawableTint="@color/notification_guts_link_icon_tint"/>
+ <com.android.systemui.statusbar.notification.row.ButtonLinearLayout
+ android:id="@+id/priority"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="@dimen/notification_importance_button_padding"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="@drawable/notification_guts_priority_button_bg"
+ android:orientation="vertical">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center"
+ >
+ <ImageView
+ android:id="@+id/priority_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ic_important_outline"
+ android:background="@android:color/transparent"
+ android:tint="@color/notification_guts_priority_contents"
+ android:clickable="false"
+ android:focusable="false"/>
+ <TextView
+ android:id="@+id/priority_label"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/notification_importance_drawable_padding"
+ android:layout_weight="1"
+ android:ellipsize="end"
+ android:maxLines="1"
+ android:clickable="false"
+ android:focusable="false"
+ android:textAppearance="@style/TextAppearance.NotificationImportanceButton"
+ android:text="@string/notification_priority_title"/>
+ </LinearLayout>
+ <TextView
+ android:id="@+id/priority_summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/notification_importance_button_description_top_margin"
+ android:visibility="gone"
+ android:text="@string/notification_channel_summary_priority"
+ android:clickable="false"
+ android:focusable="false"
+ android:ellipsize="end"
+ android:maxLines="2"
+ android:textAppearance="@style/TextAppearance.NotificationImportanceDetail"/>
+ </com.android.systemui.statusbar.notification.row.ButtonLinearLayout>
- <View
- android:layout_width="match_parent"
- android:layout_height="0.5dp"
- android:background="@color/GM2_grey_300" />
- <Button
- android:id="@+id/home"
- android:layout_height="@dimen/notification_guts_conversation_action_height"
- android:layout_width="match_parent"
- style="?android:attr/borderlessButtonStyle"
- android:text="@string/notification_conversation_home_screen"
- android:gravity="left|center_vertical"
- android:drawableStart="@drawable/ic_add_to_home"
- android:drawablePadding="@dimen/notification_guts_conversation_action_text_padding_start"
- android:drawableTint="@color/notification_guts_link_icon_tint"/>
+ <com.android.systemui.statusbar.notification.row.ButtonLinearLayout
+ android:id="@+id/default_behavior"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/notification_importance_button_separation"
+ android:padding="@dimen/notification_importance_button_padding"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="@drawable/notification_guts_priority_button_bg"
+ android:orientation="vertical">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center"
+ >
+ <ImageView
+ android:id="@+id/default_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ic_notifications_alert"
+ android:background="@android:color/transparent"
+ android:tint="@color/notification_guts_priority_contents"
+ android:clickable="false"
+ android:focusable="false"/>
+ <TextView
+ android:id="@+id/default_label"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/notification_importance_drawable_padding"
+ android:layout_weight="1"
+ android:ellipsize="end"
+ android:maxLines="1"
+ android:clickable="false"
+ android:focusable="false"
+ android:textAppearance="@style/TextAppearance.NotificationImportanceButton"
+ android:text="@string/notification_alert_title"/>
+ </LinearLayout>
+ <TextView
+ android:id="@+id/default_summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/notification_importance_button_description_top_margin"
+ android:visibility="gone"
+ android:text="@string/notification_channel_summary_default"
+ android:clickable="false"
+ android:focusable="false"
+ android:ellipsize="end"
+ android:maxLines="2"
+ android:textAppearance="@style/TextAppearance.NotificationImportanceDetail"/>
+ </com.android.systemui.statusbar.notification.row.ButtonLinearLayout>
- <View
- android:layout_width="match_parent"
- android:layout_height="0.5dp"
- android:background="@color/GM2_grey_300" />
-
- <Button
- android:id="@+id/info"
- android:layout_height="@dimen/notification_guts_conversation_action_height"
- android:layout_width="match_parent"
- style="?android:attr/borderlessButtonStyle"
- android:drawableStart="@drawable/ic_settings"
- android:text="@string/notification_menu_settings_action"
- android:gravity="left|center_vertical"
- android:drawablePadding="@dimen/notification_guts_conversation_action_text_padding_start"
- android:drawableTint="@color/notification_guts_link_icon_tint"/>
+ <com.android.systemui.statusbar.notification.row.ButtonLinearLayout
+ android:id="@+id/silence"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/notification_importance_button_separation"
+ android:padding="@dimen/notification_importance_button_padding"
+ android:clickable="true"
+ android:focusable="true"
+ android:background="@drawable/notification_guts_priority_button_bg"
+ android:orientation="vertical">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center"
+ >
+ <ImageView
+ android:id="@+id/silence_icon"
+ android:src="@drawable/ic_notifications_silence"
+ android:background="@android:color/transparent"
+ android:tint="@color/notification_guts_priority_contents"
+ android:layout_gravity="center"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:clickable="false"
+ android:focusable="false"/>
+ <TextView
+ android:id="@+id/silence_label"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:maxLines="1"
+ android:clickable="false"
+ android:focusable="false"
+ android:layout_toEndOf="@id/silence_icon"
+ android:layout_marginStart="@dimen/notification_importance_drawable_padding"
+ android:textAppearance="@style/TextAppearance.NotificationImportanceButton"
+ android:text="@string/notification_silence_title"/>
+ </LinearLayout>
+ <TextView
+ android:id="@+id/silence_summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/notification_importance_button_description_top_margin"
+ android:visibility="gone"
+ android:text="@string/notification_channel_summary_low"
+ android:clickable="false"
+ android:focusable="false"
+ android:ellipsize="end"
+ android:maxLines="2"
+ android:textAppearance="@style/TextAppearance.NotificationImportanceDetail"/>
+ </com.android.systemui.statusbar.notification.row.ButtonLinearLayout>
</LinearLayout>
+ <RelativeLayout
+ android:id="@+id/bottom_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="60dp"
+ android:gravity="center_vertical"
+ android:paddingStart="4dp"
+ android:paddingEnd="4dp"
+ >
+ <TextView
+ android:id="@+id/done"
+ android:text="@string/inline_ok_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:gravity="end|center_vertical"
+ android:minWidth="@dimen/notification_importance_toggle_size"
+ android:minHeight="@dimen/notification_importance_toggle_size"
+ style="@style/TextAppearance.NotificationInfo.Button"/>
+ </RelativeLayout>
+ </LinearLayout>
+
</com.android.systemui.statusbar.notification.row.NotificationConversationInfo>
diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml
index 6ab573b..73b711d 100644
--- a/packages/SystemUI/res/layout/notification_info.xml
+++ b/packages/SystemUI/res/layout/notification_info.xml
@@ -52,8 +52,7 @@
android:layout_centerVertical="true"
android:gravity="center_vertical"
android:layout_alignEnd="@id/pkg_icon"
- android:layout_toEndOf="@id/pkg_icon"
- android:layout_alignStart="@id/mute">
+ android:layout_toEndOf="@id/pkg_icon">
<TextView
android:id="@+id/channel_name"
android:layout_width="match_parent"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index fbbe74e..0fb6415 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Kry jou aandag met klank of vibrasie."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Hou jou aandag met \'n swewende kortpad na hierdie inhoud toe."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Geen onlangse borrels nie"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Onlangse borrels en borrels wat toegemaak is, sal hier verskyn."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Hierdie kennisgewings kan nie gewysig word nie."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Hierdie groep kennisgewings kan nie hier opgestel word nie"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Instaanbediener-kennisgewing"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Toesteldienste"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Titelloos"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Tik om hierdie program te herbegin en maak volskerm oop."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Maak <xliff:g id="APP_NAME">%1$s</xliff:g> oop"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Instellings vir <xliff:g id="APP_NAME">%1$s</xliff:g>-borrels"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Laat borrels vanaf <xliff:g id="APP_NAME">%1$s</xliff:g> toe?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Bestuur"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Weier"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Laat toe"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Vra my later"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> vanaf <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> van <xliff:g id="APP_NAME">%2$s</xliff:g> en <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> meer af"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Beweeg"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Beweeg na links onder"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Beweeg na regs onder"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Maak toe"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Hou kletse prominent"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Nuwe kletse van <xliff:g id="APP_NAME">%1$s</xliff:g> af sal as borrels verskyn. Tik op \'n borrel om dit oop te maak. Sleep om dit te skuif.\n\nTik op die borrel"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tik op Bestuur om borrels vanaf hierdie program af te skakel"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Stelselnavigasie is opgedateer. Gaan na Instellings toe om veranderinge te maak."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gaan na Instellings toe om stelselnavigasie op te dateer"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Bystandmodus"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Swiep om ander strukture te sien"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 30b8a878..56df206 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"ከድምፅ ወይም ንዝረት ጋር የእርስዎን ትኩረት ይስባል።"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ለዚህ ይዞታ ከተንሳፋፊ አቋራጭ ጋር የእርስዎን ትኩረት ያቆያል።"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ምንም የቅርብ ጊዜ አረፋዎች የሉም"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"የቅርብ ጊዜ አረፋዎች እና የተሰናበቱ አረፋዎች እዚህ ይመጣሉ።"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"የማሳወቂያዎች ይህ ቡድን እዚህ ላይ ሊዋቀር አይችልም"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"ተኪ ማሳወቂያ"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"የመሣሪያ አገልግሎቶች"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"ርዕስ የለም"</string>
<string name="restart_button_description" msgid="6916116576177456480">"ይህን መተግበሪያ እንደገና ለማስጀመር መታ ያድርጉ እና ወደ ሙሉ ማያ ገጽ ይሂዱ።"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> ክፈት"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"ቅንብሮች ለ <xliff:g id="APP_NAME">%1$s</xliff:g> አረፋዎች"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"ከ <xliff:g id="APP_NAME">%1$s</xliff:g> አረፋዎች ይፈቀዱ?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"ያቀናብሩ"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"ከልክል"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"ፍቀድ"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"በኋላ ጠይቀኝ"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ከ<xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ከ <xliff:g id="APP_NAME">%2$s</xliff:g> እና <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ተጨማሪ"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"አንቀሳቅስ"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"የግርጌውን ግራ አንቀሳቅስ"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"ታችኛውን ቀኝ ያንቀሳቅሱ"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"አሰናብት"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"ውይይቶችን ከፊት ያድርጓቸው"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"ከ<xliff:g id="APP_NAME">%1$s</xliff:g> የመጡ አዲስ ውይይቶች እንደ አረፋዎች ሆነው ይታያሉ። አንድ አረፋን ለመክፈት መታ ያድርጉት። እሱን ለማንቀሳቀስ ይጎትቱት።\n\nአረፋውን መታ ያድርጉት"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"የዚህ መተግበሪያ አረፋዎችን ለማጥፋት አቀናብርን መታ ያድርጉ"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"የስርዓት ዳሰሳ ተዘምኗል። ለውጦችን ለማድረግ ወደ ቅንብሮች ይሂዱ።"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"የስርዓት ዳሰሳን ለማዘመን ወደ ቅንብሮች ይሂዱ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ተጠባባቂ"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"ሌሎች መዋቅሮችን ለማየት በጣት ይጥረጉ"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index e3bc9fc..e0c945f 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -711,7 +711,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"يلفت هذا الإشعار انتباهك باستخدام الصوت والاهتزاز."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"يلفِت هذا الإشعار انتباهك لهذا المحتوى باستخدام اختصار عائم."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ليس هناك فقاعات حديثة"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"ستظهر هنا أحدث الفقاعات والفقاعات التي تم إغلاقها."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"يتعذّر تعديل هذه الإشعارات."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"يتعذّر ضبط مجموعة الإشعارات هذه هنا."</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"إشعار مستند إلى خادم وكيل"</string>
@@ -989,13 +990,8 @@
<string name="device_services" msgid="1549944177856658705">"خدمات الأجهزة"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"بلا عنوان"</string>
<string name="restart_button_description" msgid="6916116576177456480">"انقر لإعادة تشغيل هذا التطبيق والانتقال إلى وضع ملء الشاشة."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"فتح <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"إعداد الفقاعات التفسيرية على <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"هل تريد السماح بالفقاعات التفسيرية من <xliff:g id="APP_NAME">%1$s</xliff:g>؟"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"إدارة"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"رفض"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"سماح"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"اسألني لاحقًا"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> من <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> من <xliff:g id="APP_NAME">%2$s</xliff:g> و<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> أيضًا"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"نقل"</string>
@@ -1004,9 +1000,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"نقل إلى أسفل يمين الشاشة"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"نقل إلى أسفل اليسار"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"تجاهل"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"الاحتفاظ بالمحادثات في المقدمة"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"ستظهر المحادثات الجديدة من <xliff:g id="APP_NAME">%1$s</xliff:g> كفقاقيع. انقر على فقعة لفتحها. اسحبها لنقلها.\n\nانقر على الفقاعة."</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"انقر على \"إدارة\" لإيقاف الفقاعات من هذا التطبيق."</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"تم تحديث التنقل داخل النظام. لإجراء التغييرات، يُرجى الانتقال إلى \"الإعدادات\"."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"الانتقال إلى \"الإعدادات\" لتعديل التنقل داخل النظام"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"وضع الاستعداد"</string>
@@ -1037,4 +1041,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"مرّر سريعًا لعرض البُنى الأخرى."</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 266af09..b2934a4 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"ধ্বনি অথবা কম্পনৰ জৰিয়তে আপোনাৰ মনোযোগ আকৰ্ষণ কৰে।"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"উপঙি থকা এটা শ্বৰ্টকাটৰ জৰিয়তে এই সমলখিনিৰ প্ৰতি আপোনাক মনোযোগী কৰি ৰাখে।"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"কোনো শেহতীয়া বাবল নাই"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"শেহতীয়া বাবলসমূহ আৰু অগ্ৰাহ্য কৰা বাবলসমূহ ইয়াত প্ৰদর্শিত হ\'ব।"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"এই ধৰণৰ জাননীবোৰ ইয়াত কনফিগাৰ কৰিব পৰা নাযায়"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"প্ৰক্সি হিচাপে পঠিওৱা জাননী"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"ডিভাইচ সেৱা"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"কোনো শিৰোনাম নাই"</string>
<string name="restart_button_description" msgid="6916116576177456480">"এপ্টো ৰিষ্টাৰ্ট কৰক আৰু পূৰ্ণ স্ক্ৰীণ ব্যৱহাৰ কৰক।"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> খোলক"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবলৰ ছেটিংসমূহ"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ বাবলসমূহক অনুমতি দিয়ক?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"পৰিচালনা কৰক"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"অস্বীকাৰ কৰক"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"অনুমতি দিয়ক"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"মোক পিছত সুধিব"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>ৰ পৰা <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> আৰু<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>টাৰ পৰা <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"আঁতৰাওক"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"বুটামটো বাওঁফালে নিয়ক"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"তলৰ সোঁফালে নিয়ক"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"অগ্ৰাহ্য কৰক"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"চাটসমূহ সন্মুখত ৰাখক"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ নতুন চাটসমূহ বাবল হিচাপে দেখা পোৱা যাব। এইটো খুলিবলৈ এটা বাবলত টিপক। এইটোক আঁতৰাবলৈ টানি আনক।\n\nবাবলটোত টিপক"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"এই এপ্টোৰ পৰা বাবল অফ কৰিবলৈ পৰিচালনা কৰকত টিপক"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰা হ’ল। সলনি কৰিবলৈ ছেটিংসমূহ-লৈ যাওক।"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ছিষ্টেম নেভিগেশ্বন আপডে’ট কৰিবলৈ ছেটিংসমূহ-লৈ যাওক"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ষ্টেণ্ডবাই"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"আন সজ্জাসমূহ চাবলৈ ছোৱাইপ কৰক"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 955fda9..66fbc2d 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Səs və ya vibrasiya ilə diqqətinizi çəkir."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Bu məzmuna üzən qısayol ilə diqqətinizi cəlb edir."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Qabarcıq yoxdur"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Son qabaqcıqlar və buraxılmış qabarcıqlar burada görünəcək."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirişlər dəyişdirilə bilməz."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Bu bildiriş qrupunu burada konfiqurasiya etmək olmaz"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Proksi bildirişi"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Cihaz Xidmətləri"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Başlıq yoxdur"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Bu tətbiqi sıfırlayaraq tam ekrana keçmək üçün klikləyin."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> tətbiqini açın"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> qabarcıqları üçün ayarlar"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> qabarcıqlarına icazə verilsin?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"İdarə edin"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"İmtina edin"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"İcazə verin"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Sonra soruşun"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> tətbiqindən <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> tətbiqindən <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> və daha <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> qabarcıq"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Hərəkət etdirin"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Aşağıya sola köçürün"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Aşağıya sağa köçürün"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Kənarlaşdırın"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Söhbətləri öndə saxlayın"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Yeni <xliff:g id="APP_NAME">%1$s</xliff:g> söhbətləri qabarcıq şəklində görünəcək. Açmaq üçün qabarcığa toxunun. Hərəkət etdirmək üçün onu sürüşdürün.\n\nQabarcığa toxunun"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Bu tətbiqdə qabarcıqları deaktiv etmək üçün \"İdarə edin\" seçiminə toxunun"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistem naviqasiyası yeniləndi. Dəyişiklik etmək üçün Ayarlara daxil olun."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistem naviqasiyasını yeniləmək üçün Ayarlara keçin"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gözləmə rejimi"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Digər strukturları görmək üçün çəkin"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 1d2bc2b..5839f73 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -702,7 +702,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Privlači vam pažnju pomoću zvuka ili vibracije."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Privlači vam pažnju pomoću plutajuće prečice do ovog sadržaja."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Ovde se prikazuju nedavni i odbačeni oblačići."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ova obaveštenja ne mogu da se menjaju."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ova grupa obaveštenja ne može da se konfiguriše ovde"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Obaveštenje preko proksija"</string>
@@ -974,13 +975,8 @@
<string name="device_services" msgid="1549944177856658705">"Usluge za uređaje"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Dodirnite da biste restartovali aplikaciju i prešli u režim celog ekrana."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Otvorite <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Podešavanja za <xliff:g id="APP_NAME">%1$s</xliff:g> oblačiće"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Želite li da omogućite oblačiće iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Upravljajte"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Odbij"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Dozvoli"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Pitaj me kasnije"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> i još <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Premesti"</string>
@@ -989,9 +985,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Premesti dole levo"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Premesti dole desno"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Odbaci"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Neka poruke ćaskanja ostanu u prvom planu"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Nove poruke ćaskanja iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> će se prikazati kao oblačići. Dodirnite oblačić da biste ga otvorili. Prevucite da biste ga premestili.\n\nDodirnite oblačić"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Dodirnite Upravljajte da biste isključili oblačiće iz ove aplikacije"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigacija sistema je ažurirana. Da biste uneli izmene, idite u Podešavanja."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Idite u Podešavanja da biste ažurirali navigaciju sistema"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravnosti"</string>
@@ -1019,4 +1023,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Prevucite da biste videli druge strukture"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 98e851c..b71e87e 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -707,7 +707,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Прыцягвае ўвагу гукам і вібрацыяй."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Прыцягвае ўвагу да гэтага змесціва ўсплывальнай кнопкай."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Няма нядаўніх усплывальных апавяшчэнняў"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Нядаўнія і адхіленыя ўсплывальныя апавяшчэнні будуць паказаны тут."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Гэтыя апавяшчэнні нельга змяніць."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Тут канфігурыраваць гэту групу апавяшчэнняў забаронена"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Праксіраванае апавяшчэнне"</string>
@@ -981,13 +982,8 @@
<string name="device_services" msgid="1549944177856658705">"Сэрвісы прылады"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Без назвы"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Націсніце, каб перазапусціць гэту праграму і перайсці ў поўнаэкранны рэжым."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Адкрыць праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Налады дыялогаў у праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Дазволіць дыялогі з праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Кіраваць"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Адмовіць"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Дазволіць"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Спытаць пазней"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ад праграмы \"<xliff:g id="APP_NAME">%2$s</xliff:g>\""</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ад праграмы \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" і яшчэ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Перамясціць"</string>
@@ -996,9 +992,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Перамясціць лявей і ніжэй"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Перамясціць правей і ніжэй"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Адхіліць"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Пакідаць чаты на экране"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Новыя чаты з праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" будуць паказвацца ў выглядзе ўсплывальных апавяшчэнняў. Каб адкрыць усплывальнае апавяшчэнне, націсніце на яго. Каб перамясціць – перацягніце.\n\nНацісніце на ўсплывальнае апавяшчэнне"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Каб выключыць усплывальная апавяшчэнні з гэтай праграмы, націсніце \"Кіраваць\""</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навігацыя ў сістэме абноўлена. Каб унесці змяненні, перайдзіце ў Налады."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Перайдзіце ў Налады, каб абнавіць параметры навігацыі ў сістэме"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Рэжым чакання"</string>
@@ -1027,4 +1031,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Прагартайце, каб убачыць іншыя структуры"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index ed399b7..9a6d9c6 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Привлича вниманието ви със звук или вибриране."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Задържа вниманието ви посредством плаващ пряк път към това съдържание."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Няма скорошни балончета"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Скорошните и отхвърлените балончета ще се показват тук."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Тези известия не могат да бъдат променяни."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Тази група от известия не може да бъде конфигурирана тук"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Известие, получено чрез делегиране"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Услуги за устройството"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Няма заглавие"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Докоснете, за да рестартирате това приложение в режим на цял екран."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Отваряне на „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Настройки за балончетата за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Да се разрешат ли балончетата от <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Управление"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Отказ"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Разрешаване"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Попитайте ме по-късно"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> от <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ от<xliff:g id="APP_NAME">%2$s</xliff:g> и още <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Преместване"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Преместване долу вляво"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Преместване долу вдясно"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Отхвърляне"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Задръжте чатовете на екрана"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Новите чатове от <xliff:g id="APP_NAME">%1$s</xliff:g> ще се показват като балончета. Докоснете някое, за да го отворите. Плъзнете, за да го преместите.\n\nДокоснете балончето"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Докоснете „Управление“, за да изключите балончетата от това приложение"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Режимът за навигиране в системата е актуализиран. За да извършите промени, отворете настройките."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Отворете настройките, за да актуализирате режима за навигиране в системата"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим на готовност"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Прекарайте пръст, за да видите други елементи"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index f2495f1..437abe8 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"সাউন্ড বা ভাইব্রেশনের সাহায্যে দৃষ্টি আকর্ষণ করে।"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ফ্লোটিং শর্টকাট ব্যবহার করে এই কন্টেন্টে আপনার দৃষ্টি আকর্ষণ করে রাখে।"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"কোনও সাম্প্রতিক বাবল নেই"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"সাম্প্রতিক বাবল এবং বাতিল করা বাবল এখানে দেখানো হবে।"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"এই সমস্ত বিজ্ঞপ্তিকে এখানে কনফিগার করা যাবে না"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"প্রক্সি করা বিজ্ঞপ্তি"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"ডিভাইস সংক্রান্ত পরিষেবা"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"কোনও শীর্ষক নেই"</string>
<string name="restart_button_description" msgid="6916116576177456480">"এই অ্যাপ রিস্টার্ট করতে ট্যাপ করুন ও ফুল-স্ক্রিন ব্যবহার করুন।"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> খুলুন"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> বাবলের জন্য সেটিংস"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপের বাবল চালু করবেন?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"ম্যানেজ করা"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"খারিজ করুন"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"অনুমতি দিন"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"আমাকে পরে জিজ্ঞাসা করুন"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> অ্যাপ থেকে <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> অ্যাপ এবং আরও <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>টি থেকে <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"সরান"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"নিচে বাঁদিকে সরান"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"নিচে ডান দিকে সরান"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"খারিজ করুন"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"চ্যাটগুলি সামনে রাখুন"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর তরফ থেকে নতুন চ্যাট বাবল হিসেবে দেখানো হবে। এটি খোলার জন্য বাবল ট্যাপ করুন। এটি সরানোর জন্য টেনে আনুন।\n\nবাবল ট্যাপ করুন"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"এই অ্যাপ থেকে বাবল বন্ধ করতে ম্যানেজ করুন বিকল্প ট্যাপ করুন"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"সিস্টেম নেভিগেশন আপডেট হয়েছে। পরিবর্তন করার জন্য সেটিংসে যান।"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"সিস্টেম নেভিগেশন আপডেট করতে সেটিংসে যান"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"স্ট্যান্ডবাই"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"অন্য স্ট্রাকচার দেখতে সোয়াইপ করুন"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index e846b86..655adb6 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -704,7 +704,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Privlači vašu pažnju pomoću zvuka ili vibracije."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Privlači vašu pažnju pomoću plutajuće prečice do ovog sadržaja."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Nedavni oblačići i odbačeni oblačići će se pojaviti ovdje."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ta obavještenja se ne mogu izmijeniti."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ovdje nije moguće konfigurirati ovu grupu obavještenja"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Obavještenje preko proksi servera"</string>
@@ -976,13 +977,8 @@
<string name="device_services" msgid="1549944177856658705">"Usluge uređaja"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Dodirnite da ponovo pokrenete ovu aplikaciju i aktivirate prikaz preko cijelog ekrana."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Otvori aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Postavke za oblačiće aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Dozvoliti oblačiće iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Upravljaj"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Odbij"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Dozvoli"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Pitaj me kasnije"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> od aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"Obavještenje <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> i još <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Pomjeri"</string>
@@ -991,9 +987,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Pomjeri dolje lijevo"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Pomjerite dolje desno"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Odbaci"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Zadržite chatove u prvom planu"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Novi chatovi iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> će se prikazati u oblačićima. Dodirnite oblačić da ga otvorite. Prevucite da ga premjestite.\n\nDodirnite oblačić"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Dodirnite Upravljaj da isključite oblačiće iz ove aplikacije"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigiranje sistemom je ažurirano. Da izvršite promjene, idite u Postavke."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Idite u Postavke da ažurirate navigiranje sistemom"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string>
@@ -1021,4 +1025,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Prevucite da vidite druge strukture"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 3d8f00c..4bb9123 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Atrau la teva atenció amb so i vibració."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Atrau la teva atenció amb una drecera flotant a aquest contingut."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hi ha bombolles recents"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Les bombolles recents i les ignorades es mostraran aquí."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Aquestes notificacions no es poden modificar."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Aquest grup de notificacions no es pot configurar aquí"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Notificació mitjançant aplicació intermediària"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Serveis per a dispositius"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Sense títol"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Toca per reiniciar l\'aplicació i passar a pantalla completa."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Obre <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configuració de les bombolles: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Vols permetre les bombolles de l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Gestiona"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Denega"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Permet"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Pregunta-m\'ho més tard"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de: <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>) i <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> més"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Mou"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Mou a baix a l\'esquerra"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Mou a baix a la dreta"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Omet"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Mantén els xats a la vista"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Els xats nous de l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g> es mostraran en forma de bombolles. Toca una bombolla per obrir-la. Arrossega-la per moure-la.\n\nToca la bombolla"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toca Gestiona per desactivar les bombolles d\'aquesta aplicació"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"S\'ha actualitzat el sistema de navegació. Per fer canvis, ves a Configuració."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ves a Configuració per actualitzar el sistema de navegació"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Llisca per veure altres estructures"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 9779bd1..3b10898 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -705,7 +705,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Upozorňuje vás pomocí zvuku a vibrací."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Přitahuje pozornost pomocí plovoucí zkratky k tomuto obsahu."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Žádné nedávné bubliny"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Zde se budou zobrazovat nedávné bubliny a zavřené bubliny."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Tato oznámení nelze upravit."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Tuto skupinu oznámení tady nelze nakonfigurovat"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Zprostředkované oznámení"</string>
@@ -979,13 +980,8 @@
<string name="device_services" msgid="1549944177856658705">"Služby zařízení"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Bez názvu"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Klepnutím aplikaci restartujete a přejdete na režim celé obrazovky"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Otevřít <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Nastavení bublin aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Povolit bubliny z aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Spravovat"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Zakázat"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Povolit"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Zeptat se později"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"Oznámení <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikace <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikace <xliff:g id="APP_NAME">%2$s</xliff:g> a dalších (<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>)"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Přesunout"</string>
@@ -994,9 +990,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Přesunout vlevo dolů"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Přesunout vpravo dolů"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Zavřít"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Zobrazovat chaty v popředí"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Nové chaty z aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> se budou zobrazovat jako bubliny. Bublinu otevřete klepnutím. Přetažením ji přemístíte.\n\nKlepnout na bublinu"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Bubliny pro tuto aplikaci můžete vypnout klepnutím na Spravovat"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systémová navigace byla aktualizována. Chcete-li provést změny, přejděte do Nastavení."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Přejděte do Nastavení a aktualizujte systémovou navigaci"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostní režim"</string>
@@ -1025,4 +1029,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Přejetím zobrazíte další budovy"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index c3592d3..d46c0501b 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Fanger din opmærksomhed med lyd eller vibration."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Fastholder din opmærksomhed med en svævende genvej til indholdet."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ingen seneste bobler"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Nye bobler og afviste bobler vises her."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse notifikationer kan ikke redigeres."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Du kan ikke konfigurere denne gruppe notifikationer her"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Proxyforbundet notifikation"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Enhedstjenester"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Ingen titel"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Tryk for at genstarte denne app, og gå til fuld skærm."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Åbn <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Indstillinger for <xliff:g id="APP_NAME">%1$s</xliff:g>-bobler"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Vil du tillade bobler fra <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Administrer"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Afvis"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Tillad"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Spørg mig senere"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g> og <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> andre"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Flyt"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Flyt ned til venstre"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Flyt ned til højre"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Afvis"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Hold chatsamtaler i forgrunden"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Nye chatsamtaler fra <xliff:g id="APP_NAME">%1$s</xliff:g> vises som bobler. Tryk på en boble for at åbne samtalen. Træk boblen for at flytte den.\n\nTryk på boblen"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tryk på Administrer for at deaktivere bobler fra denne app"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemnavigationen blev opdateret. Gå til Indstillinger for at foretage ændringer."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gå til Indstillinger for at opdatere systemnavigationen"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Stryg for at se andre strukturer"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 9f5207e..9feae05 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -225,13 +225,9 @@
<string name="accessibility_no_sims" msgid="5711270400476534667">"Keine SIM-Karte"</string>
<string name="carrier_network_change_mode" msgid="5174141476991149918">"Mobilfunknetzwerk wird gewechselt"</string>
<string name="accessibility_battery_details" msgid="6184390274150865789">"Akkudetails öffnen"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for accessibility_battery_level (5143715405241138822) -->
- <skip />
+ <string name="accessibility_battery_level" msgid="5143715405241138822">"Akku bei <xliff:g id="NUMBER">%d</xliff:g> Prozent."</string>
<string name="accessibility_battery_level_with_estimate" msgid="4843119982547599452">"Akku bei <xliff:g id="PERCENTAGE">%1$s</xliff:g> Prozent. Bei deinem Nutzungsmuster hast du noch Strom für etwa <xliff:g id="TIME">%2$s</xliff:g>"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for accessibility_battery_level_charging (8892191177774027364) -->
- <skip />
+ <string name="accessibility_battery_level_charging" msgid="8892191177774027364">"Akku wird aufgeladen, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> Prozent."</string>
<string name="accessibility_settings_button" msgid="2197034218538913880">"Systemeinstellungen"</string>
<string name="accessibility_notifications_button" msgid="3960913924189228831">"Benachrichtigungen"</string>
<string name="accessibility_overflow_action" msgid="8555835828182509104">"Alle Benachrichtigungen ansehen"</string>
@@ -703,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Benachrichtigungen werden mit einem Ton oder einer Vibration angekündigt."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Du wirst mit einer unverankerten Verknüpfung darauf aufmerksam gemacht."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Keine kürzlich geschlossenen Bubbles"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Hier werden aktuelle und geschlossene Bubbles angezeigt."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Diese Benachrichtigungen können nicht geändert werden."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Die Benachrichtigungsgruppe kann hier nicht konfiguriert werden"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Weitergeleitete Benachrichtigung"</string>
@@ -973,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Gerätedienste"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Kein Titel"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Tippe, um die App im Vollbildmodus neu zu starten."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> öffnen"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Einstellungen für <xliff:g id="APP_NAME">%1$s</xliff:g>-Bubbles"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g>-Bubbles zulassen?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Verwalten"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Ablehnen"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Zulassen"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Später fragen"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> von <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> aus <xliff:g id="APP_NAME">%2$s</xliff:g> und <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> weiteren"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Verschieben"</string>
@@ -988,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Nach unten links verschieben"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Nach unten rechts verschieben"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Schließen"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Chats im Vordergrund behalten"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Neue <xliff:g id="APP_NAME">%1$s</xliff:g>-Chats werden als Bubbles angezeigt. Wenn du eine Bubble öffnen möchtest, tippe sie an. Wenn du sie verschieben möchtest, ziehe an ihr.\n\nTippe die Bubble an."</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tippe auf \"Verwalten\", um Bubbles für diese App zu deaktivieren"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemsteuerungseinstellungen wurden angepasst. Änderungen kannst du in den Einstellungen vornehmen."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gehe zu den Einstellungen, um die Systemsteuerung anzupassen"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
@@ -1017,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Wischen, um andere Strukturen anzuzeigen"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 27db49e..5aaa991 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Τραβά την προσοχή σας με ήχο ή δόνηση."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Κρατάει την προσοχή σας με μια κινούμενη συντόμευση προς αυτό το περιεχόμενο."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Δεν υπάρχουν πρόσφατες φούσκες"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Τα πρόσφατα συννεφάκια και τα συννεφάκια που παραβλέψατε θα εμφανίζονται εδώ."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Δεν είναι δυνατή η διαμόρφωση αυτής της ομάδας ειδοποιήσεων εδώ"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Ειδοποίηση μέσω διακομιστή μεσολάβησης"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Υπηρεσίες συσκευής"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Χωρίς τίτλο"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Πατήστε για επανεκκίνηση αυτής της εφαρμογής και ενεργοποίηση πλήρους οθόνης."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Άνοιγμα <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Ρυθμίσεις για συννεφάκια <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Να επιτρέπονται συννεφάκια από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Διαχείριση"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Όχι"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Να επιτρέπεται"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Να ερωτηθώ αργότερα"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> από <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> από την εφαρμογή <xliff:g id="APP_NAME">%2$s</xliff:g> και <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ακόμη"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Μετακίνηση"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Μετακίνηση κάτω αριστερά"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Μετακίνηση κάτω δεξιά"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Παράβλεψη"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Διατήρηση συζητήσεων στο προσκήνιο"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Οι νέες συζητήσεις από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> θα εμφανίζονται ως συννεφάκια. Πατήστε ένα συννεφάκι για άνοιγμα. Σύρετε για μετακίνηση.\n\nΠατήστε το συννεφάκι."</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Πατήστε Διαχείριση για να απενεργοποιήσετε τα συννεφάκια από αυτήν την εφαρμογή."</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Η πλοήγηση συστήματος ενημερώθηκε. Για να κάνετε αλλαγές, μεταβείτε στις Ρυθμίσεις."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Μεταβείτε στις Ρυθμίσεις για να ενημερώσετε την πλοήγηση συστήματος"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Κατάσταση αναμονής"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Σύρετε για να δείτε άλλες δομές"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 66abdf0..c6ee707 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -86,10 +86,8 @@
<string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"Try taking screenshot again"</string>
<string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Can\'t save screenshot due to limited storage space"</string>
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Taking screenshots isn\'t allowed by the app or your organisation"</string>
- <!-- no translation found for screenshot_dismiss_ui_description (934736855340147968) -->
- <skip />
- <!-- no translation found for screenshot_preview_description (669177537416980449) -->
- <skip />
+ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string>
+ <string name="screenshot_preview_description" msgid="669177537416980449">"Open screenshot"</string>
<string name="screenrecord_name" msgid="2596401223859996572">"Screen recorder"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string>
<string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string>
@@ -699,7 +697,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Gets your attention with sound or vibration."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Recent bubbles and dismissed bubbles will appear here."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"This group of notifications cannot be configured here"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Proxied notification"</string>
@@ -969,13 +968,8 @@
<string name="device_services" msgid="1549944177856658705">"Device Services"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Tap to restart this app and go full screen."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Open <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Allow bubbles from <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Manage"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Deny"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Allow"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Ask me later"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Move"</string>
@@ -984,9 +978,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Move bottom left"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Move bottom right"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Dismiss"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Keep chats up front"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"New chats from <xliff:g id="APP_NAME">%1$s</xliff:g> will appear as bubbles. Tap a bubble to open it. Drag to move it.\n\nTap the bubble"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tap Manage to turn off bubbles from this app"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
@@ -1011,6 +1013,7 @@
<string name="controls_pin_verify" msgid="414043854030774349">"Verify device PIN"</string>
<string name="controls_pin_instructions" msgid="6363309783822475238">"Enter PIN"</string>
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Swipe to see other structures"</string>
- <!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
+ <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Loading recommendations"</string>
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
<skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 6166209..6e349d6 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -86,10 +86,8 @@
<string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"Try taking screenshot again"</string>
<string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Can\'t save screenshot due to limited storage space"</string>
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Taking screenshots isn\'t allowed by the app or your organisation"</string>
- <!-- no translation found for screenshot_dismiss_ui_description (934736855340147968) -->
- <skip />
- <!-- no translation found for screenshot_preview_description (669177537416980449) -->
- <skip />
+ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string>
+ <string name="screenshot_preview_description" msgid="669177537416980449">"Open screenshot"</string>
<string name="screenrecord_name" msgid="2596401223859996572">"Screen recorder"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string>
<string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string>
@@ -699,7 +697,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Gets your attention with sound or vibration."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Recent bubbles and dismissed bubbles will appear here."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"This group of notifications cannot be configured here"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Proxied notification"</string>
@@ -969,13 +968,8 @@
<string name="device_services" msgid="1549944177856658705">"Device Services"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Tap to restart this app and go full screen."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Open <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Allow bubbles from <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Manage"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Deny"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Allow"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Ask me later"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Move"</string>
@@ -984,9 +978,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Move bottom left"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Move bottom right"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Dismiss"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Keep chats up front"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"New chats from <xliff:g id="APP_NAME">%1$s</xliff:g> will appear as bubbles. Tap a bubble to open it. Drag to move it.\n\nTap the bubble"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tap Manage to turn off bubbles from this app"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
@@ -1011,6 +1013,7 @@
<string name="controls_pin_verify" msgid="414043854030774349">"Verify device PIN"</string>
<string name="controls_pin_instructions" msgid="6363309783822475238">"Enter PIN"</string>
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Swipe to see other structures"</string>
- <!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
+ <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Loading recommendations"</string>
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
<skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 66abdf0..c6ee707 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -86,10 +86,8 @@
<string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"Try taking screenshot again"</string>
<string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Can\'t save screenshot due to limited storage space"</string>
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Taking screenshots isn\'t allowed by the app or your organisation"</string>
- <!-- no translation found for screenshot_dismiss_ui_description (934736855340147968) -->
- <skip />
- <!-- no translation found for screenshot_preview_description (669177537416980449) -->
- <skip />
+ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string>
+ <string name="screenshot_preview_description" msgid="669177537416980449">"Open screenshot"</string>
<string name="screenrecord_name" msgid="2596401223859996572">"Screen recorder"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string>
<string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string>
@@ -699,7 +697,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Gets your attention with sound or vibration."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Recent bubbles and dismissed bubbles will appear here."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"This group of notifications cannot be configured here"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Proxied notification"</string>
@@ -969,13 +968,8 @@
<string name="device_services" msgid="1549944177856658705">"Device Services"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Tap to restart this app and go full screen."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Open <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Allow bubbles from <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Manage"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Deny"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Allow"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Ask me later"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Move"</string>
@@ -984,9 +978,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Move bottom left"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Move bottom right"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Dismiss"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Keep chats up front"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"New chats from <xliff:g id="APP_NAME">%1$s</xliff:g> will appear as bubbles. Tap a bubble to open it. Drag to move it.\n\nTap the bubble"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tap Manage to turn off bubbles from this app"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
@@ -1011,6 +1013,7 @@
<string name="controls_pin_verify" msgid="414043854030774349">"Verify device PIN"</string>
<string name="controls_pin_instructions" msgid="6363309783822475238">"Enter PIN"</string>
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Swipe to see other structures"</string>
- <!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
+ <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Loading recommendations"</string>
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
<skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 66abdf0..c6ee707 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -86,10 +86,8 @@
<string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"Try taking screenshot again"</string>
<string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"Can\'t save screenshot due to limited storage space"</string>
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Taking screenshots isn\'t allowed by the app or your organisation"</string>
- <!-- no translation found for screenshot_dismiss_ui_description (934736855340147968) -->
- <skip />
- <!-- no translation found for screenshot_preview_description (669177537416980449) -->
- <skip />
+ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string>
+ <string name="screenshot_preview_description" msgid="669177537416980449">"Open screenshot"</string>
<string name="screenrecord_name" msgid="2596401223859996572">"Screen recorder"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string>
<string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string>
@@ -699,7 +697,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Gets your attention with sound or vibration."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Recent bubbles and dismissed bubbles will appear here."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"This group of notifications cannot be configured here"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Proxied notification"</string>
@@ -969,13 +968,8 @@
<string name="device_services" msgid="1549944177856658705">"Device Services"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Tap to restart this app and go full screen."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Open <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Allow bubbles from <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Manage"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Deny"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Allow"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Ask me later"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Move"</string>
@@ -984,9 +978,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Move bottom left"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Move bottom right"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Dismiss"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Keep chats up front"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"New chats from <xliff:g id="APP_NAME">%1$s</xliff:g> will appear as bubbles. Tap a bubble to open it. Drag to move it.\n\nTap the bubble"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tap Manage to turn off bubbles from this app"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
@@ -1011,6 +1013,7 @@
<string name="controls_pin_verify" msgid="414043854030774349">"Verify device PIN"</string>
<string name="controls_pin_instructions" msgid="6363309783822475238">"Enter PIN"</string>
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Swipe to see other structures"</string>
- <!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
+ <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Loading recommendations"</string>
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
<skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 7c2920b..ffee3d3 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -697,7 +697,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Gets your attention with sound or vibration."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Keeps your attention with a floating shortcut to this content."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No recent bubbles"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Recent bubbles and dismissed bubbles will appear here."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"This group of notifications cannot be configured here"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Proxied notification"</string>
@@ -967,13 +968,8 @@
<string name="device_services" msgid="1549944177856658705">"Device Services"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Tap to restart this app and go full screen."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Open <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Allow bubbles from <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Manage"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Deny"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Allow"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Ask me later"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Move"</string>
@@ -982,9 +978,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Move bottom left"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Move bottom right"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Dismiss"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Keep chats up front"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"New chats from <xliff:g id="APP_NAME">%1$s</xliff:g> will appear as bubbles. Tap a bubble to open it. Drag to move it.\n\nTap the bubble"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tap Manage to turn off bubbles from this app"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"System navigation updated. To make changes, go to Settings."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Go to Settings to update system navigation"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
@@ -1010,4 +1014,6 @@
<string name="controls_pin_instructions" msgid="6363309783822475238">"Enter PIN"</string>
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Swipe to see other structures"</string>
<string name="controls_seeding_in_progress" msgid="3033855341410264148">"Loading recommendations"</string>
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 4d56baf..b97125c 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Capta tu atención con sonido o vibración."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Retiene tu atención con un acceso directo flotante a este contenido."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hay burbujas recientes"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Las burbujas recientes y las descartadas aparecerán aquí."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"No se pueden modificar estas notificaciones."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"No se puede configurar aquí este grupo de notificaciones"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Notificación almacenada en proxy"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Servicios del dispositivo"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Sin título"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Presiona para reiniciar esta app y acceder al modo de pantalla completa."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Abrir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configuración para cuadros de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"¿Quieres permitir cuadros de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Administrar"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Denegar"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Permitir"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Preguntarme más tarde"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> y <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> más"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Mover"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Ubicar abajo a la izquierda"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Ubicar abajo a la derecha"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Ignorar"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Mantener los chats a la vista"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Los chats nuevos de <xliff:g id="APP_NAME">%1$s</xliff:g> se mostrarán como burbujas. Presiona una burbuja para abrirla. Arrástrala para moverla.\n\nPresiona la burbuja"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Presiona Administrar para desactivar las burbujas de esta app"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Se actualizó el sistema de navegación. Para hacer cambios, ve a Configuración."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ve a Configuración para actualizar la navegación del sistema"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Desliza el dedo para ver otras estructuras"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 3e35691..a9a7be2 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Llama tu atención con sonido o vibración."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Llama tu atención con un acceso directo flotante a este contenido."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hay burbujas recientes"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Las burbujas recientes y las descartadas aparecerán aquí."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificaciones no se pueden modificar."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Este grupo de notificaciones no se puede configurar aquí"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Notificación mediante proxy"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Servicios del dispositivo"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Sin título"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Toca para reiniciar esta aplicación e ir a la pantalla completa."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Abrir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Ajustes de las burbujas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"¿Quieres permitir las burbujas de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Gestionar"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Denegar"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Permitir"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Preguntarme más tarde"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> y <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> más"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Mover"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Mover abajo a la izquierda."</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Mover abajo a la derecha"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Cerrar"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Mantén los chats a la vista"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Los nuevos chats de <xliff:g id="APP_NAME">%1$s</xliff:g> se mostrarán como burbujas. Toca una burbuja para abrirla. Arrástrala para moverla.\n\nToca la burbuja"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toca Gestionar para desactivar las burbujas de esta aplicación"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Se ha actualizado la navegación del sistema. Para hacer cambios, ve a Ajustes."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ve a Ajustes para actualizar la navegación del sistema"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"En espera"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Desliza el dedo para ver otras estructuras"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 47f76f5..5c4c162 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Haarab heli või vibreerimisega teie tähelepanu."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Hoiab teie tähelepanu hõljuva otseteega selle sisu juurde."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Hiljutisi mulle pole"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Siin kuvatakse hiljutised mullid ja mullid, millest loobuti."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Neid märguandeid ei saa muuta."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Seda märguannete rühma ei saa siin seadistada"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Puhvriga märguanne"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Seadme teenused"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Pealkiri puudub"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Puudutage rakenduse taaskäivitamiseks ja täisekraanrežiimi aktiveerimiseks."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Ava <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> mullide seaded"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Kas soovite rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> mullid lubada?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Halda"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Keela"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Luba"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Küsi hiljem"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> rakendusest <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> rakenduselt <xliff:g id="APP_NAME">%2$s</xliff:g> ja veel <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Teisalda"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Teisalda alla vasakule"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Teisalda alla paremale"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Loobu"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Hoia vestlused esiplaanil"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Uued vestlused rakendusest <xliff:g id="APP_NAME">%1$s</xliff:g> kuvatakse mullidena. Selle avamiseks puudutage mulli. Teisaldamiseks lohistage.\n\nPuudutage mulli"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Selle rakenduse puhul mullide väljalülitamiseks puudutage valikut Haldamine"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Süsteemis navigeerimine on värskendatud. Muutmiseks avage jaotis Seaded."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Süsteemi navigeerimise värskendamiseks avage jaotis Seaded"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ooterežiim"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Pühkige muude üksuste nägemiseks"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 05c6069..5024e3c 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Arreta erakartzen du soinua eta dardara eginda."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Eduki honetarako lasterbide gainerakor bat eskaintzen dizu, arretarik gal ez dezazun."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ez dago azkenaldiko burbuilarik"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Azken burbuilak eta baztertutakoak agertuko dira hemen."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Jakinarazpen horiek ezin dira aldatu."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Jakinarazpen talde hau ezin da konfiguratu hemen"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Proxy bidezko jakinarazpena"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Gailuetarako zerbitzuak"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Ez du izenik"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Berrabiarazi aplikazio hau eta ezarri pantaila osoko modua."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Ireki <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren ezarpenen burbuilak"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren burbuilak erabiltzeko baimena eman nahi duzu?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Kudeatu"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Ukatu"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Baimendu"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Galdetu geroago"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>)"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> aplikazioaren \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" jakinarazpena, eta beste <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Eraman"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Eraman behealdera, ezkerretara"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Eraman behealdera, eskuinetara"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Baztertu"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Utzi txatak aurrealdean"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren txat berriak burbuila gisa agertuko dira. Burbuilak irekitzeko, saka itzazu. Mugitzeko, berriz, arrasta itzazu.\n\nSakatu burbuila"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Aplikazioaren burbuilak desaktibatzeko, sakatu Kudeatu"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Eguneratu da sistemaren nabigazioa. Aldaketak egiteko, joan Ezarpenak atalera."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistemaren nabigazioa eguneratzeko, joan Ezarpenak atalera"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Egonean"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Pasatu hatza beste egitura batzuk ikusteko"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 4e9ed57..edd844a 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"با صدا یا لرزش توجه شما را جلب میکند."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"با میانبری شناور به این محتوا، توجهتان را جلب میکند."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"هیچ ابزارک اعلان جدیدی وجود ندارد"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"ابزارکهای اعلان اخیر و ابزارکهای اعلان ردشده اینجا ظاهر خواهند شد."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"این اعلانها قابل اصلاح نیستند."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"نمیتوانید این گروه اعلانها را در اینجا پیکربندی کنید"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"اعلانهای دارای پراکسی"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"سرویسهای دستگاه"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"بدون عنوان"</string>
<string name="restart_button_description" msgid="6916116576177456480">"برای بازراهاندازی این برنامه و تغییر به حالت تمامصفحه، ضربه بزنید."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"باز کردن <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"تنظیم برای ابزارکهای اعلان <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"برای <xliff:g id="APP_NAME">%1$s</xliff:g>، ابزارکهای اعلان مجاز شوند؟"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"مدیریت"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"رد کردن"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"اجازه دادن"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"بعداً پرسیده شود"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> از <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> از <xliff:g id="APP_NAME">%2$s</xliff:g> و <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> مورد بیشتر"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"انتقال"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"انتقال به پایین سمت راست"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"انتقال به پایین سمت چپ"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"رد کردن"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"نگه داشتن گپها در جلو"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"گپهای جدید از <xliff:g id="APP_NAME">%1$s</xliff:g> بهصورت «حباب» نمایش داده میشوند. روی «حباب» ضربه بزنید تا باز شود. آن را بکشید تا جابهجا شود.\n\nروی «حباب» ضربه بزنید"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"برای خاموش کردن «حبابها» از این برنامه، روی «مدیریت» ضربه بزنید"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"پیمایش سیستم بهروزرسانی شد. برای انجام تغییرات به «تنظیمات» بروید."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"برای بهروزرسانی پیمایش سیستم، به «تنظیمات» بروید"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"آمادهبهکار"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"برای مشاهده سایر ساختارها تند بکشید"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 0eb5e54..c8165ab 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Kiinnittää huomion äänellä tai värinällä"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Kelluva sisällön pikakuvake säilyttää huomiosi"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ei viimeaikaisia ohjekuplia"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Viimeaikaiset ja äskettäin ohitetut ohjekuplat näkyvät täällä."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Näitä ilmoituksia ei voi muokata"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Tätä ilmoitusryhmää ei voi määrittää tässä"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Välitetty ilmoitus"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Laitepalvelut"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Ei nimeä"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Napauta, niin sovellus käynnistyy uudelleen ja siirtyy koko näytön tilaan."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Avaa <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Kuplien asetukset: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Sallitaanko kuplat (<xliff:g id="APP_NAME">%1$s</xliff:g>)?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Ylläpidä"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Estä"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Salli"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Kysy myöhemmin"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>: <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>) ja <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> muuta"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Siirrä"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Siirrä vasempaan alareunaan"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Siirrä oikeaan alareunaan"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Ohita"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Säilytä chatit etualalla"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Sovelluksen <xliff:g id="APP_NAME">%1$s</xliff:g> uudet chatit näkyvät ohjekuplina. Kosketa ohjekuplaa avataksesi sen. Siirrä sitä vetämällä.\n\n Kosketa ohjekuplaa."</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Valitse Hallinnoi, jos haluat poistaa ohjekuplat käytöstä tästä sovelluksesta"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Järjestelmän navigointitapa vaihdettu. Voit muuttaa sitä asetuksista."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Vaihda järjestelmän navigointitapaa asetuksista"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Virransäästötila"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Pyyhkäise, niin näet muut rakennukset"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 4f943dc..47e1d6d 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Attire votre attention à l\'aide de sons et de vibrations."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Garde votre attention à l\'aide d\'un raccourci flottant vers ce contenu."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Aucune bulle récente"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Les bulles récentes et les bulles ignorées s\'afficheront ici."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ces notifications ne peuvent pas être modifiées"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ce groupe de notifications ne peut pas être configuré ici"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Notification par mandataire"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Services de l\'appareil"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Sans titre"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Touchez pour redémarrer cette application et passer en plein écran."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Ouvrir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Paramètres pour les bulles de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Autoriser les bulles de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Gérer"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Refuser"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Autoriser"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Me demander plus tard"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> et <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> autres"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Déplacer"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Déplacer dans coin inf. gauche"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Déplacer dans coin inf. droit"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Fermer"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Garder les messages de clavardage à l\'avant"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Les nouveaux messages de clavardage de <xliff:g id="APP_NAME">%1$s</xliff:g> s\'afficheront sous forme de bulles. Pour ouvrir une bulle, touchez-la. Pour la déplacer, faites-la glisser.\n\nTouchez la bulle"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toucher Gérer pour désactiver les bulles de cette application"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"La navigation système a été mise à jour. Pour apporter des modifications, accédez au menu Paramètres."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accédez au menu Paramètres pour mettre à jour la navigation système"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Veille"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Balayez l\'écran pour voir d\'autres structures"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index c7717a3..cbc7705 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Attire votre attention à l\'aide de sons ou de vibrations."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Attire votre attention à l\'aide d\'un raccourci flottant vers ce contenu."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Aucune bulle récente"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Les bulles récentes et fermées s\'afficheront ici."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossible de modifier ces notifications."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Vous ne pouvez pas configurer ce groupe de notifications ici"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Notification de proxy"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Services pour l\'appareil"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Sans titre"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Appuyez pour redémarrer cette application et activer le mode plein écran."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Ouvrir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Paramètres des bulles de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Autoriser les bulles pour <xliff:g id="APP_NAME">%1$s</xliff:g> ?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Gérer"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Refuser"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Autoriser"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Me demander plus tard"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de l\'application <xliff:g id="APP_NAME">%2$s</xliff:g> et <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> autres"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Déplacer"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Déplacer en bas à gauche"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Déplacer en bas à droite"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Ignorer"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Accédez rapidement à vos chats"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Les nouveaux chats <xliff:g id="APP_NAME">%1$s</xliff:g> s\'afficheront sous forme de bulles. Appuyez sur une bulle pour l\'ouvrir. Faites-la glisser pour la déplacer.\n\nAppuyez sur la bulle"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Appuyez sur \"Gérer\" pour désactiver les bulles pour cette application"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigation système mise à jour. Pour apporter des modifications, accédez aux paramètres."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accédez aux paramètres pour mettre à jour la navigation système"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Mode Veille imminent"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Balayer l\'écran pour voir d\'autres structures"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 08f1e8a..3463be88 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Chama a túa atención con son ou vibración."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantén a túa atención cun atallo flotante a este contido."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Non hai burbullas recentes"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"As burbullas recentes e rexeitadas aparecerán aquí."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificacións non se poden modificar."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Aquí non se pode configurar este grupo de notificacións"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Notificación mediante proxy"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Servizos do dispositivo"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Sen título"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Toca o botón para reiniciar esta aplicación e abrila en pantalla completa."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Abre a aplicación <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configuración das burbullas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Queres permitir que se mostren as burbullas de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Xestionar"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Denegar"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Permitir"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Preguntarme máis tarde"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> e <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> máis"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Mover"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Mover á parte infer. esquerda"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Mover á parte inferior dereita"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Ignorar"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Manter os chats á vista"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Os chats novos de <xliff:g id="APP_NAME">%1$s</xliff:g> mostraranse como burbullas. Toca unha para abrila ou arrástraa para movela.\n\nToca a burbulla"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Para desactivar as burbullas nesta aplicación, toca Xestionar"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Actualizouse a navegación do sistema. Para facer cambios, vai a Configuración."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Para actualizar a navegación do sistema, vai a Configuración"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Pasar o dedo para ver outras estruturas"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 791de24..835e395 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"સાઉન્ડ અથવા વાઇબ્રેશન વિના તમારું ધ્યાન દોરે છે."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ફ્લોટિંગ શૉર્ટકટથી આ કન્ટેન્ટ પર તમારું ધ્યાન દોરી રાખે છે."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"તાજેતરના કોઈ બબલ નથી"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"એકદમ નવા બબલ અને છોડી દીધેલા બબલ અહીં દેખાશે."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"નોટિફિકેશનના આ ગ્રૂપની ગોઠવણી અહીં કરી શકાશે નહીં"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"પ્રૉક્સી નોટિફિકેશન"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"ડિવાઇસ સેવાઓ"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"કોઈ શીર્ષક નથી"</string>
<string name="restart_button_description" msgid="6916116576177456480">"આ ઍપ ફરીથી ચાલુ કરવા માટે ટૅપ કરીને પૂર્ણ સ્ક્રીન કરો."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> ખોલો"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> બબલ માટેનાં સેટિંગ"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> પરના બબલને મંજૂરી આપીએ?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"મેનેજ કરો"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"નકારો"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"મંજૂરી આપો"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"મને થોડા સમય પછી પૂછશો"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> તરફથી <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> અને વધુ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> તરફથી <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"ખસેડો"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"નીચે ડાબે ખસેડો"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"નીચે જમણે ખસેડો"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"છોડી દો"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"ચૅટને સૌથી પહેલાં રાખો"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g>ની નવી ચૅટ બબલ તરીકે દેખાશે. બબલને ખોલવા માટે તેને ટૅપ કરો. તેને ખસેડવા માટે ખેંચો.\n\nબબલને ટૅપ કરો"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"આ ઍપમાંથી બબલને બંધ કરવા માટે મેનેજ કરો પર ટૅપ કરો"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"સિસ્ટમ નૅવિગેશન અપડેટ કર્યું. ફેરફારો કરવા માટે, સેટિંગ પર જાઓ."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"સિસ્ટમ નૅવિગેશનને અપડેટ કરવા માટે સેટિંગ પર જાઓ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"સ્ટૅન્ડબાય"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"અન્ય માળખા જોવા માટે સ્વાઇપ કરો"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index c2f5c23..f06c060 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -562,8 +562,7 @@
<string name="monitoring_description_app_personal_work" msgid="6175816356939166101">"आपकी वर्क प्रोफ़ाइल का प्रबंधन <xliff:g id="ORGANIZATION">%1$s</xliff:g> करता है. प्रोफ़ाइल <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> से कनेक्ट है, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nआप <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> से भी कनेक्ट हैं, जो आपकी व्यक्तिगत नेटवर्क गतिविधि की निगरानी कर सकता है."</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent की वजह से अनलॉक रखा गया है"</string>
<string name="keyguard_indication_trust_disabled" msgid="6820793704816727918">"जब तक कि आप मैन्युअल रूप से अनलॉक नहीं करते तब तक डिवाइस लॉक रहेगा"</string>
- <!-- no translation found for keyguard_indication_trust_unlocked_plugged_in (2323452175329362855) -->
- <skip />
+ <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>
<string name="hidden_notifications_title" msgid="1782412844777612795">"सूचनाएं ज़्यादा तेज़ी से पाएं"</string>
<string name="hidden_notifications_text" msgid="5899627470450792578">" उन्हें अनलॉक किए जाने से पहले देखें"</string>
<string name="hidden_notifications_cancel" msgid="4805370226181001278">"रहने दें"</string>
@@ -700,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"आवाज़ या वाइब्रेशन होने की वजह से आपका ध्यान सूचनाओं पर जाता है."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"फ़्लोट करने वाले शॉर्टकट की मदद से इस सामग्री पर आपका ध्यान बना रहता है."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"हाल ही के बबल्स मौजूद नहीं हैं"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"हाल ही के बबल्स और हटाए गए बबल्स यहां दिखेंगे."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ये सूचनाएं नहीं बदली जा सकती हैं."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"सूचनाओं के इस समूह को यहां कॉन्फ़िगर नहीं किया जा सकता"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"प्रॉक्सी सूचना"</string>
@@ -970,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"डिवाइस सेवाएं"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"कोई शीर्षक नहीं"</string>
<string name="restart_button_description" msgid="6916116576177456480">"इस ऐप्लिकेशन को रीस्टार्ट करने और फ़ुल स्क्रीन चालू करने के लिए टैप करें."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> खोलें"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> बबल की सेटिंग"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> से बबल की अनुमति दें?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"प्रबंधित करें"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"अनुमति न दें"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"अनुमति दें"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"मुझसे बाद में पूछें"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> से <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> और <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> अन्य ऐप्लिकेशन से <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"ले जाएं"</string>
@@ -985,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"बाईं ओर सबसे नीचे ले जाएं"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"सबसे नीचे दाईं ओर ले जाएं"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"खारिज करें"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"चैट को पहले से तैयार रखें"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> की नई चैट बबल्स की तरह दिखेंगी. इसे खोलने के लिए किसी बबल पर टैप करें. इसे एक जगह से दूसरी जगह ले जाने के लिए, खींचें और छोड़ें.\n\nबबल पर टैप करें"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"इस ऐप्लिकेशन पर बबल्स को बंद करने के लिए \'प्रबंधित करें\' पर टैप करें"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"सिस्टम नेविगेशन अपडेट हो गया. बदलाव करने के लिए \'सेटिंग\' पर जाएं."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"सिस्टम नेविगेशन अपडेट करने के लिए \'सेटिंग\' में जाएं"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टैंडबाई"</string>
@@ -1005,12 +1008,9 @@
<string name="controls_favorite_subtitle" msgid="4049644994401173949">"झटपट ऐक्सेस पाने के लिए कंट्राेल चुनें"</string>
<string name="controls_favorite_load_error" msgid="2533215155804455348">"सभी कंट्रोल की सूची लोड नहीं हो सकी."</string>
<string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"अन्य"</string>
- <!-- no translation found for controls_dialog_title (8806193219278278442) -->
- <skip />
- <!-- no translation found for controls_dialog_ok (7011816381344485651) -->
- <skip />
- <!-- no translation found for controls_dialog_message (6292099631702047540) -->
- <skip />
+ <string name="controls_dialog_title" msgid="8806193219278278442">"फटाफट कंट्रोल में जोड़ें"</string>
+ <string name="controls_dialog_ok" msgid="7011816381344485651">"पसंदीदा में जोड़ें"</string>
+ <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> आपको इस कंट्रोल को अपनी पसंदीदा में जोड़ने का सुझाव देता है."</string>
<!-- no translation found for controls_pin_use_alphanumeric (8478371861023048414) -->
<skip />
<!-- no translation found for controls_pin_verify (414043854030774349) -->
@@ -1020,4 +1020,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"दूसरे स्ट्रक्चर देखने के लिए स्वाइप करें"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 4cbccd7..09b8384 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -702,7 +702,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Privlači vašu pažnju zvučnim signalima ili vibracijama."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Održava vam pozornost pomoću plutajućeg prečaca ovom sadržaju."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Ovdje će se prikazivati nedavni i odbačeni oblačići."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Te se obavijesti ne mogu izmijeniti."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ta se grupa obavijesti ne može konfigurirati ovdje"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Obavijest poslana putem proxyja"</string>
@@ -974,13 +975,8 @@
<string name="device_services" msgid="1549944177856658705">"Usluge uređaja"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Dodirnite da biste ponovo pokrenuli tu aplikaciju i prikazali je na cijelom zaslonu."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Otvorite aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Postavke za oblačiće za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Želite li dopustiti oblačiće iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Upravljanje"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Odbij"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Dopusti"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Pitaj me kasnije"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> i još <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Premjesti"</string>
@@ -989,9 +985,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Premjesti u donji lijevi kut"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Premjestite u donji desni kut"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Odbaci"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Isticanje chatova"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Novi chatovi iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g> prikazat će se kao oblačići. Dodirnite oblačić da biste ga otvorili. Povucite da biste ga premjestili.\n\nDodirnite oblačić"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Dodirnite Upravljanje da biste isključili oblačiće iz ove aplikacije"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Ažurirana je navigacija sustavom. Možete je promijeniti u Postavkama."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Navigaciju sustavom možete ažurirati u Postavkama"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje mirovanja"</string>
@@ -1019,4 +1023,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Prijeđite prstom da biste vidjeli druge strukture"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 15fb3d1..5f526fd 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Figyelemfelkeltő a hangjelzésnek és rezgésnek köszönhetően."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"A tartalomra mutató lebegő parancsikon segítségével tartja fenn az Ön figyelmét."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nincsenek buborékok a közelmúltból"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"A legutóbbi és az elvetett buborékok itt jelennek majd meg."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ezeket az értesítéseket nem lehet módosítani."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Az értesítések jelen csoportját itt nem lehet beállítani"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Továbbított értesítés"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Eszközszolgáltatások"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Nincs cím"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Koppintson az alkalmazás újraindításához és a teljes képernyős mód elindításához."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> megnyitása"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g>-buborékok beállításai"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Engedélyezi a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazásból származó buborékokat?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Kezelés"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Tiltás"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Engedélyezés"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Kérdezzen rá később"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> a(z) <xliff:g id="APP_NAME">%2$s</xliff:g> alkalmazásból és <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> további"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Áthelyezés"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Áthelyezés le és balra"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Áthelyezés le és jobbra"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Elvetés"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"A csevegések előtérben tartása"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazásból származó új csevegőüzenetek buborékként jelennek meg. A csevegés megnyitásához koppintson a buborékra. Az áthelyezéséhez húzza a buborékot a kívánt helyre.\n\nKoppintson a buborékra"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"A Kezelés gombra koppintva kapcsolhatja ki az alkalmazásból származó buborékokat"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"A rendszer-navigáció módja megváltozott. Módosításához nyissa meg a Beállításokat."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"A rendszer-navigációs lehetőségeket a Beállításokban módosíthatja"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Készenléti mód"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Csúsztasson további struktúrák megtekintéséhez"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 830f577..ef90f55 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Ծանուցումները գալիս են ձայնով կամ թրթռոցով։"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Լողացող դյուրանցման միջոցով ձեր ուշադրությունն է գրավում բովանդակության նկատմամբ"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Վերջին ամպիկներ չկան"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Այստեղ կցուցադրվեն վերջերս օգտագործված և փակված ամպիկները, որոնք կկարողանաք հեշտությամբ վերաբացել։"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Այս ծանուցումները չեն կարող փոփոխվել:"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ծանուցումների տվյալ խումբը հնարավոր չէ կարգավորել այստեղ"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Ծանուցումն ուղարկվել է պրոքսի սերվերի միջոցով"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Սարքի ծառայություններ"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Անանուն"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Հպեք՝ հավելվածը վերագործարկելու և լիաէկրան ռեժիմին անցնելու համար։"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Բացել <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ի ամպիկների կարգավորումներ"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Թույլատրե՞լ ամպիկներ <xliff:g id="APP_NAME">%1$s</xliff:g>-ից։"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Կառավարել"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Մերժել"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Թույլատրել"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Հարցնել ավելի ուշ"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>՝ <xliff:g id="APP_NAME">%2$s</xliff:g>-ից"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>` <xliff:g id="APP_NAME">%2$s</xliff:g>-ից ու ևս <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ամպիկ"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Տեղափոխել"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Տեղափոխել ներքև՝ ձախ"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Տեղափոխել ներքև՝ աջ"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Փակել"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Ցուցադրել զրույցները առջևում"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի նոր զրույցները կհայտնվեն ամպիկների տեսքով։ Հպեք ամպիկին՝ այն բացելու համար։ Քաշեք՝ այն տեղափոխելու համար։\n\nՀպեք ամպիկին"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Հպեք «Կառավարել» կոճակին՝ այս հավելվածի ամպիկներն անջատելու համար։"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Համակարգի նավիգացիան թարմացվեց: Փոփոխություններ անելու համար անցեք կարգավորումներ:"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Թարմացրեք համակարգի նավիգացիան կարգավորումներում"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Սպասման ռեժիմ"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Սահեցրեք մատը՝ այլ կառուցվածքներ տեսնելու համար"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 1cdcc18..b648d5c 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Menarik perhatian Anda dengan suara atau getaran."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Menjaga perhatian dengan pintasan floating ke konten ini."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Tidak ada balon baru-baru ini"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Balon baru-baru ini dan balon yang ditutup akan muncul di sini."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Notifikasi ini tidak dapat diubah."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Grup notifikasi ini tidak dapat dikonfigurasi di sini"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Notifikasi proxy"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Layanan Perangkat"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Tanpa judul"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Ketuk untuk memulai ulang aplikasi ini dan membuka layar penuh."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Buka <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Setelan untuk balon <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Izinkan balon dari <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Kelola"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Tolak"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Izinkan"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Nanti saja"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> dari <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> dari <xliff:g id="APP_NAME">%2$s</xliff:g> dan <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> lainnya"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Pindahkan"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Pindahkan ke kiri bawah"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Pindahkan ke kanan bawah"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Tutup"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Tampilkan chat di depan"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Chat baru dari <xliff:g id="APP_NAME">%1$s</xliff:g> akan muncul sebagai balon. Ketuk balon untuk membukanya. Tarik untuk memindahkannya.\n\nKetuk balon"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Ketuk Kelola untuk menonaktifkan balon dari aplikasi ini"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigasi sistem diupdate. Untuk melakukan perubahan, buka Setelan."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Buka Setelan untuk mengupdate navigasi sistem"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Siaga"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Geser untuk melihat struktur lainnya"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 241521c..bf347d3 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Fangar athygli þína með hljóði eða titringi."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Fangar athygli þína með fljótandi flýtileið á þetta efni."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Engar nýlegar blöðrur"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Nýlegar blöðrur og blöðrur sem þú hefur hunsað birtast hér."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ekki er hægt að breyta þessum tilkynningum."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ekki er hægt að stilla þessar tilkynningar hér"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Staðgengilstilkynning"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Tækjaþjónusta"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Enginn titill"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Ýttu til að endurræsa forritið og sýna það á öllum skjánum."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Opna <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Stillingar fyrir blöðrur frá <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Leyfa blöðrur frá <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Stjórna"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Hafna"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Leyfa"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Spyrja mig síðar"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> frá <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ frá <xliff:g id="APP_NAME">%2$s</xliff:g> og <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> í viðbót"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Færa"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Færa neðst til vinstri"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Færðu neðst til hægri"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Hunsa"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Halda spjalli fyrir framan"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Nýtt spjall úr <xliff:g id="APP_NAME">%1$s</xliff:g> birtist sem blöðrur. Ýttu á blöðru til að opna hana. Dragðu hana til að færa hana.\n\nÝttu á blöðruna"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Ýttu á „Stjórna“ til að slökkva á blöðrum frá þessu forriti"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Kerfisstjórnun uppfærð. Þú getur breytt þessu í stillingunum."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Farðu í stillingar til að uppfæra kerfisstjórnun"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Biðstaða"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Strjúktu til að sjá önnur kerfi"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 8bcd9c6..6cfd422 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Richiama la tua attenzione con suono o vibrazione."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantiene la tua attenzione con una scorciatoia mobile a questi contenuti."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nessuna bolla recente"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Le bolle recenti e ignorate verranno visualizzate qui."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossibile modificare queste notifiche."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Qui non è possibile configurare questo gruppo di notifiche"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Notifica inviata al proxy"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Servizi del dispositivo"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Senza titolo"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Tocca per riavviare l\'app e passare a schermo intero."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Apri <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Impostazioni per fumetti <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Consentire fumetti da <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Gestisci"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Rifiuta"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Consenti"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Ricordamelo più tardi"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> da <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> da <xliff:g id="APP_NAME">%2$s</xliff:g> e altre <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Sposta"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Sposta in basso a sinistra"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Sposta in basso a destra"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Ignora"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Tieni davanti le chat"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Le nuove chat da <xliff:g id="APP_NAME">%1$s</xliff:g> verranno visualizzate come bolle. Tocca una bolla per aprirla. Trascinala per spostarla.\n\nTocca la bolla"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tocca Gestisci per disattivare le bolle dall\'app"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigazione del sistema aggiornata. Per apportare modifiche, usa le Impostazioni."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Usa le Impostazioni per aggiornare la navigazione del sistema"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Scorri per vedere altre strutture"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index bfb73e1..ee43515 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -705,7 +705,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"מעוררת תשומת לב באמצעות צלילים או רטט."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"מעוררת תשומת לב באמצעות קיצור דרך צף לתוכן הזה."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"אין בועות מהזמן האחרון"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"בועות אחרונות ובועות שנסגרו יופיעו כאן."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"לא ניתן לשנות את ההתראות האלה."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"לא ניתן להגדיר כאן את קבוצת ההתראות הזו"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"התראה דרך שרת proxy"</string>
@@ -979,13 +980,8 @@
<string name="device_services" msgid="1549944177856658705">"שירותים למכשיר"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"ללא שם"</string>
<string name="restart_button_description" msgid="6916116576177456480">"צריך להקיש כדי להפעיל מחדש את האפליקציה הזו ולעבור למסך מלא."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"לפתיחת <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"הגדרות בשביל בועות של <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"להתיר ל-<xliff:g id="APP_NAME">%1$s</xliff:g> להציג בועות?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"ניהול"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"אני לא מרשה"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"כן, זה בסדר"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"אחליט מאוחר יותר"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> מהאפליקציה <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> מ-<xliff:g id="APP_NAME">%2$s</xliff:g> ועוד <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"העברה"</string>
@@ -994,9 +990,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"העברה לפינה השמאלית התחתונה"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"העברה לפינה הימנית התחתונה"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"סגירה"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"הצ\'אטים תמיד יוצגו מלפנים"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"צ\'אטים חדשים מאפליקציית <xliff:g id="APP_NAME">%1$s</xliff:g> יוצגו כבועות. יש להקיש על בועה כדי לפתוח אותה. יש לגרור אותה כדי להזיז אותה.\n\nיש להקיש על הבועה"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"יש להקיש על \'ניהול\' כדי להשבית את הבועות מהאפליקציה הזו"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"הניווט במערכת עודכן. אפשר לערוך שינויים דרך ההגדרות."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"יש לעבור להגדרות כדי לעדכן את הניווט במערכת"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"המתנה"</string>
@@ -1025,4 +1029,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"יש להחליק כדי לראות מבנים אחרים"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 7734953..92870ee 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"音やバイブレーションで通知をお知らせします。"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"このコンテンツのフローティング ショートカットで通知をお知らせします。"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近閉じたふきだしはありません"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"最近表示されたふきだしや閉じたふきだしが、ここに表示されます。"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"これらの通知は変更できません。"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"このグループの通知はここでは設定できません"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"代理通知"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"デバイス サービス"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"タイトルなし"</string>
<string name="restart_button_description" msgid="6916116576177456480">"タップしてこのアプリを再起動すると、全画面表示になります。"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> を開く"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> のふきだしの設定"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> のふきだしを許可しますか?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"拒否"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"許可"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"後で確認"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>(<xliff:g id="APP_NAME">%2$s</xliff:g>)"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>(<xliff:g id="APP_NAME">%2$s</xliff:g>)、他 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 件"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"移動"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"左下に移動"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"右下に移動"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"閉じる"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"チャットを常に前面に表示"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> からの新しいチャットがバブルとして表示されます。バブルをタップするとチャットが表示されます。ドラッグすると移動します。\n\nバブルをタップしてください"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"このアプリからのバブルをオフにするには、[管理] をタップしてください"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"システム ナビゲーションを更新しました。変更するには [設定] に移動してください。"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"システム ナビゲーションを更新するには [設定] に移動してください"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"スタンバイ"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"スワイプすると他の構造が表示されます"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 68201a1..35fd748 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"იპყრობს თქვენს ყურადღებას ხმით ან ვიბრაციით."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"იპყრობს თქვენს ყურადღებას ამ კონტენტის მოლივლივე მალსახმობით."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ბოლო დროს გამოყენებული ბუშტები არ არის"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"აქ გამოჩნდება ბოლოდროინდელი ბუშტები და უარყოფილი ბუშტები."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ამ შეტყობინებების შეცვლა შეუძლებელია."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"შეტყობინებების ამ ჯგუფის კონფიგურირება აქ შეუძლებელია"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"პროქსირებული შეტყობინება"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"მოწყობილობის სერვისები"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"უსათაურო"</string>
<string name="restart_button_description" msgid="6916116576177456480">"შეეხეთ ამ აპის გადასატვირთად და გადადით სრულ ეკრანზე."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ის გახსნა"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"პარამეტრები <xliff:g id="APP_NAME">%1$s</xliff:g> ბუშტებისთვის"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"დაიშვას ბუშტები <xliff:g id="APP_NAME">%1$s</xliff:g>-დან?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"მართვა"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"უარყოფა"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"დაშვება"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"მოგვიანებით მკითხეთ"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> <xliff:g id="APP_NAME">%2$s</xliff:g>-ისგან"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> <xliff:g id="APP_NAME">%2$s</xliff:g>-დან და კიდევ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"გადატანა"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"ქვევით და მარცხნივ გადატანა"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"გადაანაცვ. ქვემოთ და მარჯვნივ"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"დახურვა"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"ჩეთები წინ იყოს"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ის ახალი ჩეთები ბუშტების სახით გამოჩნდება. გასახსნელად შეეხეთ ბუშტს. გადასატანად ჩაავლეთ.\n\nშეეხეთ ბუშტს"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"ამ აპის ბუშტების გამოსართავად შეეხეთ „მართვას“"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"სისტემური ნავიგაცია განახლდა. ცვლილებების შესატანად გადადით პარამეტრებზე."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"სისტემური ნავიგაციის გასაახლებლად გადადით პარამეტრებზე"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"მოლოდინის რეჟიმი"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"გადაფურცლეთ სხვა სტრუქტურების სანახავად"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 206bfa1..394902b 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Хабарландырулар келгенде, дыбыс шығады не дірілдейді"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Осы мазмұнға бекітілген қалқымалы таңбашамен назарыңызды өзіне тартады."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Жақындағы қалқымалы анықтамалар жоқ"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Жақында ашылған және жабылған қалқымалы анықтамалар осы жерде пайда болады."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Бұл хабарландыруларды өзгерту мүмкін емес."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Мұндай хабарландырулар бұл жерде конфигурацияланбайды."</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Прокси-сервер арқылы жіберілген хабарландыру"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Құрылғы қызметтері"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Атауы жоқ"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Бұл қолданбаны қайта қосып, толық экранға өту үшін түртіңіз."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасын ашу"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> қалқымалы анықтамаларының параметрлері"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасының қалқымалы анықтамаларына рұқсат етілсін бе?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Басқару"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Тыйым салу"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Рұқсат беру"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Кейінірек сұралсын"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> жіберген хабарландыру: <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> қолданбасы жіберген <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> және тағы <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Жылжыту"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Төменгі сол жаққа жылжыту"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Төменгі оң жаққа жылжыту"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Жабу"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Чаттарды жоғары жақтан көрсету"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасындағы жаңа чаттар қалқымалы анықтамалар түрінде шығады. Қалқымалы анықтаманы ашу үшін оны түртіңіз. Оны сүйреп жылжытыңыз.\n\nҚалқымалы анықтаманы түртіңіз."</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Бұл қолданбадан қалқымалы анықтамаларды өшіру үшін \"Басқару\" түймесін түртіңіз."</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Жүйе навигациясы жаңартылды. Өзгерту енгізу үшін \"Параметрлер\" бөліміне өтіңіз."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Жүйе навигациясын жаңарту үшін \"Параметрлер\" бөліміне өтіңіз."</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Күту режимі"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Басқа құрылғыларды көру үшін экранды сырғытыңыз."</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 673aac3..ecb5ffa 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"ធ្វើឱ្យអ្នកចាប់អារម្មណ៍តាមរយៈសំឡេង ឬការញ័រ។"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ធ្វើឱ្យអ្នកចាប់អារម្មណ៍ដោយប្រើផ្លូវកាត់អណ្ដែតសម្រាប់ខ្លឹមសារនេះ។"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"មិនមានសារលេចឡើងថ្មីៗទេ"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"សារលេចឡើងដែលបានច្រានចោល និងសារលេចឡើងថ្មីៗនឹងបង្ហាញនៅទីនេះ។"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"មិនអាចកែប្រែការជូនដំណឹងទាំងនេះបានទេ។"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"មិនអាចកំណត់រចនាសម្ព័ន្ធក្រុមការជូនដំណឹងនេះនៅទីនេះបានទេ"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"ការជូនដំណឹងជាប្រូកស៊ី"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"សេវាកម្មឧបករណ៍"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"គ្មានចំណងជើង"</string>
<string name="restart_button_description" msgid="6916116576177456480">"ចុចដើម្បីចាប់ផ្ដើមកម្មវិធីនេះឡើងវិញ រួចចូលប្រើពេញអេក្រង់។"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"បើក <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"ការកំណត់សម្រាប់សារលេចឡើង <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"អនុញ្ញាតសារលេចឡើងពី <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"គ្រប់គ្រង"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"បដិសេធ"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"អនុញ្ញាត"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"សួរខ្ញុំនៅពេលក្រោយ"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ពី <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ពី <xliff:g id="APP_NAME">%2$s</xliff:g> និង <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ទៀត"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"ផ្លាស់ទី"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"ផ្លាស់ទីទៅផ្នែកខាងក្រោមខាងឆ្វេង"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"ផ្លាស់ទីទៅផ្នែកខាងក្រោមខាងស្ដាំ"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"ច្រានចោល"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"រក្សាទុកការជជែកនៅផ្នែកខាងមុខ"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"ការជជែកថ្មីៗពី <xliff:g id="APP_NAME">%1$s</xliff:g> នឹងបង្ហាញជាសារលេចឡើង។ ចុចសារលេចឡើង ដើម្បីបើកវា។ អូសដើម្បីផ្លាស់ទីសារលេចឡើងនេះ។\n\nចុចសារលេចឡើងនេះ"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"ចុច \"គ្រប់គ្រង\" ដើម្បីបិទសារលេចឡើងពីកម្មវិធីនេះ"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"បានធ្វើបច្ចុប្បន្នភាពការរុករកក្នុងប្រព័ន្ធ។ ដើម្បីធ្វើការផ្លាស់ប្ដូរ សូមចូលទៅកាន់ការកំណត់។"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ចូលទៅកាន់ការកំណត់ ដើម្បីធ្វើបច្ចុប្បន្នភាពការរុករកក្នុងប្រព័ន្ធ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ផ្អាកដំណើរការ"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"អូសដើម្បីមើលរចនាសម្ព័ន្ធផ្សេងទៀត"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 81b6d99..8bc6fbb 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"ಧ್ವನಿ ಅಥವಾ ವೈಬ್ರೇಷನ್ ಮೂಲಕ ನಿಮ್ಮ ಗಮನವನ್ನು ಸೆಳೆಯುತ್ತದೆ."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ಈ ವಿಷಯಕ್ಕೆ ಲಿಂಕ್ ಮಾಡಿ ಕೊಂಡೊಯ್ಯುವ ಶಾರ್ಟ್ಕಟ್ ಕಡೆಗೆ ಗಮನ ಇರಿಸಿ."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಬಬಲ್ಗಳಿಲ್ಲ"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"ಇತ್ತೀಚಿನ ಬಬಲ್ಗಳು ಮತ್ತು ವಜಾಗೊಳಿಸಿದ ಬಬಲ್ಗಳು ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"ಈ ಗುಂಪಿನ ಅಧಿಸೂಚನೆಗಳನ್ನು ಇಲ್ಲಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿರುವುದಿಲ್ಲ"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"ಪ್ರಾಕ್ಸಿ ಮಾಡಿದ ಅಧಿಸೂಚನೆಗಳು"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"ಸಾಧನ ಸೇವೆಗಳು"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"ಯಾವುದೇ ಶೀರ್ಷಿಕೆಯಿಲ್ಲ"</string>
<string name="restart_button_description" msgid="6916116576177456480">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲು ಮತ್ತು ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಅನ್ನು ತೆರೆಯಿರಿ"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಬಬಲ್ಗಳಿಗಾಗಿ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್ನ ಬಬಲ್ಗಳನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"ನಿರ್ವಹಿಸಿ"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"ನಿರಾಕರಿಸಿ"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"ಅನುಮತಿಸಿ"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"ನನ್ನನ್ನು ಆನಂತರ ಕೇಳಿ"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> ಆ್ಯಪ್ನ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> ಮತ್ತು <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ಹೆಚ್ಚಿನವುಗಳ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"ಸರಿಸಿ"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"ಸ್ಕ್ರೀನ್ನ ಎಡ ಕೆಳಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"ಕೆಳಗಿನ ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"ವಜಾಗೊಳಿಸಿ"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"ಚಾಟ್ಗಳನ್ನು ಮುಂಚೂಣಿಯಲ್ಲಿಡಿ"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಂದ ಹೊಸ ಚಾಟ್ಗಳು ಬಬಲ್ಗಳಾಗಿ ಕಾಣಿಸುತ್ತದೆ. ಅದನ್ನು ತೆರೆಯಲು ಬಬಲ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ. ಅದನ್ನು ಸರಿಸಲು ಡ್ರ್ಯಾಗ್ ಮಾಡಿ.\n\nಬಬಲ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"ಈ ಆ್ಯಪ್ನಿಂದ ಬಬಲ್ಗಳನ್ನು ಆಫ್ ಮಾಡಲು ನಿರ್ವಹಿಸಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಲು, ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಷನ್ ಅಪ್ಡೇಟ್ ಮಾಡಲು ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ಸ್ಟ್ಯಾಂಡ್ಬೈ"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"ಇತರ ರಚನೆಗಳನ್ನು ನೋಡಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 0abe5e0a..73cdbf4 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"소리나 진동으로 알립니다."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"이 콘텐츠로 연결되는 플로팅 바로가기로 사용자의 주의를 끕니다."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"최근에 닫은 도움말 풍선 없음"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"최근 버블과 내가 닫은 버블이 여기 표시됩니다."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"이 알림은 수정할 수 없습니다."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"이 알림 그룹은 여기에서 설정할 수 없습니다."</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"프록시를 통한 알림"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"기기 서비스"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"제목 없음"</string>
<string name="restart_button_description" msgid="6916116576177456480">"탭하여 이 앱을 다시 시작하고 전체 화면으로 이동합니다."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> 열기"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> 알림 풍선 설정"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 알림 풍선을 허용하시겠습니까?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"관리"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"거부"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"허용"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"나중에 알림"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>의 <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> 외 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>개의 <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"이동"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"왼쪽 하단으로 이동"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"오른쪽 하단으로 이동"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"닫기"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"채팅을 항상 상단에 표시"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 새로운 채팅이 버블로 표시됩니다. 버블을 열려면 탭하세요. 버블을 이동하려면 드래그하세요.\n\n버블을 탭하세요."</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"이 앱에서 버블을 사용 중지하려면 관리를 탭하세요."</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"시스템 탐색이 업데이트되었습니다. 변경하려면 설정으로 이동하세요."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"설정으로 이동하여 시스템 탐색을 업데이트하세요."</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"대기"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"다른 구조를 보려면 스와이프하세요."</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 7ab9680..074063b 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Билдирүүдөн үн чыгат же дирилдейт."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Калкыма ыкчам баскыч менен көңүлүңүздү бул мазмунга буруп турат."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Акыркы калкып чыкма билдирмелер жок"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Кайра жөнөтүлгөн жана жабылган калкып чыкма билдирмелер ушул жерде көрүнөт."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Бул билдирмелерди өзгөртүүгө болбойт."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Бул билдирмелердин тобун бул жерде конфигурациялоого болбойт"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Прокси билдирмеси"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Түзмөк кызматтары"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Аталышы жок"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Бул колдонмону өчүрүп күйгүзүп, толук экранга өтүү үчүн таптап коюңуз."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосун ачуу"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> көбүктөрүнүн жөндөөлөрү"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунун калкып чыкма билдирмелерине уруксат бересизби?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Башкаруу"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Тыюу салынат"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Уруксат берүү"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Кийинчерээк суралсын"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> колдонмосунан <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> жана дагы <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> колдонмодон <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Жылдыруу"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Төмөнкү сол жакка жылдыруу"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Төмөнкү оң жакка жылдырыңыз"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Жабуу"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Маектерди ар дайым көрүп туруңуз"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосундагы жаңы маектер калкып чыкма билдирмелер түрүндө көрүнөт. Аны ачуу үчүн калкып чыкма билдирмени таптап коюңуз. Аны сүйрөп жылдырыңыз.\n\nКалкып чыкма билдирмени таптап коюңуз"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Бул колдонмодогу калкып чыкма билдирмелерди өчүрүү үчүн \"Башкарууну\" басыңыз"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Тутум чабыттоосу жаңырды. Өзгөртүү үчүн, Жөндөөлөргө өтүңүз."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Тутум чабыттоосун жаңыртуу үчүн Жөндөөлөргө өтүңүз"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Көшүү режими"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Башка структураларды көрүү үчүн экранды сүрүңүз"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 8124585..64632dc 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"ດຶງຄວາມສົນໃຈຂອງທ່ານດ້ວຍສຽງ ຫຼື ການສັ່ນເຕືອນ."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ເອົາໃຈໃສ່ທາງລັດແບບລອຍໄປຫາເນື້ອຫານີ້."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ບໍ່ມີ bubble ຫຼ້າສຸດ"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Bubbles ຫຼ້າສຸດ ແລະ Bubbles ທີ່ປິດໄປຈະປາກົດຢູ່ບ່ອນນີ້."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"ບໍ່ສາມາດຕັ້ງຄ່າກຸ່ມການແຈ້ງເຕືອນນີ້ຢູ່ບ່ອນນີ້ໄດ້"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"ການແຈ້ງເຕືອນແບບພຣັອກຊີ"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"ບໍລິການອຸປະກອນ"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"ບໍ່ມີຊື່"</string>
<string name="restart_button_description" msgid="6916116576177456480">"ແຕະເພື່ອຣີສະຕາດແອັບນີ້ ແລະ ໃຊ້ແບບເຕັມຈໍ."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"ເປີດ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"ການຕັ້ງຄ່າສຳລັບ bubble <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"ອະນຸຍາດໃຫ້ມີ bubbles ຈາກ <xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"ຈັດການ"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"ປະຕິເສດ"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"ອະນຸຍາດ"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"ຖາມຂ້ອຍໃນພາຍຫຼັງ"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ຈາກ <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ຈາກ <xliff:g id="APP_NAME">%2$s</xliff:g> ແລະ ອີກ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"ຍ້າຍ"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"ຍ້າຍຊ້າຍລຸ່ມ"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"ຍ້າຍຂວາລຸ່ມ"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"ປິດໄວ້"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"ສະແດງການສົນທະນາໄວ້ໜ້າສະເໝີ"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"ການສົນທະນາໃໝ່ຈາກ <xliff:g id="APP_NAME">%1$s</xliff:g> ຈະປາກົດເປັນ bubble. ແຕະໃສ່ bubble ເພື່ອເປີດມັນ ລາກເພື່ອເປີດມັນ.\n\nແຕະໃສ່ bubble"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"ແຕະຈັດການເພື່ອປິດ bubble ຈາກແອັບນີ້"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ອັບເດດການນຳທາງລະບົບແລ້ວ. ເພື່ອປ່ຽນແປງ, ກະລຸນາໄປທີ່ການຕັ້ງຄ່າ."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ໄປທີ່ການຕັ້ງຄ່າເພື່ອອັບເດດການນຳທາງລະບົບ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ສະແຕນບາຍ"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"ປັດເພື່ອເບິ່ງໂຄງສ້າງອື່ນ"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index d5f166b..5f22d16 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -705,7 +705,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Atkreipia dėmesį garsu arba vibravimu."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Naudojant slankųjį spartųjį klavišą lengviau sutelkti dėmesį į šį turinį."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nėra naujausių debesėlių"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Naujausi ir atmesti debesėliai bus rodomi čia."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Šių pranešimų keisti negalima."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Šios grupės pranešimai čia nekonfigūruojami"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Per tarpinį serverį gautas pranešimas"</string>
@@ -979,13 +980,8 @@
<string name="device_services" msgid="1549944177856658705">"Įrenginio paslaugos"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Nėra pavadinimo"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Palieskite, kad paleistumėte iš naujo šią programą arba įjungtumėte viso ekrano režimą."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Atidaryti „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ debesėlių nustatymai"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Leisti programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ debesėlius?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Tvarkyti"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Atmesti"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Leisti"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Paklausti vėliau"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ iš „<xliff:g id="APP_NAME">%2$s</xliff:g>“"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ iš „<xliff:g id="APP_NAME">%2$s</xliff:g>“ ir dar <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Perkelti"</string>
@@ -994,9 +990,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Perkelti į apačią kairėje"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Perkelti į apačią dešinėje"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Atmesti"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Rodyti pokalbius priekyje"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Nauji pokalbiai iš programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ bus rodomi kaip debesėliai. Palieskite debesėlį, kad jį atidarytumėte. Nuvilkite, kad perkeltumėte.\n\nPalieskite debesėlį"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Palieskite „Tvarkyti“, kad išjungtumėte debesėlius šioje programoje"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistemos naršymo funkcijos atnaujintos. Jei norite pakeisti, eikite į skiltį „Nustatymai“."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Eikite į skiltį „Nustatymai“, kad atnaujintumėte sistemos naršymo funkcijas"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Budėjimo laikas"</string>
@@ -1025,4 +1029,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Perbraukite, kad peržiūrėtumėte kitas struktūras"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 2235796..2dd7500 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -702,7 +702,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Jūsu uzmanība tiek piesaistīta ar skaņas vai vibrācijas signālu."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Piesaista jūsu uzmanību, rādot peldošu saīsni uz šo saturu."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nav nesen aizvērtu burbuļu"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Šeit būs redzami nesen rādītie burbuļi un aizvērtie burbuļi."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Šos paziņojumus nevar modificēt."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Šeit nevar konfigurēt šo paziņojumu grupu."</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Starpniekservera paziņojums"</string>
@@ -974,13 +975,8 @@
<string name="device_services" msgid="1549944177856658705">"Ierīces pakalpojumi"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Nav nosaukuma"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Pieskarieties, lai restartētu šo lietotni un pārietu pilnekrāna režīmā."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Atvērt lietotni <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> burbuļu iestatījumi"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Vai atļaut burbuļus no lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Pārvaldīt"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Neatļaut"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Atļaut"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Pajautāt vēlāk"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> no: <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> no lietotnes “<xliff:g id="APP_NAME">%2$s</xliff:g>” un vēl <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Pārvietot"</string>
@@ -989,9 +985,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Pārvietot apakšpusē pa kreisi"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Pārvietot apakšpusē pa labi"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Nerādīt"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Sarunas priekšplānā"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Jaunas sarunas no lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> tiks parādītas kā burbuļi. Pieskarieties kādam burbulim, lai to atvērtu. Velciet, lai to pārvietotu.\n\nPieskarieties burbulim."</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Pieskarieties pogai “Pārvaldīt”, lai izslēgtu burbuļus no šīs lietotnes."</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistēmas navigācija ir atjaunināta. Lai veiktu izmaiņas, atveriet iestatījumus."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Atveriet iestatījumus, lai atjauninātu sistēmas navigāciju"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Gaidstāve"</string>
@@ -1019,4 +1023,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Velciet, lai skatītu citas struktūras"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 4a67a19..02eadae 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Ви го привлекува вниманието со звук или вибрации."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Ви го задржува вниманието со лебдечка кратенка на содржинава."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нема неодамнешни балончиња"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Неодамнешните и отфрлените балончиња ќе се појавуваат тука."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Овие известувања не може да се изменат"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Оваа група известувања не може да се конфигурира тука"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Известување преку прокси"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Услуги за уредот"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Без наслов"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Допрете за да ја рестартирате апликацијава и да ја отворите на цел екран."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Отворете ја <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Поставки за баланчињата на <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Да се дозволат балончиња од <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Управување"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Одбиј"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Дозволи"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Прашај ме подоцна"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> од <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> од <xliff:g id="APP_NAME">%2$s</xliff:g> и уште <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Премести"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Премести долу лево"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Премести долу десно"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Отфрли"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Разговорите нека ви бидат во преден план"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Новите разговори од <xliff:g id="APP_NAME">%1$s</xliff:g> ќе се појавуваат како балончиња. Допрете балонче за да го отворите. Повлечете за да го преместите.\n\nДопрете на балончето"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Допрете „Управувајте“ за да ги исклучите балончињата од апликацијава"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навигацијата на системот е ажурирана. За да извршите промени, одете во „Поставки“."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Одете во „Поставки“ за да ја ажурирате навигацијата на системот"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Подготвеност"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Повлечете за да видите други структури"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 7311242..c4f75c5 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"ശബ്ദമോ വെെബ്രേഷനോ ഉപയോഗിച്ച് നിങ്ങളുടെ ശ്രദ്ധ ക്ഷണിക്കുന്നു."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ഈ ഉള്ളടക്കത്തിലേക്ക് ഒരു ഫ്ലോട്ടിംഗ് കുറുക്കുവഴി ഉപയോഗിച്ച് നിങ്ങളുടെ ശ്രദ്ധ നിലനിർത്തുന്നു."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"അടുത്തിടെയുള്ള ബബിളുകൾ ഒന്നുമില്ല"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"അടുത്തിടെയുള്ള Bubbles-ഉം ഡിസ്മിസ് ചെയ്ത Bubbles-ഉം ഇവിടെ ദൃശ്യമാവും."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"അറിയിപ്പുകളുടെ ഈ ഗ്രൂപ്പ് ഇവിടെ കോണ്ഫിഗര് ചെയ്യാൻ കഴിയില്ല"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"പ്രോക്സി അറിയിപ്പ്"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"ഉപകരണ സേവനങ്ങള്"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"പേരില്ല"</string>
<string name="restart_button_description" msgid="6916116576177456480">"ഈ ആപ്പ് റീസ്റ്റാർട്ട് ചെയ്യാനും പൂർണ്ണ സ്ക്രീനാവാനും ടാപ്പ് ചെയ്യുക."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> തുറക്കുക"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിനുള്ള ബബിളുകളുടെ ക്രമീകരണം"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ൽ നിന്നും ബബിളുകളെ അനുവദിക്കണോ?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"മാനേജ് ചെയ്യുക"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"നിരസിക്കുക"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"അനുവദിക്കുക"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"എന്നോട് പിന്നീട് ചോദിക്കുക"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>-ൽ നിന്നുള്ള <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> എന്നതിൽ നിന്നുള്ള <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> കൂടുതലും"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"നീക്കുക"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"ചുവടെ ഇടതുഭാഗത്തേക്ക് നീക്കുക"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"ചുവടെ വലതുഭാഗത്തേക്ക് നീക്കുക"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"ഡിസ്മിസ് ചെയ്യുക"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"ചാറ്റുകൾ ഏറ്റവും ആദ്യം കാണുന്ന രീതിയിൽ വയ്ക്കുക"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിൽ നിന്നുള്ള പുതിയ ചാറ്റുകൾ ബബിളുകളായി ദൃശ്യമാവും. ഇത് തുറക്കാൻ ബബിൾ ടാപ്പ് ചെയ്യുക. ഇത് നീക്കാൻ വലിച്ചിടുക.\n\nബബിൾ ടാപ്പ് ചെയ്യുക"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"ഈ ആപ്പിൽ നിന്നുള്ള ബബിളുകൾ ഓഫാക്കാൻ \'മാനേജ് ചെയ്യുക\' ടാപ്പ് ചെയ്യുക"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"സിസ്റ്റം നാവിഗേഷൻ അപ്ഡേറ്റ് ചെയ്തു. മാറ്റങ്ങൾ വരുത്താൻ ക്രമീകരണത്തിലേക്ക് പോവുക."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"സിസ്റ്റം നാവിഗേഷൻ അപ്ഡേറ്റ് ചെയ്യാൻ ക്രമീകരണത്തിലേക്ക് പോവുക"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"സ്റ്റാൻഡ്ബൈ"</string>
@@ -1010,8 +1014,9 @@
<string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"പിന്നിൽ അക്ഷരങ്ങളോ ചിഹ്നങ്ങളോ അടങ്ങിയിരിക്കുന്നു"</string>
<string name="controls_pin_verify" msgid="414043854030774349">"ഉപകരണ പിൻ പരിശോധിച്ചുറപ്പിക്കൂ"</string>
<string name="controls_pin_instructions" msgid="6363309783822475238">"പിൻ നൽകുക"</string>
- <!-- no translation found for controls_structure_tooltip (1392966215435667434) -->
- <skip />
+ <string name="controls_structure_tooltip" msgid="1392966215435667434">"മറ്റ് ഘടനകൾ കാണാൻ സ്വൈപ്പ് ചെയ്യുക"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index eaf782c..3e0db6b 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Дуу эсвэл чичиргээгүйгээр таны анхаарлыг татна."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Энэ контентын хөвөн гарч ирэх товчлолтойгоор таны анхаарлыг татдаг."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Саяхны бөмбөлөг алга байна"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Саяхны бөмбөлгүүд болон үл хэрэгссэн бөмбөлгүүд энд харагдана."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Эдгээр мэдэгдлийг өөрчлөх боломжгүй."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Энэ бүлэг мэдэгдлийг энд тохируулах боломжгүй байна"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Прокси хийсэн мэдэгдэл"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Төхөөрөмжийн үйлчилгээ"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Гарчиггүй"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Энэ аппыг дахин эхлүүлж, бүтэн дэлгэцэд орохын тулд товшино уу."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g>-г нээх"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н хөөсний тохиргоо"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н хөөсийг зөвшөөрөх үү?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Удирдах"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Татгалзах"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Зөвшөөрөх"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Надаас дараа асуу"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>-н <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g>-н <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> болон бусад <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Зөөх"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Зүүн доош зөөх"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Баруун доош зөөх"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Үл хэрэгсэх"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Чатуудыг дэлгэцийн дээд талд байлгах"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н шинэ чатууд нь бөмбөлөг маягаар харагдана. Бөмбөлгийг нээхийн тулд түүнийг товшино уу. Түүнийг зөөхийн тулд чирнэ үү.\n\nБөмбөлгийг товшино уу"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Энэ аппын бөмбөлгүүдийг унтраахын тулд Удирдах дээр товшино уу"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Системийн навигацыг шинэчиллээ. Өөрчлөхийн тулд Тохиргоо руу очно уу."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Системийн навигацыг шинэчлэхийн тулд Тохиргоо руу очно уу"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Зогсолтын горим"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Бусад бүтцийг харахын тулд шударна уу"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index d9deb35..115ff9a 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"आवाज किंवा व्हायब्रेशनने तुमचे लक्ष वेधून घेते."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"या आशयाच्या फ्लोटिंग शॉर्टकटसह तुमचे लक्ष केंद्रित करते."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"अलीकडील कोणतेही बबल नाहीत"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"अलीकडील बबल आणि डिसमिस केलेले बबल येथे दिसतील."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"या सूचनांचा संच येथे कॉन्फिगर केला जाऊ शकत नाही"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"प्रॉक्सी केलेल्या सूचना"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"डिव्हाइस सेवा"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक नाही"</string>
<string name="restart_button_description" msgid="6916116576177456480">"हे अॅप रीस्टार्ट करण्यासाठी आणि फुल स्क्रीन करण्यासाठी टॅप करा."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> उघडा"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> बबलसाठी सेटिंग्ज"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> वरील बबलना अनुमती द्यायची?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"व्यवस्थापित करा"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"नाकारा"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"अनुमती द्या"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"मला नंतर विचारा"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> कडून <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> आणि आणखी <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> कडून <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"हलवा"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"तळाशी डावीकडे हलवा"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"तळाशी उजवीकडे हलवा"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"डिसमिस करा"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"चॅट दिसतील असे ठेवा"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> वरील नवीन चॅट बुडबुडे म्हणून दिसतील. बुडबुडे उघडण्यासाठी त्यावर टॅप करा. तो हलवण्यासाठी ड्रॅग करा.\n\nबुडबुड्यावर टॅप करा"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"या अॅपमधून बुडबुडे बंद करण्यासाठी व्यवस्थापित करा वर टॅप करा"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"सिस्टम नेव्हिगेशन अपडेट केले. बदल करण्यासाठी, सेटिंग्जवर जा."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"सिस्टम नेव्हिगेशन अपडेट करण्यासाठी सेटिंग्जवर जा"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्टँडबाय"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"इतर संरचना पाहण्यासाठी स्वाइप करा"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 9e4d442..5c55090 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Menarik perhatian anda dengan bunyi atau getaran."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Memastikan anda memberikan perhatian dengan pintasan terapung ke kandungan ini."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Tiada gelembung terbaharu"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Gelembung baharu dan gelembung yang diketepikan akan dipaparkan di sini."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Pemberitahuan ini tidak boleh diubah suai."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Kumpulan pemberitahuan ini tidak boleh dikonfigurasikan di sini"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Pemberitahuan berproksi"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Perkhidmatan Peranti"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Tiada tajuk"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Ketik untuk memulakan semula apl ini dan menggunakan skrin penuh."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Buka <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Tetapan untuk gelembung <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Benarkan gelembung daripada <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Urus"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Tolak"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Benarkan"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Tanya saya kemudian"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> daripada <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> daripada <xliff:g id="APP_NAME">%2$s</xliff:g> dan <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> lagi"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Alih"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Alihkan ke bawah sebelah kiri"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Alihkan ke bawah sebelah kanan"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Ketepikan"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Pastikan sembang sentiasa di hadapan"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Sembang baharu daripada <xliff:g id="APP_NAME">%1$s</xliff:g> akan dipaparkan sebagai gelembung. Ketik gelembung untuk membuka. Seret untuk mengalihkan gelembung.\n\nKetik gelembung itu"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Ketik Urus untuk mematikan gelembung daripada apl ini"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigasi sistem dikemas kini. Untuk membuat perubahan, pergi ke Tetapan."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Pergi ke Tetapan untuk mengemas kini navigasi sistem"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tunggu sedia"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Leret untuk melihat struktur lain"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index d814b1c5..34f7a46 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"အသံ သို့မဟုတ် တုန်ခါမှုဖြင့် အာရုံစိုက်လာအောင် ပြုလုပ်သည်။"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"အကြောင်းအရာကို floating shortcut ကိုသုံး၍ အာရုံစိုက်လာအောင်လုပ်ပါ။"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"မကြာမီက ပူဖောင်းကွက်များ မရှိပါ"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"လတ်တလော ပူဖောင်းကွက်များနှင့် ပိတ်လိုက်သော ပူဖောင်းကွက်များသည် ဤနေရာတွင် ပေါ်ပါမည်။"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"ဤအကြောင်းကြားချက်အုပ်စုကို ဤနေရာတွင် စီစဉ်သတ်မှတ်၍ မရပါ"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"ပရောက်စီထည့်ထားသော အကြောင်းကြားချက်"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"စက်ပစ္စည်းဝန်ဆောင်မှုများ"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"ခေါင်းစဉ် မရှိပါ"</string>
<string name="restart_button_description" msgid="6916116576177456480">"ဤအက်ပ်ကို ပြန်စတင်ပြီး မျက်နှာပြင်အပြည့်လုပ်ရန် တို့ပါ။"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> ကိုဖွင့်ရန်"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ပူဖောင်းကွက်များအတွက် ဆက်တင်များ"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> မှ ပူဖောင်းကွက်များကို ခွင့်ပြုလိုပါသလား။"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"စီမံရန်"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"ငြင်းပယ်ရန်"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"ခွင့်ပြုရန်"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"နောက်မှ မေးရန်"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> မှ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> နှင့် နောက်ထပ် <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ခုမှ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"ရွှေ့ရန်"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"ဘယ်အောက်ခြေသို့ ရွှေ့ရန်"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"ညာအောက်ခြေသို့ ရွှေ့ပါ"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"ပယ်ရန်"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"ချတ်များကို အရှေ့တွင်ထားခြင်း"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> မှ ချတ်အသစ်များသည် ပူဖောင်းများအဖြစ် ပေါ်လာပါမည်။ ဖွင့်ရန် ပူဖောင်းကို တို့ပါ။ ၎င်းကို ဖိဆွဲ၍ ရွှေ့ပါ။\n\nပူဖောင်းကို တို့ပါ"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"ဤအက်ပ်မှနေ၍ ပူဖောင်းများကို ပိတ်ရန်အတွက် \'စီမံရန်\' ကို တို့ပါ"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"စနစ်လမ်းညွှန်ခြင်း အပ်ဒိတ်လုပ်ပြီးပါပြီ။ အပြောင်းအလဲများ ပြုလုပ်ရန် \'ဆက်တင်များ\' သို့သွားပါ။"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"စနစ်လမ်းညွှန်ခြင်း အပ်ဒိတ်လုပ်ရန် \'ဆက်တင်များ\' သို့သွားပါ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"အသင့်အနေအထား"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"အခြားတည်ဆောက်ပုံများကို ကြည့်ရန် ပွတ်ဆွဲပါ"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 4078323..6673016 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Får oppmerksomheten din med lyd eller vibrering."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Holder deg oppmerksom med en svevende snarvei til dette innholdet."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ingen nylige bobler"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Nylige bobler og avviste bobler vises her."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse varslene kan ikke endres."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Denne varselgruppen kan ikke konfigureres her"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Omdirigert varsel"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Enhetstjenester"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Ingen tittel"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Trykk for å starte denne appen på nytt og vise den i fullskjerm."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Åpne <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Innstillinger for <xliff:g id="APP_NAME">%1$s</xliff:g>-bobler"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Vil du tillate bobler fra <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Administrer"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Avvis"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Tillat"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Spør meg senere"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g> og <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> flere"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Flytt"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Flytt til nederst til venstre"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Flytt til nederst til høyre"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Avvis"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Ha chatter i forgrunnen"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Nye chatter fra <xliff:g id="APP_NAME">%1$s</xliff:g> vises som bobler. Trykk på en boble for å åpne den. Dra for å flytte den.\n\nTrykk på boblen"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Trykk på Administrer for å slå av bobler for denne appen"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemnavigeringen er oppdatert. For å gjøre endringer, gå til Innstillinger."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Gå til Innstillinger for å oppdatere systemnavigeringen"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ventemodus"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Sveip for å se andre strukturer"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 8de4bad..d314e09 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"ध्वनि वा कम्पनमार्फत तपाईंको ध्यान आकर्षित गर्छ।"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"फ्लोटिङ सर्टकटमार्फत यो सामग्रीतर्फ तपाईंको ध्यान आकर्षित गर्दछ।"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"हालसालै खारेज गरिएको कुनै पनि बबल छैन"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"हालैका बबल र खारेज गरिएका बबलहरू यहाँ देखिने छन्।"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"यी सूचनाहरू परिमार्जन गर्न मिल्दैन।"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"यहाँबाट सूचनाहरूको यो समूह कन्फिगर गर्न सकिँदैन"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"प्रोक्सीमार्फत आउने सूचना"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"यन्त्रका सेवाहरू"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक छैन"</string>
<string name="restart_button_description" msgid="6916116576177456480">"यो अनुप्रयोग पुनः सुरु गर्न ट्याप गर्नुहोस् र पूर्ण स्क्रिन मोडमा जानुहोस्।"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> खोल्नुहोस्"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> का बबलसम्बन्धी सेटिङहरू"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> का बबलहरूलाई अनुमति दिने हो?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"व्यवस्थापन गर्नुहोस्"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"अस्वीकार गर्नुहोस्"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"अनुमति दिनुहोस्"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"मलाई पछि सोध्नुहोस्"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> को <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> का <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> र थप <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"सार्नुहोस्"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"पुछारमा बायाँतिर सार्नुहोस्"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"पुछारमा दायाँतिर सार्नुहोस्"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"हटाउनुहोस्"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"कुराकानीलाई अग्रभूमिमा राख्नुहोस्"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> का नयाँ कुराकानीहरू बबलका रूपमा देखा पर्ने छन्। बबल खोल्न त्यसमा ट्याप गर्नुहोस्। बबल सार्न त्यसलाई घिसार्नुहोस्।\n\nबबलमा ट्याप गर्नुहोस्"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"यो अनुप्रयोगमा बबल निष्क्रिय पार्न व्यवस्थापन गर्नुहोस् नामक बटन ट्याप गर्नुहोस्"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"प्रणालीको नेभिगेसन अद्यावधिक गरियो। परिवर्तन गर्न सेटिङमा जानुहोस्।"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"प्रणालीको नेभिगेसन अद्यावधिक गर्न सेटिङमा जानुहोस्"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"स्ट्यान्डबाई"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"अन्य संरचनाहरू हेर्न स्वाइप गर्नुहोस्"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 37a4578..8b77c57 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Trekt je aandacht met geluid of trillingen."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Trekt de aandacht met een zwevende snelkoppeling naar deze content."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Geen recente ballonnen"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Recente bubbels en gesloten bubbels worden hier weergegeven."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Deze meldingen kunnen niet worden aangepast."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Deze groep meldingen kan hier niet worden geconfigureerd"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Melding via proxy"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Apparaatservices"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Geen titel"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Tik om deze app opnieuw te starten en te openen op het volledige scherm."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> openen"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Instellingen voor <xliff:g id="APP_NAME">%1$s</xliff:g>-ballonnen"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Ballonnen van <xliff:g id="APP_NAME">%1$s</xliff:g> toestaan?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Beheren"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Weigeren"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Toestaan"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Later vragen"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> van <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> van <xliff:g id="APP_NAME">%2$s</xliff:g> en nog <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Verplaatsen"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Naar linksonder verplaatsen"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Naar rechtsonder verplaatsen"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Sluiten"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Chats op de voorgrond houden"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Nieuwe chats van <xliff:g id="APP_NAME">%1$s</xliff:g> worden weergegeven als bubbels. Tik op een bubbel om deze te openen. Sleep om deze te verplaatsen.\n\nTik op de bubbel"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tik op Beheren om bubbels van deze app uit te schakelen"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systeemnavigatie geüpdatet. Als je wijzigingen wilt aanbrengen, ga je naar Instellingen."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Ga naar Instellingen om de systeemnavigatie te updaten"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stand-by"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Swipe om andere gebouwen te bekijken"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 849d796..204c3d1 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"ସାଉଣ୍ଡ କିମ୍ବା ଭାଇବ୍ରେସନ୍ ମାଧ୍ୟମରେ ଆପଣଙ୍କର ଧ୍ୟାନ ଆକର୍ଷିତ କରିଥାଏ।"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ଏହି ବିଷୟବସ୍ତୁ ପାଇଁ ଏକ ଭାସମାନ ସର୍ଟକଟ୍ ସହ ଆପଣଙ୍କର ଧ୍ୟାନ ଦିଅନ୍ତୁ।"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ବର୍ତ୍ତମାନ କୌଣସି ବବଲ୍ ନାହିଁ"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"ବର୍ତ୍ତମାନର ବୁଦବୁଦଗୁଡ଼ିକ ଏବଂ ଖାରଜ କରାଯାଇଥିବା ବୁଦବୁଦଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯିବ।"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"ଏଠାରେ ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଗ୍ରୁପ୍ କନଫ୍ୟୁଗର୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"ବିଜ୍ଞପ୍ତି ପ୍ରକ୍ସୀ ହୋଇଛି"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"ଡିଭାଇସ୍ ସେବାଗୁଡିକ"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"କୌଣସି ଶୀର୍ଷକ ନାହିଁ"</string>
<string name="restart_button_description" msgid="6916116576177456480">"ଏହି ଆପ୍କୁ ରିଷ୍ଟାର୍ଟ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ ଏବଂ ଫୁଲ୍ସ୍କ୍ରିନ୍କୁ ଯାଆନ୍ତୁ।"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> ଖୋଲନ୍ତୁ"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବବଲ୍ଗୁଡ଼ିକ ପାଇଁ ସେଟିଂସ୍"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g>ରୁ ବବ୍ଲ୍ଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"ପରିଚାଳନା କରନ୍ତୁ"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"ପ୍ରତ୍ୟାଖ୍ୟାନ କରନ୍ତୁ"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"ଅନୁମତି ଦିଅନ୍ତୁ"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"ମୋତେ ପରେ ପଚାରନ୍ତୁ"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>ରୁ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> ଏବଂ ଅଧିକ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>ଟିରୁ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"ନିଅନ୍ତୁ"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"ତଳ ବାମକୁ ନିଅନ୍ତୁ"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"ତଳ ଡାହାଣକୁ ନିଅନ୍ତୁ"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"ଖାରଜ କରନ୍ତୁ"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"ଚାଟଗୁଡ଼ିକ ଆଗ ପଟେ ରଖନ୍ତୁ"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g>ର ନୂଆ ଚାଟଗୁଡ଼ିକ ବବଲ୍ ଭାବରେ ଦେଖାଯିବ। ଏହାକୁ ଖୋଲିବା ପାଇଁ ଏକ ବବଲରେ ଟାପ୍ କରନ୍ତୁ। ଏହାକୁ ମୁଭ୍ କରିବା ପାଇଁ ଟାଣନ୍ତୁ। \n\nବବଲରେ ଟାପ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"ଏହି ଆପର ବବଲଗୁଡ଼ିକ ବନ୍ଦ କରିବା ପାଇଁ \'ପରିଚାଳନା କରନ୍ତୁ\' ବଟନରେ ଟାପ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ ହୋଇଛି। ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ, ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ।"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ଅପ୍ଡେଟ୍ କରିବା ପାଇଁ ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ଷ୍ଟାଣ୍ଡବାଏ"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"ଅନ୍ୟ ଷ୍ଟ୍ରକଚରଗୁଡ଼ିକ ଦେଖିବାକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 3a43f0f..e071db5 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -86,6 +86,10 @@
<string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਦੁਬਾਰਾ ਲੈ ਕੇ ਦੇਖੋ"</string>
<string name="screenshot_failed_to_save_text" msgid="8344173457344027501">"ਸੀਮਿਤ ਸਟੋਰੇਜ ਹੋਣ ਕਾਰਨ ਸਕ੍ਰੀਨਸ਼ਾਟ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
<string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ਐਪ ਜਾਂ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਹੈ"</string>
+ <!-- no translation found for screenshot_dismiss_ui_description (934736855340147968) -->
+ <skip />
+ <!-- no translation found for screenshot_preview_description (669177537416980449) -->
+ <skip />
<string name="screenrecord_name" msgid="2596401223859996572">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਰ"</string>
<string name="screenrecord_channel_description" msgid="4147077128486138351">"ਕਿਸੇ ਸਕ੍ਰੀਨ ਰਿਕਾਰਡ ਸੈਸ਼ਨ ਲਈ ਚੱਲ ਰਹੀ ਸੂਚਨਾ"</string>
<string name="screenrecord_start_label" msgid="1750350278888217473">"ਕੀ ਰਿਕਾਰਡਿੰਗ ਸ਼ੁਰੂ ਕਰਨੀ ਹੈ?"</string>
@@ -558,8 +562,7 @@
<string name="monitoring_description_app_personal_work" msgid="6175816356939166101">"ਤੁਹਾਡੇ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਦਾ ਪ੍ਰਬੰਧਨ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਪ੍ਰੋਫਾਈਲ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਕਾਰਜ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।\n\nਤੁਸੀਂ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋਂ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"ਟਰੱਸਟ-ਏਜੰਟ ਵੱਲੋਂ ਅਣਲਾਕ ਰੱਖਿਆ ਗਿਆ"</string>
<string name="keyguard_indication_trust_disabled" msgid="6820793704816727918">"ਡੀਵਾਈਸ ਲਾਕ ਰਹੇਗਾ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਮੈਨੂਅਲੀ ਅਣਲਾਕ ਨਹੀਂ ਕਰਦੇ"</string>
- <!-- no translation found for keyguard_indication_trust_unlocked_plugged_in (2323452175329362855) -->
- <skip />
+ <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>
<string name="hidden_notifications_title" msgid="1782412844777612795">"ਤੇਜ਼ੀ ਨਾਲ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ"</string>
<string name="hidden_notifications_text" msgid="5899627470450792578">"ਅਣਲਾਕ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਉਹਨਾਂ ਨੂੰ ਦੇਖੋ"</string>
<string name="hidden_notifications_cancel" msgid="4805370226181001278">"ਨਹੀਂ ਧੰਨਵਾਦ"</string>
@@ -696,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"ਧੁਨੀ ਅਤੇ ਥਰਥਰਾਹਟ ਨਾਲ ਤੁਹਾਡਾ ਧਿਆਨ ਖਿੱਚਦੀ ਹੈ।"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ਇਸ ਸਮੱਗਰੀ ਦੇ ਅਸਥਿਰ ਸ਼ਾਰਟਕੱਟ ਨਾਲ ਆਪਣਾ ਧਿਆਨ ਕੇਂਦਰਿਤ ਰੱਖੋ।"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ਕੋਈ ਹਾਲੀਆ ਬੁਲਬੁਲਾ ਨਹੀਂ"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"ਹਾਲੀਆ ਬੁਲਬੁਲੇ ਅਤੇ ਖਾਰਜ ਕੀਤੇ ਬੁਲਬੁਲੇ ਇੱਥੇ ਦਿਸਣਗੇ।"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"ਇਹ ਸੂਚਨਾਵਾਂ ਦਾ ਗਰੁੱਪ ਇੱਥੇ ਸੰਰੂਪਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"ਇੱਕ ਐਪ ਦੀ ਥਾਂ \'ਤੇ ਦੂਜੀ ਐਪ ਰਾਹੀਂ ਦਿੱਤੀ ਗਈ ਸੂਚਨਾ"</string>
@@ -966,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"ਡੀਵਾਈਸ ਸੇਵਾਵਾਂ"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ"</string>
<string name="restart_button_description" msgid="6916116576177456480">"ਇਸ ਐਪ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਪੂਰੀ-ਸਕ੍ਰੀਨ ਮੋਡ \'ਤੇ ਜਾਓ।"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਖੋਲ੍ਹੋ"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਬੁਲਬੁਲਿਆਂ ਲਈ ਸੈਟਿੰਗਾਂ"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੋਂ ਬੁਲਬੁਲੇ ਆਉਣ ਦਿਓ?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"ਮਨ੍ਹਾ ਕਰੋ"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"ਕਰਨ ਦਿਓ"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"ਮੈਨੂੰ ਬਾਅਦ ਵਿੱਚ ਪੁੱਛੋ"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> ਤੋਂ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> ਅਤੇ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ਹੋਰਾਂ ਤੋਂ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"ਲਿਜਾਓ"</string>
@@ -981,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"ਹੇਠਾਂ ਵੱਲ ਖੱਬੇ ਲਿਜਾਓ"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"ਹੇਠਾਂ ਵੱਲ ਸੱਜੇ ਲਿਜਾਓ"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"ਖਾਰਜ ਕਰੋ"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"ਚੈਟਾਂ ਨੂੰ ਪਹਿਲਾਂ ਤੋਂ ਤਿਆਰ ਰੱਖੋ"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਦੀਆਂ ਨਵੀਆਂ ਚੈਟਾਂ ਬੁਲਬੁਲਿਆਂ ਵਾਂਗ ਦਿਸਣਗੀਆਂ। ਇਸ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਕਿਸੇ ਬੁਲਬੁਲੇ \'ਤੇ ਟੈਪ ਕਰੋ। ਇਸ ਨੂੰ ਇੱਕ ਥਾਂ ਤੋਂ ਦੂਜੀ ਥਾਂ \'ਤੇ ਲਿਜਾਣ ਲਈ ਘਸੀਟੋ।\n\nਬੁਲਬੁਲੇ \'ਤੇ ਟੈਪ ਕਰੋ"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"ਇਸ ਐਪ \'ਤੇ ਬੁਲਬੁਲੇ ਬੰਦ ਕਰਨ ਲਈ \'ਪ੍ਰਬੰਧਨ ਕਰੋ\' \'ਤੇ ਟੈਪ ਕਰੋ"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਅੱਪਡੇਟ ਹੋ ਗਿਆ। ਤਬਦੀਲੀਆਂ ਕਰਨ ਲਈ, ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ।"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"ਸਟੈਂਡਬਾਈ"</string>
@@ -999,14 +1006,17 @@
</plurals>
<string name="controls_favorite_default_title" msgid="967742178688938137">"ਕੰਟਰੋਲ"</string>
<string name="controls_favorite_subtitle" msgid="4049644994401173949">"ਤਤਕਾਲ ਪਹੁੰਚ ਲਈ ਕੰਟਰੋਲ ਚੁਣੋ"</string>
- <string name="controls_favorite_header_favorites" msgid="3118600046217493471">"ਮਨਪਸੰਦ"</string>
- <string name="controls_favorite_header_all" msgid="7507855973418969992">"ਸਭ"</string>
<string name="controls_favorite_load_error" msgid="2533215155804455348">"ਸਾਰੇ ਕੰਟਰੋਲਾਂ ਦੀ ਸੂਚੀ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।"</string>
<string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ਹੋਰ"</string>
- <!-- no translation found for controls_dialog_title (8806193219278278442) -->
+ <string name="controls_dialog_title" msgid="8806193219278278442">"ਤਤਕਾਲ ਕੰਟਰੋਲ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string>
+ <string name="controls_dialog_ok" msgid="7011816381344485651">"ਮਨਪਸੰਦ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string>
+ <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ਨੇ ਇਸ ਕੰਟਰੋਲ ਨੂੰ ਤੁਹਾਡੇ ਮਨਪਸੰਦ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਸੁਝਾਅ ਦਿੱਤਾ ਹੈ।"</string>
+ <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"ਪਿੰਨ ਵਿੱਚ ਅੱਖਰ ਜਾਂ ਚਿੰਨ੍ਹ ਸ਼ਾਮਲ ਹਨ"</string>
+ <string name="controls_pin_verify" msgid="414043854030774349">"ਡੀਵਾਈਸ ਪਿੰਨ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ"</string>
+ <string name="controls_pin_instructions" msgid="6363309783822475238">"ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</string>
+ <string name="controls_structure_tooltip" msgid="1392966215435667434">"ਹੋਰ ਬਣਤਰਾਂ ਦੇਖਣ ਲਈ ਸਵਾਈਪ ਕਰੋ"</string>
+ <!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
- <!-- no translation found for controls_dialog_ok (7011816381344485651) -->
- <skip />
- <!-- no translation found for controls_dialog_message (6292099631702047540) -->
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
<skip />
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index cb6d753..116d2b2 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -705,7 +705,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Przyciąga uwagę dźwiękiem lub wibracjami."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Przyciąga uwagę dzięki pływającym skrótom do treści."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Brak ostatnich dymków"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Tutaj będą pojawiać się ostatnie i odrzucone dymki."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Tych powiadomień nie można zmodyfikować."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Tej grupy powiadomień nie można tu skonfigurować"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Powiadomienie w zastępstwie"</string>
@@ -979,13 +980,8 @@
<string name="device_services" msgid="1549944177856658705">"Usługi urządzenia"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Bez tytułu"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Kliknij, by uruchomić tę aplikację ponownie i przejść w tryb pełnoekranowy."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Otwórz: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Ustawienia dymków aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Zezwolić na dymki z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Zarządzaj"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Odmów"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Zezwól"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Zapytaj później"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikacji <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikacji <xliff:g id="APP_NAME">%2$s</xliff:g> i jeszcze <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Przenieś"</string>
@@ -994,9 +990,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Przenieś w lewy dolny róg"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Przenieś w prawy dolny róg"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Zamknij"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Wyświetlaj czaty na wierzchu"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Nowe czaty z aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g> będą pojawiać się jako dymki. Kliknij dymek, aby go otworzyć. Przeciągnij dymek, jeśli chcesz go przenieść.\n\nKliknij dymek"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Kliknij Zarządzaj, aby wyłączyć dymki z tej aplikacji"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Nawigacja w systemie została zaktualizowana. Aby wprowadzić zmiany, otwórz Ustawienia."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Otwórz Ustawienia, by zaktualizować nawigację w systemie"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Tryb gotowości"</string>
@@ -1025,4 +1029,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Przesuń, by zobaczyć inne struktury"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 55fc2ec..6d6c8d9 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Chama sua atenção com som ou vibração."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantém sua atenção com um atalho flutuante para esse conteúdo."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Os balões recentes e dispensados aparecerão aqui."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Não é possível configurar esse grupo de notificações aqui"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Notificação salva no proxy"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Serviços do dispositivo"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Sem título"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Toque para reiniciar o app e usar tela cheia."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Abrir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configurações de balões do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Permitir balões de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Gerenciar"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Negar"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Permitir"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Perguntar depois"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> mais <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Mover"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Mover para canto inferior esquerdo"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Mover para canto inferior direito"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Dispensar"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Manter chats em primeiro plano"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Novos chats do app <xliff:g id="APP_NAME">%1$s</xliff:g> aparecerão como balões. Toque em um balão para abrir o chat. Arraste para mover.\n\nToque no balão"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toque em \"Gerenciar\" para desativar os balões desse app"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navegação no sistema atualizada. Se quiser alterá-la, acesse as configurações."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Acesse as configurações para atualizar a navegação no sistema"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Em espera"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Deslize para ver outras estruturas"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index fbae3a1..1a67e9c 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Chama a sua atenção com som ou vibração."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantém a sua atenção com um atalho flutuante para este conteúdo."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Os balões recentes e os balões ignorados vão aparecer aqui."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar estas notificações."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Não é possível configurar este grupo de notificações aqui."</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Notificação de aplicação proxy"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Serviços do dispositivo"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Sem título"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Toque para reiniciar esta aplicação e ficar em ecrã inteiro."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Abrir a aplicação <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Definições dos balões da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Pretende permitir balões da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Gerir"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Recusar"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Permitir"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Perguntar depois"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> do <xliff:g id="APP_NAME">%2$s</xliff:g> e mais<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>."</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Mover"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Mover p/ parte infer. esquerda"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Mover parte inferior direita"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Ignorar"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Mantenha os chats em primeiro plano"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Os novos chats da app <xliff:g id="APP_NAME">%1$s</xliff:g> serão apresentados como balões. Toque num balão para o abrir. Arraste para o mover.\n\nToque no balão."</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toque em Gerir para desativar os balões desta app."</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"A navegação no sistema foi atualizada. Para efetuar alterações, aceda às Definições."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Aceda às Definições para atualizar a navegação no sistema."</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Modo de espera"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Deslize rapidamente para ver outras estruturas."</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 55fc2ec..6d6c8d9 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Chama sua atenção com som ou vibração."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantém sua atenção com um atalho flutuante para esse conteúdo."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Os balões recentes e dispensados aparecerão aqui."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Não é possível configurar esse grupo de notificações aqui"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Notificação salva no proxy"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Serviços do dispositivo"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Sem título"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Toque para reiniciar o app e usar tela cheia."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Abrir <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configurações de balões do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Permitir balões de <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Gerenciar"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Negar"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Permitir"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Perguntar depois"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> mais <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Mover"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Mover para canto inferior esquerdo"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Mover para canto inferior direito"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Dispensar"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Manter chats em primeiro plano"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Novos chats do app <xliff:g id="APP_NAME">%1$s</xliff:g> aparecerão como balões. Toque em um balão para abrir o chat. Arraste para mover.\n\nToque no balão"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Toque em \"Gerenciar\" para desativar os balões desse app"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navegação no sistema atualizada. Se quiser alterá-la, acesse as configurações."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Acesse as configurações para atualizar a navegação no sistema"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Em espera"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Deslize para ver outras estruturas"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 9cada50..350e31f 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -702,7 +702,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Vă atrage atenția fără sunet sau vibrare."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Vă atrage atenția printr-o comandă rapidă flotantă la acest conținut."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nu există baloane recente"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Baloanele recente și baloanele respinse vor apărea aici."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Aceste notificări nu pot fi modificate."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Acest grup de notificări nu poate fi configurat aici"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Notificare prin proxy"</string>
@@ -974,13 +975,8 @@
<string name="device_services" msgid="1549944177856658705">"Servicii pentru dispozitiv"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Fără titlu"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Atingeți ca să reporniți aplicația și să treceți în modul ecran complet."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Accesați <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Setări pentru baloanele <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Permiteți baloanele de la <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Gestionați"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Refuzați"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Permiteți"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Întreabă-mă mai târziu"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de la <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de la <xliff:g id="APP_NAME">%2$s</xliff:g> și încă <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Mutați"</string>
@@ -989,9 +985,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Mutați în stânga jos"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Mutați în dreapta jos"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Închideți"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Mențineți conversațiile prin chat în prim-plan"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Conversațiile noi prin chat din <xliff:g id="APP_NAME">%1$s</xliff:g> vor apărea sub forma unor baloane. Atingeți un balon pentru a deschide o conversație. Trageți-l pentru a-l muta.\n\nAtingeți balonul."</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Atingeți Gestionați pentru a dezactiva baloanele din această aplicație"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigarea în sistem a fost actualizată. Pentru a face modificări, accesați Setările."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Accesați Setările pentru a actualiza navigarea în sistem"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Standby"</string>
@@ -1019,4 +1023,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Glisați pentru a vedea alte structuri"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index bba74b1..7b494db 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -705,7 +705,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Уведомления приходят со звуком или вибрацией"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Привлекает ваше внимание к контенту с помощью плавающего ярлыка"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нет недавних подсказок"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Здесь будут появляться недавние и закрытые всплывающие уведомления."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Эти уведомления нельзя изменить."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Эту группу уведомлений нельзя настроить здесь."</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Уведомление отправлено через прокси-сервер."</string>
@@ -979,13 +980,8 @@
<string name="device_services" msgid="1549944177856658705">"Сервисы устройства"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Без названия"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Нажмите, чтобы перезапустить приложение и перейти в полноэкранный режим."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Открыть приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Настройки всплывающих уведомлений от приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Разрешить всплывающие уведомления от приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Настроить"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Запретить"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Разрешить"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Напомнить позже"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> из приложения \"<xliff:g id="APP_NAME">%2$s</xliff:g>\""</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> от приложения \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" и ещё <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Перенести"</string>
@@ -994,9 +990,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Перенести в левый нижний угол"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Перенести в правый нижний угол"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Закрыть"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Чаты на первом плане"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Новые чаты из приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" будут появляться в виде всплывающих уведомлений. Чтобы открыть такое уведомление, нажмите на него. Чтобы переместить всплывающее уведомление, перетащите его.\n\nНажмите на всплывающее уведомление"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Чтобы отключить всплывающие уведомления от приложения, нажмите \"Настроить\"."</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Параметры навигации в системе обновлены. Чтобы изменить их, перейдите в настройки."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Чтобы обновить параметры навигации в системе, перейдите в настройки."</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Переход в режим ожидания"</string>
@@ -1025,4 +1029,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Чтобы увидеть другие строения, проведите по экрану"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 8ec1486..d9cef38 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"ශබ්දය හෝ කම්පනය සමඟ ඔබේ අවධානය ලබා ගනී."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"පාවෙන කෙටිමගක් සමග ඔබේ අවධානය මෙම අන්තර්ගතය වෙත තබා ගන්න."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"මෑත බුබුලු නැත"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"මෑත බුබුලු සහ ඉවත ලූ බුබුලු මෙහි දිස් වනු ඇත."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"මෙම දැනුම්දීම් වෙනස් කළ නොහැක."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"මෙම දැනුම්දීම් සමූහය මෙහි වින්යාස කළ නොහැක"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"ප්රොක්සි කළ දැනුම්දීම"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"උපාංග සේවා"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"මාතෘකාවක් නැත"</string>
<string name="restart_button_description" msgid="6916116576177456480">"මෙම යෙදුම යළි ඇරඹීමට සහ පූර්ණ තිරයට යාමට තට්ටු කරන්න"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> විවෘත කරන්න"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> බුබුළු සඳහා සැකසීම්"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> වෙතින් බුබුළුවලට ඉඩ දෙන්නේද?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"කළමනා කරන්න"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"ප්රතික්ෂේප කරන්න"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"ඉඩ දෙන්න"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"පසුව මගෙන් අසන්න"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> වෙතින් <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> වෙතින් <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> සහ තවත් <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ක්"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"ගෙන යන්න"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"පහළ වමට ගෙන යන්න"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"පහළ දකුණට ගෙන යන්න"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"ඉවතලන්න"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"කල් තියා කතාබස් කර ගෙන යන්න"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> වෙතින් නව කතාබස් බුබුලු ලෙස දිස් වනු ඇත. බුබුලක් විවෘත කිරීමට එය තට්ටු කරන්න. එය ගෙන යාමට අදින්න.\n\nබුබුල තට්ටු කරන්න"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"මෙම යෙදුමෙන් බුබුලු ක්රියාවිරහිත කිරීමට කළමනාකරණය කරන්න තට්ටු කරන්න"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"පද්ධති සංචලනය යාවත්කාලීන කළා. වෙනස්කම් සිදු කිරීමට, සැකසීම් වෙත යන්න."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"පද්ධති සංචලනය යාවත්කාලීන කිරීමට සැකසීම් වෙත යන්න"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"පොරොත්තු"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"අනෙක් ආකෘති බැලීමට ස්වයිප් කරන්න"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 84ab602..e14ea22 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -705,7 +705,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Upúta vás zvukom alebo vibráciami."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Upúta vás plávajúcim odkazom na tento obsah."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Žiadne nedávne bubliny"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Tu sa budú zobrazovať nedávne a zavreté bubliny."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Tieto upozornenia sa nedajú upraviť."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Túto skupinu upozornení nejde na tomto mieste konfigurovať"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Približné upozornenie"</string>
@@ -979,13 +980,8 @@
<string name="device_services" msgid="1549944177856658705">"Služby zariadenia"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Bez názvu"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Klepnutím reštartujete túto aplikáciu a prejdete do režimu celej obrazovky."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Otvoriť <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Nastavenia bublín aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Povoliť bubliny z aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Spravovať"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Zamietnuť"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Povoliť"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Spýtať sa neskôr"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikácie <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikácie <xliff:g id="APP_NAME">%2$s</xliff:g> a ďalšie (<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>)"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Presunúť"</string>
@@ -994,9 +990,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Presunúť doľava nadol"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Presunúť doprava nadol"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Zavrieť"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Zobrazovať čety na popredí"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Nové čety z aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g> sa budú zobrazovať ako bubliny. Bubliny otvoríte klepnutím na ne. Premiestnite ich presunutím.\n\nKlepnite na bublinu."</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Klepnutím na Spravovať vypnite bubliny z tejto aplikácie"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigácia v systéme bola aktualizovaná. Ak chcete vykonať zmeny, prejdite do Nastavení."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Prejdite do Nastavení a aktualizujte navigáciu v systéme"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostný režim"</string>
@@ -1025,4 +1029,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Potiahnutím zobrazíte ďalšie budovy"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 0bf5efc..4ba3488 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -705,7 +705,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Pritegne vašo pozornost z zvokom ali vibriranjem"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Zadrži vašo pozornost z lebdečo bližnjico do te vsebine."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Ni nedavnih oblačkov"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Tukaj bodo prikazani tako nedavni kot opuščeni oblački."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Za ta obvestila ni mogoče spremeniti nastavitev."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Te skupine obvestil ni mogoče konfigurirati tukaj"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Posredovano obvestilo"</string>
@@ -979,13 +980,8 @@
<string name="device_services" msgid="1549944177856658705">"Storitve naprave"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Brez naslova"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Dotaknite se za vnovični zagon te aplikacije in preklop v celozaslonski način."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Odpri aplikacijo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Nastavitve za oblačke aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Želite dovoliti oblačke iz aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Upravljanje"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Zavrni"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Dovoli"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Vprašaj me pozneje"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>)"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> in toliko drugih: <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Premakni"</string>
@@ -994,9 +990,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Premakni spodaj levo"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Premakni spodaj desno"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Opusti"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Klepete obdrži v ospredju"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Novi klepeti v aplikaciji <xliff:g id="APP_NAME">%1$s</xliff:g> bodo prikazani kot oblački. Dotaknite se oblačka, da ga odprete. Povlecite, da ga premaknete.\n\nDotaknite se oblačka"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Dotaknite se »Upravljanje«, da izklopite oblačke iz te aplikacije"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Krmarjenje po sistemu je posodobljeno. Če želite opraviti spremembe, odprite nastavitve."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Če želite posodobiti krmarjenje po sistemu, odprite nastavitve"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Stanje pripravljenosti"</string>
@@ -1025,4 +1029,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Povlecite za ogled drugih struktur"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 518bfff..d763fe5 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Të tërheq vëmendjen me tinguj ose dridhje."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mban vëmendjen tënde me një shkurtore pluskuese te kjo përmbajtje."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nuk ka flluska të fundit"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Flluskat e fundit dhe flluskat e hequra do të shfaqen këtu."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Këto njoftime nuk mund të modifikohen."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ky grup njoftimesh nuk mund të konfigurohet këtu"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Njoftim i dërguar me përfaqësues"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Shërbimet e pajisjes"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Pa titull"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Trokit për ta rinisur këtë aplikacion dhe për të kaluar në ekranin e plotë."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Hap <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Cilësimet për flluskat e <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Të lejohen flluskat nga <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Menaxho"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Refuzo"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Lejo"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Më pyet më vonë"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> nga <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> nga <xliff:g id="APP_NAME">%2$s</xliff:g> dhe <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> të tjera"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Zhvendos"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Zhvendos poshtë majtas"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Lëvize poshtë djathtas"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Hiq"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Mbaji bisedat në plan të parë"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Bisedat e reja nga <xliff:g id="APP_NAME">%1$s</xliff:g> do të shfaqen si flluska. Trokit mbi një flluskë për ta hapur atë. Zvarrit për ta zhvendosur atë.\n\nTrokit mbi flluskë"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Trokit \"Menaxho\" për të çaktivizuar flluskat nga ky aplikacion"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Navigimi i sistemit u përditësua. Për të bërë ndryshime, shko te \"Cilësimet\"."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Shko te \"Cilësimet\" për të përditësuar navigimin e sistemit"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Në gatishmëri"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Rrëshqit për të parë strukturat e tjera"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 2adb5cf..e8432195 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -702,7 +702,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Привлачи вам пажњу помоћу звука или вибрације."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Привлачи вам пажњу помоћу плутајуће пречице до овог садржаја."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нема недавних облачића"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Овде се приказују недавни и одбачени облачићи."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ова обавештења не могу да се мењају."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ова група обавештења не може да се конфигурише овде"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Обавештење преко проксија"</string>
@@ -974,13 +975,8 @@
<string name="device_services" msgid="1549944177856658705">"Услуге за уређаје"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Без наслова"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Додирните да бисте рестартовали апликацију и прешли у режим целог екрана."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Отворите <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Подешавања за <xliff:g id="APP_NAME">%1$s</xliff:g> облачиће"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Желите ли да омогућите облачиће из апликације <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Управљајте"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Одбиј"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Дозволи"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Питај ме касније"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> из апликације <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> из апликације <xliff:g id="APP_NAME">%2$s</xliff:g> и још <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Премести"</string>
@@ -989,9 +985,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Премести доле лево"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Премести доле десно"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Одбаци"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Нека поруке ћаскања остану у првом плану"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Нове поруке ћаскања из апликације <xliff:g id="APP_NAME">%1$s</xliff:g> ће се приказати као облачићи. Додирните облачић да бисте га отворили. Превуците да бисте га преместили.\n\nДодирните облачић"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Додирните Управљајте да бисте искључили облачиће из ове апликације"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навигација система је ажурирана. Да бисте унели измене, идите у Подешавања."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Идите у Подешавања да бисте ажурирали навигацију система"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Стање приправности"</string>
@@ -1019,4 +1023,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Превуците да бисте видели друге структуре"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 28a7cff..b3e46ac 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Påkallar uppmärksamhet med ljud eller vibrationer."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Behåller din uppmärksamhet med en flytande genväg till innehållet."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Inga senaste bubblor"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"De senaste bubblorna och ignorerade bubblor visas här."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Det går inte att ändra de här aviseringarna."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Den här aviseringsgruppen kan inte konfigureras här"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Avisering via proxy"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Enhetstjänster"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Ingen titel"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Tryck för att starta om appen i helskärmsläge."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Öppna <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Inställningar för <xliff:g id="APP_NAME">%1$s</xliff:g>-bubblor"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Vill du tillåta bubblor från <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Hantera"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Neka"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Tillåt"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Fråga senare"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> från <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> från <xliff:g id="APP_NAME">%2$s</xliff:g> och <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> fler"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Flytta"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Flytta längst ned till vänster"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Flytta längst ned till höger"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Stäng"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Håll chattar i förgrunden"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Nya chattar från <xliff:g id="APP_NAME">%1$s</xliff:g> visas som bubblor. Tryck på en bubbla som du vill öppna. Flytta den genom att dra.\n\nTryck på bubblan"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Tryck på Hantera för att stänga av bubblor från den här appen"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Systemnavigeringen har uppdaterats. Öppna inställningarna om du vill ändra något."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Öppna inställningarna och uppdatera systemnavigeringen"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Viloläge"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Svep för att se andra strukturer"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 2e45645..962be9c 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Hupata umakinifu wako kwa sauti na mtetemo."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Huweka umakinifu wako kwenye maudhui haya kwa kutumia njia ya mkato ya kuelea."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Hakuna viputo vya hivi majuzi"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Viputo vya hivi karibuni na viputo vilivyoondolewa vitaonekana hapa."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Arifa hizi haziwezi kubadilishwa."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Kikundi hiki cha arifa hakiwezi kuwekewa mipangilio hapa"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Arifa wakilishi"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Huduma za Kifaa"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Wimbo hauna jina"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Gusa ili uzime na uwashe upya programu hii kisha nenda kwenye skrini nzima."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Fungua <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Mipangilio ya viputo vya <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Je, ungependa kuruhusu viputo kutoka <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Dhibiti"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Kataa"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Ruhusu"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Niulize baadaye"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kutoka kwa <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kutoka kwa <xliff:g id="APP_NAME">%2$s</xliff:g> na nyingine<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Sogeza"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Sogeza chini kushoto"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Sogeza chini kulia"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Ondoa"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Zipe gumzo kipaumbele"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Gumzo mpya kutoka <xliff:g id="APP_NAME">%1$s</xliff:g> zitaonekana kama viputo. Gusa kiputo ili ukifungue. Buruta ili ukisogeze.\n\nGusa kiputo"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Gusa Dhibiti ili uzime viputo kwenye programu hii"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Umesasisha usogezaji kwenye mfumo. Ili ubadilishe, nenda kwenye Mipangilio."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Nenda kwenye mipangilio ili usasishe usogezaji kwenye mfumo"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Hali tuli"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Telezesha kidole ili uone miundo mingine"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 30743ea..b225a66 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"శబ్దం లేదా వైబ్రేషన్తో మీరు దృష్టి సారించేలా చేస్తుంది."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ఫ్లోటింగ్ షార్ట్కట్తో మీ దృష్టిని ఈ కంటెంట్పై నిలిపి ఉంచుతుంది."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ఇటీవల బబుల్లు ఏవీ లేవు"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"ఇటీవలి బబుల్లు, తీసివేసిన బబుల్లు ఇక్కడ కనిపిస్తాయి."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ఈ నోటిఫికేషన్లను సవరించడం వీలుపడదు."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"ఈ నోటిఫికేషన్ల సమూహాన్ని ఇక్కడ కాన్ఫిగర్ చేయలేము"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"ప్రాక్సీ చేయబడిన నోటిఫికేషన్"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"పరికర సేవలు"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"శీర్షిక లేదు"</string>
<string name="restart_button_description" msgid="6916116576177456480">"ఈ యాప్ను పునఃప్రారంభించేలా నొక్కి, ఆపై పూర్తి స్క్రీన్లోకి వెళ్లండి."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g>ని తెరువు"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> బబుల్ల సెట్టింగ్లు"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> నుండి బబుల్లను అనుమతించాలా?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"నిర్వహించండి"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"తిరస్కరించు"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"అనుమతించు"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"నన్ను తర్వాత అడగు"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> నుండి <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> నుండి <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> మరియు మరో <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"తరలించు"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"దిగువ ఎడమవైపునకు తరలించు"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"దిగవు కుడివైపునకు జరుపు"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"విస్మరించు"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"చాట్లను ముందుగా ఉంచండి"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> నుండి వచ్చే కొత్త చాట్లు బబుల్లుగా కనిపిస్తాయి. దానిని తెరవడానికి బబుల్ను ట్యాప్ చేయండి. దానిని తరలించడానికి లాగండి.\n\nబబుల్ను ట్యాప్ చేయండి"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"ఈ యాప్ నుండి వచ్చే బబుల్లను ఆఫ్ చేయడానికి మేనేజ్ బటన్ను ట్యాప్ చేయండి"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"సిస్టమ్ నావిగేషన్ అప్డేట్ చేయబడింది. మార్పులు చేయడానికి, సెట్టింగ్లకు వెళ్లండి."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"సిస్టమ్ నావిగేషన్ను అప్డేట్ చేయడానికి సెట్టింగ్లకు వెళ్లండి"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"స్టాండ్బై"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"ఇతర నిర్మాణాలను చూడటానికి స్వైప్ చేయండి"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 1e1d963..e1a4a79 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"ดึงความสนใจของคุณด้วยเสียงและการสั่น"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ดึงดูดความสนใจของคุณไว้เสมอด้วยทางลัดแบบลอยที่มายังเนื้อหานี้"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"ไม่มีบับเบิลเมื่อเร็วๆ นี้"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"บับเบิลที่แสดงและที่ปิดไปเมื่อเร็วๆ นี้จะปรากฏที่นี่"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"การแจ้งเตือนกลุ่มนี้กำหนดค่าที่นี่ไม่ได้"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"การแจ้งเตือนที่ผ่านพร็อกซี"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"บริการของอุปกรณ์"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"ไม่มีชื่อ"</string>
<string name="restart_button_description" msgid="6916116576177456480">"แตะเพื่อรีสตาร์ทแอปนี้และแสดงแบบเต็มหน้าจอ"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"เปิด <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"การตั้งค่าลูกโป่ง <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"อนุญาตลูกโป่งจาก <xliff:g id="APP_NAME">%1$s</xliff:g> ไหม"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"จัดการ"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"ปฏิเสธ"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"อนุญาต"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"ถามฉันทีหลัง"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> จาก <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> จาก <xliff:g id="APP_NAME">%2$s</xliff:g> และอีก <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> รายการ"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"ย้าย"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"ย้ายไปด้านซ้ายล่าง"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"ย้ายไปด้านขาวล่าง"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"ปิด"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"เข้าถึงแชทได้ง่ายๆ"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"แชทใหม่จาก <xliff:g id="APP_NAME">%1$s</xliff:g> จะปรากฏเป็นบับเบิล แตะบับเบิลเพื่อเปิดแชท ลากเพื่อย้ายตำแหน่ง\n\nแตะบับเบิล"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"แตะ \"จัดการ\" เพื่อปิดบับเบิลจากแอปนี้"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"อัปเดตการไปยังส่วนต่างๆ ของระบบแล้ว หากต้องการเปลี่ยนแปลง ให้ไปที่การตั้งค่า"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"ไปที่การตั้งค่าเพื่ออัปเดตการไปยังส่วนต่างๆ ของระบบ"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"สแตนด์บาย"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"เลื่อนเพื่อดูโครงสร้างอื่นๆ"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index e2fe93b..3a19c52 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Kinukuha ang iyong atensyon sa pamamagitan ng tunog o pag-vibrate."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Pinapanatili ang iyong atensyon sa pamamagitan ng lumulutang na shortcut sa content na ito."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Walang kamakailang bubble"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Lalabas dito ang kamakailang bubbles at na-dismiss na bubbles."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Hindi puwedeng baguhin ang mga notification na ito."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Hindi mako-configure dito ang pangkat na ito ng mga notification"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Na-proxy na notification"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Mga Serbisyo ng Device"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Walang pamagat"</string>
<string name="restart_button_description" msgid="6916116576177456480">"I-tap para i-restart ang app na ito at mag-full screen."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Buksan ang <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Mga setting para sa mga bubble ng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Payagan ang mga bubble mula sa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Pamahalaan"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Tanggihan"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Payagan"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Tanungin ako sa ibang pagkakataon"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> mula sa <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> mula sa <xliff:g id="APP_NAME">%2$s</xliff:g> at <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> pa"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Ilipat"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Ilipat sa kaliwa sa ibaba"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Ilipat sa kanan sa ibaba"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"I-dismiss"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Panatilihing nasa harap ang mga chat"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Lalabas ang mga bagong chat mula sa <xliff:g id="APP_NAME">%1$s</xliff:g> bilang mga bubble. I-tap ang isang bubble para buksan ito. I-drag ito para ilipat ito.\n\nI-tap ang bubble"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"I-tap ang Pamahalaan para i-off ang mga bubble mula sa app na ito"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Na-update na ang pag-navigate ng system. Para gumawa ng mga pagbabago, pumunta sa Mga Setting."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Pumunta sa Mga Setting para i-update ang pag-navigate sa system"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Naka-standby"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Mag-swipe para makita iba pang istraktura"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index be2a30b..24d8c5f 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Ses veya titreşimle dikkatinizi çeker."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Kayan kısayolla dikkatinizi bu içerik üzerinde tutar."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Son kapatılan baloncuk yok"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Son baloncuklar ve kapattığınız baloncuklar burada görünür."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirimler değiştirilemez."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Bu bildirim grubu burada yapılandırılamaz"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Proxy uygulanan bildirim"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Cihaz Hizmetleri"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Başlıksız"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Bu uygulamayı yeniden başlatmak ve tam ekrana geçmek için dokunun."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> öğesini açın."</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> baloncukları için ayarlar"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> baloncuklarına izin verilsin mi?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Yönet"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Reddet"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"İzin Ver"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Daha sonra yeniden sor"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> uygulamasından <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> uygulamasından <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ve diğer <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Taşı"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Sol alta taşı"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Sağ alta taşı"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Kapat"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Sohbetleri önde tutma"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> adlı kişi ile yeni sohbetler balon olarak görünür. Açmak için balona dokunun. Taşımak için sürükleyin.\n\nBalona dokunun"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Bu uygulamanın balonlarını kapatmak için Yönet\'e dokunun"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Sistemde gezinme yöntemi güncellendi. Değişiklik yapmak için Ayarlar\'a gidin."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Sistemde gezinme yöntemini güncellemek için Ayarlar\'a gidin"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Beklemeye alınıyor"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Diğer yapıları görmek için kaydırın"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index ea19b6c..baf7309 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -705,7 +705,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Привертає увагу звуковим сигналом або вібрацією."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Привертає увагу до контенту плаваючим ярликом."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Немає нещодавніх спливаючих сповіщень"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Тут з\'являтимуться нещодавні й відхилені спливаючі сповіщення."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Ці сповіщення не можна змінити."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Цю групу сповіщень не можна налаштувати тут"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Проксі-сповіщення"</string>
@@ -966,7 +967,7 @@
<string name="slice_permission_text_2" msgid="6758906940360746983">"- Може виконувати дії в додатку <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="slice_permission_checkbox" msgid="4242888137592298523">"Дозволити додатку <xliff:g id="APP">%1$s</xliff:g> показувати фрагменти будь-якого додатка"</string>
<string name="slice_permission_allow" msgid="6340449521277951123">"Дозволити"</string>
- <string name="slice_permission_deny" msgid="6870256451658176895">"Відмовити"</string>
+ <string name="slice_permission_deny" msgid="6870256451658176895">"Заборонити"</string>
<string name="auto_saver_title" msgid="6873691178754086596">"Торкніться, щоб увімкнути автоматичний режим економії заряду акумулятора"</string>
<string name="auto_saver_text" msgid="3214960308353838764">"Вмикати, коли заряд акумулятора закінчується"</string>
<string name="no_auto_saver_action" msgid="7467924389609773835">"Ні, дякую"</string>
@@ -979,13 +980,8 @@
<string name="device_services" msgid="1549944177856658705">"Сервіси на пристрої"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Без назви"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Натисніть, щоб перезапустити додаток і перейти в повноекранний режим."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Відкрити додаток <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Налаштування спливаючих підказок від додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Дозволити спливаючі підказки від додатка <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Керувати"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Заборонити"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Дозволити"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Запитати пізніше"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"Cповіщення \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" від додатка <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"Сповіщення \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" від додатка <xliff:g id="APP_NAME">%2$s</xliff:g> (і ще <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>)"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Перемістити"</string>
@@ -994,9 +990,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Перемістити ліворуч униз"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Перемістити праворуч униз"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Закрити"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Чати завжди під рукою"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Нові чати з додатка <xliff:g id="APP_NAME">%1$s</xliff:g> з\'являтимуться як спливаючі сповіщення. Щоб відкрити чат, натисніть сповіщення. Щоб перемістити сповіщення, потягніть його.\n\nНатисніть спливаюче сповіщення"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Натисніть \"Керувати\", щоб вимкнути спливаючі сповіщення для цього додатка"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Навігацію в системі оновлено. Щоб внести зміни, перейдіть у налаштування."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Перейдіть у налаштування, щоб оновити навігацію в системі"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Режим очікування"</string>
@@ -1025,4 +1029,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Щоб переглянути інші структури, проведіть пальцем"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 0dd726e..2d5ea2a 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"آواز اور وائبریشن کے ذریعے آپ کی توجہ حاصل کرتا ہے۔"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"اس مواد کے فلوٹنگ شارٹ کٹ کے ساتھ آپ کی توجہ دیتی ہے۔"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"کوئی حالیہ بلبلہ نہیں"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"حالیہ بلبلے اور برخاست بلبلے یہاں ظاہر ہوں گے۔"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"ان اطلاعات کی ترمیم نہیں کی جا سکتی۔"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"اطلاعات کے اس گروپ کو یہاں کنفیگر نہیں کیا جا سکتا"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"پراکسی اطلاع"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"آلہ کی سروس"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"کوئی عنوان نہیں ہے"</string>
<string name="restart_button_description" msgid="6916116576177456480">"یہ ایپ دوبارہ شروع کرنے کے لیے تھپتھپائیں اور پوری اسکرین پر جائیں۔"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"<xliff:g id="APP_NAME">%1$s</xliff:g> کھولیں"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> بلبلوں کے لیے ترتیبات"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> کی جانب سے بلبلوں کو اجازت دیں؟"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"نظم کریں"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"مسترد کریں"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"اجازت دیں"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"مجھ سے بعد میں پوچھیں"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> کی جانب سے <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> اور <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> مزید سے <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"منتقل کریں"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"نیچے بائیں جانب لے جائیں"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"نیچے دائیں جانب لے جائیں"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"برخاست کریں"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"چیٹس سامنے رکھیں"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> کی نئی چیٹس بلبلوں کے طور پر ظاہر ہوں گی۔ اسے کھولنے کے لیے کسی بلبلہ کو تھپتھپائیں۔ اسے منتقل کرنے کے لیے گھسیٹیں۔\n\nبلبلہ کو تھپتھپائیں"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"اس ایپ سے بلبلوں کو آف کرنے کے لیے نظم کریں پر تھپتھپائیں"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"سسٹم نیویگیشن اپ ڈیٹ کیا گیا۔ تبدیلیاں کرنے کے لیے، ترتیبات پر جائیں۔"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"سسٹم نیویگیشن اپ ڈیٹ کرنے کے لیے ترتیبات پر جائیں"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"اسٹینڈ بائی"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"دوسری ساختیں دیکھنے کے لیے سوائپ کریں"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 26fe9fc..679a67f 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Bildirishnomalar tovush va tebranish bilan keladi."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Bu kontentni ochuvchi erkin yorliq diqqatingizda boʻladi."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Avvalgi pufakchalar topilmadi"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Bu yerda oxirgi va yopilgan qalqib chiquvchi bildirishnomalar chiqadi."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirishnomalarni tahrirlash imkonsiz."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Ushbu bildirishnomalar guruhi bu yerda sozlanmaydi"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Ishonchli bildirishnoma"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Qurilma xizmatlari"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Nomsiz"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Bu ilovani qaytadan ishga tushirish va butun ekranga ochish uchun bosing."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Ochish: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> pufakchalari uchun sozlamalar"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"<xliff:g id="APP_NAME">%1$s</xliff:g> pufakchalariga ruxsat berilsinmi?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Boshqarish"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Rad etish"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Ruxsat"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Keyinroq soʻralsin"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> ilovasidan <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> va yana <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ta bildirishnoma"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Surish"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Quyi chapga surish"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Quyi oʻngga surish"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Yopish"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Chatlar asosiy planda"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasidan yangi chatlar bulutchalar shaklida chiqadi. Uni ochish uchun bulutchani bosing. Uni surish uchun torting.\n\nBulutchani bosing"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Bu ilova bulutchalarini faolsizlantirish uchun Boshqarish tugmasini bosing"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Tizim navigatsiyasi yangilandi. Buni Sozlamalar orqali oʻzgartirishingiz mumkin."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Tizim navigatsiyasini yangilash uchun Sozlamalarni oching"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Kutib turing"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Boshqa tuzilmalarni koʻrish uchun suring"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index b2118d2..cce3a7c 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Thu hút sự chú ý của bạn bằng cách bật tiếng hoặc rung."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Luôn chú ý vào nội dung này bằng phím tắt nổi."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Không có bong bóng nào gần đây"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Bong bóng đã tắt và bong bóng gần đây sẽ xuất hiện ở đây."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Không thể sửa đổi các thông báo này."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Không thể định cấu hình nhóm thông báo này tại đây"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Thông báo đã xử lý qua máy chủ proxy"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Dịch vụ cho thiết bị"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Không có tiêu đề"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Nhấn để khởi động lại ứng dụng này và xem ở chế độ toàn màn hình."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Mở <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Tùy chọn cài đặt cho bong bóng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Bạn muốn cho phép bong bóng của <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Quản lý"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Từ chối"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Cho phép"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Hỏi tôi sau"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> của <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> từ <xliff:g id="APP_NAME">%2$s</xliff:g> và <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> bong bóng khác"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Di chuyển"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Chuyển tới dưới cùng bên trái"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Chuyển tới dưới cùng bên phải"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Loại bỏ"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Giữ cuộc trò chuyện trên nền trước"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Các cuộc trò chuyện mới từ ứng dụng <xliff:g id="APP_NAME">%1$s</xliff:g> sẽ hiển thị dưới dạng bong bóng. Hãy nhấn vào bong bóng để mở. Kéo để di chuyển cuộc trò chuyện.\n\nNhấn vào bong bóng"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Nhấn vào nút Quản lý để tắt bong bóng từ ứng dụng này"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Đã cập nhật chế độ di chuyển trên hệ thống. Để thay đổi, hãy chuyển đến phần Cài đặt."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Chuyển đến phần Cài đặt để cập nhật chế độ di chuyển trên hệ thống"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Chế độ chờ"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Vuốt để xem các cấu trúc khác"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 518ad18..503f16e 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"通过提示音或振动吸引您的注意。"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"通过可链接到这项内容的浮动快捷方式吸引您的注意。"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近没有气泡"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"此处会显示最近的气泡和已关闭的气泡。"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"无法修改这些通知。"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"您无法在此处配置这组通知"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"代理通知"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"设备服务"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"无标题"</string>
<string name="restart_button_description" msgid="6916116576177456480">"点按即可重启此应用并进入全屏模式。"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"打开<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>气泡的相关设置"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"要允许来自<xliff:g id="APP_NAME">%1$s</xliff:g>的气泡吗?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"拒绝"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"允许"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"以后再说"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g>和另外 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 个应用:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"移动"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"移至左下角"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"移至右下角"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"关闭"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"让聊天在前台运行"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"来自<xliff:g id="APP_NAME">%1$s</xliff:g>的新聊天消息会显示为气泡。点按某个气泡可将其打开。拖动即可移动气泡。\n\n点按该气泡"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"点按“管理”按钮,可关闭来自此应用的气泡"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系统导航已更新。要进行更改,请转到“设置”。"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"转到“设置”即可更新系统导航"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待机"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"滑动即可查看其他结构"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index e39d2c1..6bf7938 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"發出聲音或震動來吸引您的注意。"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"為此內容建立浮動捷徑以保持注意力。"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"沒有最近曾使用的小視窗"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"最近曾使用和關閉的小視窗會在這裡顯示。"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"無法在此設定這組通知"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"代理通知"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"裝置服務"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"無標題"</string>
<string name="restart_button_description" msgid="6916116576177456480">"輕按即可重新開啟此應用程式並放大至全螢幕。"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"開啟「<xliff:g id="APP_NAME">%1$s</xliff:g>」"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」小視窗設定"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"要允許開啟「<xliff:g id="APP_NAME">%1$s</xliff:g>」的小視窗嗎?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"拒絕"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"允許"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"稍後再詢問我"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"來自「<xliff:g id="APP_NAME">%2$s</xliff:g>」的 <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"來自「<xliff:g id="APP_NAME">%2$s</xliff:g>」及另外 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 個應用程式的<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"移動"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"移去左下角"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"移去右下角"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"關閉"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"保持即時通訊在最前面"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的新即時通訊將以小視窗形式顯示。輕按小視窗即可開啟。拖曳即可移動。\n\n輕按小視窗"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"輕按「管理」即可關閉此應用程式的小視窗"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系統導覽已更新。如需變更,請前往「設定」。"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"前往「設定」更新系統導覽"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"滑動即可查看其他結構"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 30f17fc..a90086a 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"發出音效或震動吸引你的注意力。"</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"利用浮動式捷徑快速存取這項內容。"</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"最近沒有任何泡泡"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"最近的泡泡和已關閉的泡泡會顯示在這裡。"</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"無法在這裡設定這個通知群組"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"經過 Proxy 處理的通知"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"裝置服務"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"無標題"</string>
<string name="restart_button_description" msgid="6916116576177456480">"輕觸即可重新啟動這個應用程式並進入全螢幕模式。"</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"開啟「<xliff:g id="APP_NAME">%1$s</xliff:g>」"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」泡泡的設定"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"要允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」顯示泡泡嗎?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"拒絕"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"允許"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"稍後再詢問我"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"「<xliff:g id="APP_NAME">%2$s</xliff:g>」和其他 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 個應用程式:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"移動"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"移至左下方"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"移至右下方"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"關閉"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"讓即時通訊繼續在前景執行"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"系統會以泡泡形式顯示來自「<xliff:g id="APP_NAME">%1$s</xliff:g>」的新即時通訊。輕觸泡泡即可開啟,拖曳則可移動泡泡。\n\n輕觸泡泡"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"輕觸 [管理] 即可關閉來自這個應用程式的泡泡"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"系統操作機制已更新。如要進行變更,請前往「設定」。"</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"請前往「設定」更新系統操作機制"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"待機"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"滑動即可查看其他結構"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 01c3190..9b91ae8 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -699,7 +699,8 @@
<string name="notification_channel_summary_default" msgid="3539949463907902037">"Ithola ukunaka kwakho ngomsindo noma ukudlidliza."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Igcina ukunaka kwakho ngesinqamuleli esintantayo kulokhu okuqukethwe."</string>
<string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Awekho amabhamuza akamuva"</string>
- <string name="bubble_overflow_empty_subtitle" msgid="198257239740933131">"Amabhamuza akamuva namabhamuza asusiwe azobonakala lapha."</string>
+ <!-- no translation found for bubble_overflow_empty_subtitle (2030874469510497397) -->
+ <skip />
<string name="notification_unblockable_desc" msgid="2073030886006190804">"Lezi zaziso azikwazi ukushintshwa."</string>
<string name="notification_multichannel_desc" msgid="7414593090056236179">"Leli qembu lezaziso alikwazi ukulungiselelwa lapha"</string>
<string name="notification_delegate_header" msgid="1264510071031479920">"Isaziso sommeli"</string>
@@ -969,13 +970,8 @@
<string name="device_services" msgid="1549944177856658705">"Amasevisi edivayisi"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Asikho isihloko"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Thepha ukuze uqale kabusha lolu hlelo lokusebenza uphinde uye kusikrini esigcwele."</string>
- <string name="bubbles_deep_link_button_description" msgid="3532375322003698792">"Vula i-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="bubbles_settings_button_description" msgid="7324245408859877545">"Izilungiselelo zamabhamuza e-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
- <string name="bubbles_prompt" msgid="8172381116778530318">"Vumela amabhamuza kusukela ku-<xliff:g id="APP_NAME">%1$s</xliff:g>?"</string>
<string name="manage_bubbles_text" msgid="6856830436329494850">"Phatha"</string>
- <string name="no_bubbles" msgid="1187859094003006292">"Yenqaba"</string>
- <string name="yes_bubbles" msgid="3014008797151197346">"Vumela"</string>
- <string name="ask_me_later_bubbles" msgid="2666199914636253557">"Ngibuze ngesinye isikhathi"</string>
<string name="bubble_content_description_single" msgid="5175160674436546329">"I-<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kusuka ku-<xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
<string name="bubble_content_description_stack" msgid="7907610717462651870">"I-<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kusukela ku-<xliff:g id="APP_NAME">%2$s</xliff:g> nokungu-<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ngaphezulu"</string>
<string name="bubble_accessibility_action_move" msgid="3185080443743819178">"Hambisa"</string>
@@ -984,9 +980,17 @@
<string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Hambisa inkinobho ngakwesokunxele"</string>
<string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Hambisa inkinobho ngakwesokudla"</string>
<string name="bubble_dismiss_text" msgid="7071770411580452911">"Cashisa"</string>
- <string name="bubbles_user_education_title" msgid="3385222165904578710">"Gcina izingxoxo ziphambili"</string>
- <string name="bubbles_user_education_description" msgid="6663205638091146934">"Izingxoxo ezintsha kusuka ku-<xliff:g id="APP_NAME">%1$s</xliff:g>zizovela njengamabhamuza. Thepha ibhamuza ukuze ulivule. Hudula ukuze ulisuse.\n\nThepha ibhamuza"</string>
+ <!-- no translation found for bubbles_dont_bubble_conversation (1033040343437428822) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_title (5547017089271445797) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_description (1160281719576715211) -->
+ <skip />
+ <!-- no translation found for bubbles_user_education_manage_title (2848511858160342320) -->
+ <skip />
<string name="bubbles_user_education_manage" msgid="1391639189507036423">"Thepha okuthi Phatha ukuvala amabhamuza kusuka kulolu hlelo lokusebenza"</string>
+ <!-- no translation found for bubbles_user_education_got_it (8282812431953161143) -->
+ <skip />
<string name="notification_content_system_nav_changed" msgid="5077913144844684544">"Ukuzulazula kwesistimu kubuyekeziwe. Ukuze wenze ushintsho, hamba kokuthi Izilungiselelo."</string>
<string name="notification_content_gesture_nav_available" msgid="4431460803004659888">"Hamba kuzilungiselelo ukuze ubuyekeze ukuzulazula kwesistimu"</string>
<string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Ilindile"</string>
@@ -1013,4 +1017,6 @@
<string name="controls_structure_tooltip" msgid="1392966215435667434">"Swayipha ukubona ezinye izakhiwo"</string>
<!-- no translation found for controls_seeding_in_progress (3033855341410264148) -->
<skip />
+ <!-- no translation found for controls_media_close_session (9023534788828414585) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index ae38e34..f71c0b3 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1819,6 +1819,18 @@
<!-- [CHAR LIMIT=150] Notification Importance title: bubble level summary -->
<string name="notification_channel_summary_bubble">Keeps your attention with a floating shortcut to this content.</string>
+ <!-- [CHAR LIMIT=150] Notification Importance title: important conversation level summary -->
+ <string name="notification_channel_summary_priority">Shows at top of conversation section and appears as a bubble.</string>
+
+ <!--[CHAR LIMIT=150] Conversation inline controls footer shown when all conversations from the app are allowed to show as bubbles -->
+ <string name="notification_conversation_channel_all_bubble">All conversations from <xliff:g id="app_name" example="YouTube">%1$s</xliff:g> bubble by default. Manage in <xliff:g id="app_name" example="Settings">%2$s</xliff:g>.</string>
+
+ <!--[CHAR LIMIT=30] Linkable text to Settings app -->
+ <string name="notification_conversation_channel_settings">Settings</string>
+
+ <!-- [CHAR LIMIT=150] Notification Importance title: important conversation level -->
+ <string name="notification_priority_title">Priority</string>
+
<!-- [CHAR LIMIT=NONE] Empty overflow title -->
<string name="bubble_overflow_empty_title">No recent bubbles</string>
@@ -2623,13 +2635,15 @@
<string name="magnification_controls_title">Magnification Window Controls</string>
<!-- Quick Controls strings -->
- <!-- Quick Controls view header [CHAR LIMIT=30] -->
+ <!-- Quick Controls empty state, title [CHAR LIMIT=30] -->
<string name="quick_controls_title">Quick Controls</string>
+ <!-- Quick Controls empty state, subtitle [CHAR LIMIT=100] -->
+ <string name="quick_controls_subtitle">Add controls for your connected devices</string>
<!-- Controls management providers screen title [CHAR LIMIT=30]-->
<string name="controls_providers_title">Add Controls</string>
<!-- Controls management providers screen subtitle [CHAR LIMIT=NONE] -->
- <string name="controls_providers_subtitle">Choose an app from which to add controls</string>
+ <string name="controls_providers_subtitle">Choose app to add controls</string>
<!-- Number of favorites for controls management screen [CHAR LIMIT=NONE]-->
<plurals name="controls_number_of_favorites">
<item quantity="one"><xliff:g id="number" example="1">%s</xliff:g> control added.</item>
@@ -2639,7 +2653,9 @@
<!-- Controls management controls screen default title [CHAR LIMIT=30] -->
<string name="controls_favorite_default_title">Controls</string>
<!-- Controls management controls screen subtitle [CHAR LIMIT=NONE] -->
- <string name="controls_favorite_subtitle">Choose controls for quick access</string>
+ <string name="controls_favorite_subtitle">Choose controls to access from the power menu</string>
+ <!-- Controls management controls screen, user direction for rearranging controls [CHAR LIMIT=NONE] -->
+ <string name="controls_favorite_rearrange">Hold and drag a control to move it</string>
<!-- Controls management controls screen error on load message [CHAR LIMIT=60] -->
<string name="controls_favorite_load_error">The list of all controls could not be loaded.</string>
@@ -2647,21 +2663,35 @@
<string name="controls_favorite_other_zone_header">Other</string>
<!-- Controls dialog title [CHAR LIMIT=30] -->
- <string name="controls_dialog_title">Add to Quick Controls</string>
+ <string name="controls_dialog_title">Add to quick controls</string>
<!-- Controls dialog add to favorites [CHAR LIMIT=30] -->
<string name="controls_dialog_ok">Add to favorites</string>
<!-- Controls dialog message [CHAR LIMIT=NONE] -->
<string name="controls_dialog_message"><xliff:g id="app" example="System UI">%s</xliff:g> suggested this control to add to your favorites.</string>
+ <!-- Controls dialog confirmation [CHAR LIMIT=30] -->
+ <string name="controls_dialog_confirmation">Controls updated</string>
<!-- Controls PIN entry dialog, switch to alphanumeric keyboard [CHAR LIMIT=100] -->
<string name="controls_pin_use_alphanumeric">PIN contains letters or symbols</string>
<!-- Controls PIN entry dialog, title [CHAR LIMIT=30] -->
- <string name="controls_pin_verify">Verify device PIN</string>
+ <string name="controls_pin_verify">Verify <xliff:g id="device" example="Backdoor lock">%s</xliff:g></string>
+ <!-- Controls PIN entry dialog, waiting to verify [CHAR LIMIT=30] -->
+ <string name="controls_pin_verifying">Verifying\u2026</string>
<!-- Controls PIN entry dialog, text hint [CHAR LIMIT=30] -->
<string name="controls_pin_instructions">Enter PIN</string>
+ <!-- Controls passphrase entry dialog, text hint [CHAR LIMIT=30] -->
+ <string name="controls_passphrase_instructions">Enter passphrase</string>
+ <!-- Controls PIN entry dialog, text hint, retry [CHAR LIMIT=30] -->
+ <string name="controls_pin_instructions_retry">Try another PIN</string>
+ <!-- Controls passphrase entry dialog, text hint, retry [CHAR LIMIT=50] -->
+ <string name="controls_passphrase_instructions_retry">Try another passphrase</string>
+ <!-- Controls confirmation dialog, waiting to confirm [CHAR LIMIT=30] -->
+ <string name="controls_confirmation_confirming">Confirming\u2026</string>
+ <!-- Controls confirmation dialog, user prompt [CHAR LIMIT=NONE] -->
+ <string name="controls_confirmation_message">Confirm change for <xliff:g id="device" example="Backdoor lock">%s</xliff:g></string>
<!-- Tooltip to show in management screen when there are multiple structures [CHAR_LIMIT=50] -->
- <string name="controls_structure_tooltip">Swipe to see other structures</string>
+ <string name="controls_structure_tooltip">Swipe to see more</string>
<!-- Message to tell the user to wait while systemui attempts to load a set of
recommended controls [CHAR_LIMIT=30] -->
@@ -2669,4 +2699,18 @@
<!-- Close the controls associated with a specific media session [CHAR_LIMIT=NONE] -->
<string name="controls_media_close_session">Close this media session</string>
+
+ <!-- Error message indicating that a control timed out while waiting for an update [CHAR_LIMIT=30] -->
+ <string name="controls_error_timeout">Inactive, check app</string>
+ <!-- Error message indicating that a control action failed [CHAR_LIMIT=30] -->
+ <string name="controls_error_failed">Error, try again</string>
+ <!-- Stateless control message informing the user that a routine has started [CHAR_LIMIT=30] -->
+ <string name="controls_in_progress">In progress</string>
+ <!-- Tooltip informing user where the recently added controls are [CHAR_LIMIT=100] -->
+ <string name="controls_added_tooltip">Hold Power button to see new controls</string>
+
+ <!-- Controls menu, add [CHAR_LIMIT=30] -->
+ <string name="controls_menu_add">Add controls</string>
+ <!-- Controls menu, edit [CHAR_LIMIT=30] -->
+ <string name="controls_menu_edit">Edit controls</string>
</resources>
diff --git a/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java b/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java
index 85724a9..7eb5a8f 100644
--- a/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java
+++ b/packages/SystemUI/src/com/android/keyguard/AdminSecondaryLockScreenController.java
@@ -170,9 +170,15 @@
private void onSurfaceReady() {
try {
- mClient.onSurfaceReady(mView.getHostToken(), mCallback);
+ IBinder hostToken = mView.getHostToken();
+ // Should never be null when SurfaceView is attached to window.
+ if (hostToken != null) {
+ mClient.onCreateKeyguardSurface(hostToken, mCallback);
+ } else {
+ hide();
+ }
} catch (RemoteException e) {
- Log.e(TAG, "Error in onSurfaceReady", e);
+ Log.e(TAG, "Error in onCreateKeyguardSurface", e);
dismiss(KeyguardUpdateMonitor.getCurrentUser());
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 90df124..18357a9 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -962,18 +962,19 @@
private void updateSecondaryLockscreenRequirement(int userId) {
Intent oldIntent = mSecondaryLockscreenRequirement.get(userId);
- boolean enabled = mDevicePolicyManager.isSecondaryLockscreenEnabled(userId);
+ boolean enabled = mDevicePolicyManager.isSecondaryLockscreenEnabled(UserHandle.of(userId));
boolean changed = false;
if (enabled && (oldIntent == null)) {
- ResolveInfo resolveInfo =
- mContext.getPackageManager().resolveService(
- new Intent(
- DevicePolicyManager.ACTION_BIND_SECONDARY_LOCKSCREEN_SERVICE),
- 0);
+ Intent intent = new Intent(
+ DevicePolicyManager.ACTION_BIND_SECONDARY_LOCKSCREEN_SERVICE);
+ ComponentName profileOwnerComponent =
+ mDevicePolicyManager.getProfileOwnerAsUser(userId);
+ intent.setComponent(profileOwnerComponent);
+ ResolveInfo resolveInfo = mContext.getPackageManager().resolveService(intent, 0);
if (resolveInfo != null) {
Intent newIntent = new Intent();
- newIntent.setComponent(resolveInfo.serviceInfo.getComponentName());
+ newIntent.setComponent(profileOwnerComponent);
mSecondaryLockscreenRequirement.put(userId, newIntent);
changed = true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java
index 7c4e61c..726a7dd 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java
@@ -433,7 +433,7 @@
PendingIntent getBubbleIntent() {
Notification.BubbleMetadata data = mEntry.getBubbleMetadata();
if (data != null) {
- return data.getBubbleIntent();
+ return data.getIntent();
}
return null;
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
index b39dd1a..c9ce8a1 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
@@ -1305,7 +1305,7 @@
*/
static boolean canLaunchInActivityView(Context context, NotificationEntry entry) {
PendingIntent intent = entry.getBubbleMetadata() != null
- ? entry.getBubbleMetadata().getBubbleIntent()
+ ? entry.getBubbleMetadata().getIntent()
: null;
if (entry.getBubbleMetadata() != null
&& entry.getBubbleMetadata().getShortcutId() != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExperimentConfig.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExperimentConfig.java
index b33eeba..41dbb48 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExperimentConfig.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExperimentConfig.java
@@ -256,8 +256,7 @@
}
}
if (intent != null) {
- return new Notification.BubbleMetadata.Builder()
- .createIntentBubble(intent, icon)
+ return new Notification.BubbleMetadata.Builder(intent, icon)
.setDesiredHeight(BUBBLE_HEIGHT)
.build();
}
@@ -265,9 +264,8 @@
}
static Notification.BubbleMetadata createForShortcut(String shortcutId) {
- return new Notification.BubbleMetadata.Builder()
+ return new Notification.BubbleMetadata.Builder(shortcutId)
.setDesiredHeight(BUBBLE_HEIGHT)
- .createShortcutBubble(shortcutId)
.build();
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleIconFactory.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleIconFactory.java
index 5c536c3..74231c6 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleIconFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleIconFactory.java
@@ -58,7 +58,7 @@
int density = context.getResources().getConfiguration().densityDpi;
return launcherApps.getShortcutIconDrawable(shortcutInfo, density);
} else {
- Icon ic = metadata.getBubbleIcon();
+ Icon ic = metadata.getIcon();
if (ic != null) {
if (ic.getType() == Icon.TYPE_URI
|| ic.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) {
diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt
index 2494fd1..15c2a0a 100644
--- a/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt
+++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt
@@ -50,7 +50,8 @@
cvh.context,
android.R.style.Theme_DeviceDefault_Dialog_Alert
).apply {
- setTitle(R.string.controls_pin_verify)
+ val res = cvh.context.resources
+ setTitle(res.getString(R.string.controls_pin_verify, *arrayOf(cvh.title.getText())))
setView(R.layout.controls_dialog_pin)
setPositiveButton(
android.R.string.ok,
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 1cd6388..df85ed5 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -670,6 +670,12 @@
});
}
startConnectionToCurrentUser();
+
+ // Clean up the minimized state if launcher dies
+ Divider divider = mDividerOptional.get();
+ if (divider != null) {
+ divider.setMinimized(false);
+ }
}
public void startConnectionToCurrentUser() {
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java
index d7eab3a..d58cc73 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java
@@ -273,10 +273,12 @@
}
// Update all the adjusted-for-ime states
- mView.setAdjustedForIme(mTargetShown, mTargetShown
- ? DisplayImeController.ANIMATION_DURATION_SHOW_MS
- : DisplayImeController.ANIMATION_DURATION_HIDE_MS);
- setAdjustedForIme(mTargetShown);
+ if (!mPaused) {
+ mView.setAdjustedForIme(mTargetShown, mTargetShown
+ ? DisplayImeController.ANIMATION_DURATION_SHOW_MS
+ : DisplayImeController.ANIMATION_DURATION_HIDE_MS);
+ }
+ setAdjustedForIme(mTargetShown && !mPaused);
}
@Override
@@ -390,6 +392,9 @@
mTargetPrimaryDim = mTargetSecondaryDim = 0.f;
updateImeAdjustState();
startAsyncAnimation();
+ if (mAnimation != null) {
+ mAnimation.end();
+ }
});
}
@@ -605,15 +610,17 @@
+ mHomeStackResizable + "->" + homeStackResizable + " split:" + inSplitMode());
}
WindowContainerTransaction wct = new WindowContainerTransaction();
+ final boolean minimizedChanged = mMinimized != minimized;
// Update minimized state
- if (mMinimized != minimized) {
+ if (minimizedChanged) {
mMinimized = minimized;
}
// Always set this because we could be entering split when mMinimized is already true
wct.setFocusable(mSplits.mPrimary.token, !mMinimized);
// Update home-stack resizability
- if (mHomeStackResizable != homeStackResizable) {
+ final boolean homeResizableChanged = mHomeStackResizable != homeStackResizable;
+ if (homeResizableChanged) {
mHomeStackResizable = homeStackResizable;
if (inSplitMode()) {
WindowManagerProxy.applyHomeTasksMinimized(
@@ -629,7 +636,10 @@
if (mMinimized) {
mImePositionProcessor.pause(displayId);
}
- mView.setMinimizedDockStack(minimized, getAnimDuration(), homeStackResizable);
+ if (minimizedChanged || homeResizableChanged) {
+ // This conflicts with IME adjustment, so only call it when things change.
+ mView.setMinimizedDockStack(minimized, getAnimDuration(), homeStackResizable);
+ }
if (!mMinimized) {
// afterwards so it can end any animations started in view
mImePositionProcessor.resume(displayId);
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitDisplayLayout.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitDisplayLayout.java
index 271faed..deead34 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitDisplayLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitDisplayLayout.java
@@ -191,13 +191,24 @@
final int currDividerWidth =
(int) (dividerWidthInactive * shownFraction + dividerWidth * (1.f - shownFraction));
+ // Calculate the highest we can move the bottom of the top stack to keep 30% visible.
final int minTopStackBottom = displayStableRect.top
+ (int) ((mPrimary.bottom - displayStableRect.top) * ADJUSTED_STACK_FRACTION_MIN);
- final int minImeTop = minTopStackBottom + currDividerWidth;
-
- // Calculate an offset which shifts the stacks up by the height of the IME, but still
- // leaves at least 30% of the top stack visible.
- final int yOffset = Math.max(0, dl.height() - Math.max(currImeTop, minImeTop));
+ // Based on that, calculate the maximum amount we'll allow the ime to shift things.
+ final int maxOffset = mPrimary.bottom - minTopStackBottom;
+ // Calculate how much we would shift things without limits (basically the height of ime).
+ final int desiredOffset = hiddenTop - shownTop;
+ // Calculate an "adjustedTop" which is the currImeTop but restricted by our constraints.
+ // We want an effect where the adjustment only occurs during the "highest" portion of the
+ // ime animation. This is done by shifting the adjustment values by the difference in
+ // offsets (effectively playing the whole adjustment animation some fixed amount of pixels
+ // below the ime top).
+ final int topCorrection = Math.max(0, desiredOffset - maxOffset);
+ final int adjustedTop = currImeTop + topCorrection;
+ // The actual yOffset is the distance between adjustedTop and the bottom of the display.
+ // Since our adjustedTop values are playing "below" the ime, we clamp at 0 so we only
+ // see adjustment upward.
+ final int yOffset = Math.max(0, dl.height() - adjustedTop);
// TOP
// Reduce the offset by an additional small amount to squish the divider bar.
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java
index 48ea4ae..f1bb27a 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java
@@ -30,7 +30,6 @@
import android.util.Log;
import android.view.Display;
import android.view.ITaskOrganizer;
-import android.view.IWindowContainer;
import android.view.SurfaceControl;
import android.view.SurfaceSession;
@@ -108,6 +107,8 @@
* presentations based on the contents of the split regions.
*/
private void handleTaskInfoChanged(RunningTaskInfo info) {
+ final boolean secondaryWasHomeOrRecents = mSecondary.topActivityType == ACTIVITY_TYPE_HOME
+ || mSecondary.topActivityType == ACTIVITY_TYPE_RECENTS;
final boolean primaryWasEmpty = mPrimary.topActivityType == ACTIVITY_TYPE_UNDEFINED;
final boolean secondaryWasEmpty = mSecondary.topActivityType == ACTIVITY_TYPE_UNDEFINED;
if (info.token.asBinder() == mPrimary.token.asBinder()) {
@@ -117,9 +118,16 @@
}
final boolean primaryIsEmpty = mPrimary.topActivityType == ACTIVITY_TYPE_UNDEFINED;
final boolean secondaryIsEmpty = mSecondary.topActivityType == ACTIVITY_TYPE_UNDEFINED;
+ final boolean secondaryIsHomeOrRecents = mSecondary.topActivityType == ACTIVITY_TYPE_HOME
+ || mSecondary.topActivityType == ACTIVITY_TYPE_RECENTS;
if (DEBUG) {
Log.d(TAG, "onTaskInfoChanged " + mPrimary + " " + mSecondary);
}
+ if (primaryIsEmpty == primaryWasEmpty && secondaryWasEmpty == secondaryIsEmpty
+ && secondaryWasHomeOrRecents == secondaryIsHomeOrRecents) {
+ // No relevant changes
+ return;
+ }
if (primaryIsEmpty || secondaryIsEmpty) {
// At-least one of the splits is empty which means we are currently transitioning
// into or out-of split-screen mode.
@@ -146,8 +154,7 @@
}
mDivider.startEnterSplit();
}
- } else if (mSecondary.topActivityType == ACTIVITY_TYPE_HOME
- || mSecondary.topActivityType == ACTIVITY_TYPE_RECENTS) {
+ } else if (secondaryIsHomeOrRecents) {
// Both splits are populated but the secondary split has a home/recents stack on top,
// so enter minimized mode.
mDivider.ensureMinimizedSplit();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java
index 164215b..b57b22f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java
@@ -50,7 +50,9 @@
if (endRunnable != null) {
endRunnable.run();
}
- view.setVisibility(View.INVISIBLE);
+ if (view.getVisibility() != View.GONE) {
+ view.setVisibility(View.INVISIBLE);
+ }
}
});
if (view.hasOverlappingRendering()) {
@@ -75,7 +77,7 @@
*/
public static void fadeOut(View view, float fadeOutAmount, boolean remap) {
view.animate().cancel();
- if (fadeOutAmount == 1.0f) {
+ if (fadeOutAmount == 1.0f && view.getVisibility() != View.GONE) {
view.setVisibility(View.INVISIBLE);
} else if (view.getVisibility() == View.INVISIBLE) {
view.setVisibility(View.VISIBLE);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java
index 4759d56..ba3db09 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java
@@ -28,6 +28,7 @@
import android.widget.TextView;
import com.android.internal.util.ContrastColorUtil;
+import com.android.internal.widget.ConversationLayout;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationContentView;
@@ -42,6 +43,7 @@
private static final TextViewComparator sTextViewComparator = new TextViewComparator();
private static final VisibilityApplicator sVisibilityApplicator = new VisibilityApplicator();
+ private static final VisibilityApplicator sAppNameApplicator = new AppNameApplicator();
private static final DataExtractor sIconExtractor = new DataExtractor() {
@Override
public Object extractData(ExpandableNotificationRow row) {
@@ -64,7 +66,7 @@
};
private final static ResultApplicator mGreyApplicator = new ResultApplicator() {
@Override
- public void apply(View view, boolean apply) {
+ public void apply(View parent, View view, boolean apply, boolean reset) {
NotificationHeaderView header = (NotificationHeaderView) view;
ImageView icon = (ImageView) view.findViewById(
com.android.internal.R.id.icon);
@@ -132,8 +134,12 @@
}
},
sVisibilityApplicator));
- mComparators.add(HeaderProcessor.forTextView(mRow,
- com.android.internal.R.id.app_name_text));
+ mComparators.add(new HeaderProcessor(
+ mRow,
+ com.android.internal.R.id.app_name_text,
+ null,
+ sTextViewComparator,
+ sAppNameApplicator));
mComparators.add(HeaderProcessor.forTextView(mRow,
com.android.internal.R.id.header_text));
mDividers.add(com.android.internal.R.id.header_text_divider);
@@ -299,19 +305,19 @@
public void apply(ExpandableNotificationRow row, boolean reset) {
boolean apply = mApply && !reset;
if (row.isSummaryWithChildren()) {
- applyToView(apply, row.getNotificationHeader());
+ applyToView(apply, reset, row.getNotificationHeader());
return;
}
- applyToView(apply, row.getPrivateLayout().getContractedChild());
- applyToView(apply, row.getPrivateLayout().getHeadsUpChild());
- applyToView(apply, row.getPrivateLayout().getExpandedChild());
+ applyToView(apply, reset, row.getPrivateLayout().getContractedChild());
+ applyToView(apply, reset, row.getPrivateLayout().getHeadsUpChild());
+ applyToView(apply, reset, row.getPrivateLayout().getExpandedChild());
}
- private void applyToView(boolean apply, View parent) {
+ private void applyToView(boolean apply, boolean reset, View parent) {
if (parent != null) {
View view = parent.findViewById(mId);
if (view != null && !mComparator.isEmpty(view)) {
- mApplicator.apply(view, apply);
+ mApplicator.apply(parent, view, apply, reset);
}
}
}
@@ -375,14 +381,26 @@
}
private interface ResultApplicator {
- void apply(View view, boolean apply);
+ void apply(View parent, View view, boolean apply, boolean reset);
}
private static class VisibilityApplicator implements ResultApplicator {
@Override
- public void apply(View view, boolean apply) {
+ public void apply(View parent, View view, boolean apply, boolean reset) {
view.setVisibility(apply ? View.GONE : View.VISIBLE);
}
}
+
+ private static class AppNameApplicator extends VisibilityApplicator {
+
+ @Override
+ public void apply(View parent, View view, boolean apply, boolean reset) {
+ if (reset && parent instanceof ConversationLayout) {
+ ConversationLayout layout = (ConversationLayout) parent;
+ apply = layout.shouldHideAppName();
+ }
+ super.apply(parent, view, apply, reset);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java
index 2a45bc2..83e51cd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java
@@ -49,6 +49,14 @@
mTransformedViews.put(key, transformedView);
}
+ public void addTransformedView(View transformedView) {
+ int key = transformedView.getId();
+ if (key == View.NO_ID) {
+ throw new IllegalArgumentException("View argument does not have a valid id");
+ }
+ addTransformedView(key, transformedView);
+ }
+
/**
* Add a view that transforms to a similar sibling, meaning that we should consider any mapping
* found treated as the same viewType. This is useful for imageViews, where it's hard to compare
@@ -62,6 +70,14 @@
mKeysTransformingToSimilar.add(key);
}
+ public void addViewTransformingToSimilar(View transformedView) {
+ int key = transformedView.getId();
+ if (key == View.NO_ID) {
+ throw new IllegalArgumentException("View argument does not have a valid id");
+ }
+ addViewTransformingToSimilar(key, transformedView);
+ }
+
public void reset() {
mTransformedViews.clear();
mKeysTransformingToSimilar.clear();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingImageTransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingImageTransformState.java
index a3fb225..2ee2153 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingImageTransformState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingImageTransformState.java
@@ -82,7 +82,7 @@
float startActualWidth = getStartActualWidth();
mImageMessage.setActualWidth(
(int) NotificationUtils.interpolate(startActualWidth,
- mImageMessage.getStaticWidth(),
+ mImageMessage.getWidth(),
interpolatedValue));
float startActualHeight = getStartActualHeight();
mImageMessage.setActualHeight(
@@ -121,7 +121,7 @@
@Override
protected void resetTransformedView() {
super.resetTransformedView();
- mImageMessage.setActualWidth(mImageMessage.getStaticWidth());
+ mImageMessage.setActualWidth(mImageMessage.getWidth());
mImageMessage.setActualHeight(mImageMessage.getHeight());
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingLayoutTransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingLayoutTransformState.java
index 9383f53..5ee4693 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingLayoutTransformState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingLayoutTransformState.java
@@ -102,11 +102,11 @@
MessagingGroup matchingGroup = pairs.get(ownGroup);
if (!isGone(ownGroup)) {
if (matchingGroup != null) {
- transformGroups(ownGroup, matchingGroup, transformationAmount, to);
+ int totalTranslation = transformGroups(ownGroup, matchingGroup,
+ transformationAmount, to);
if (lastPairedGroup == null) {
lastPairedGroup = ownGroup;
if (to){
- float totalTranslation = ownGroup.getTop() - matchingGroup.getTop();
currentTranslation = matchingGroup.getAvatar().getTranslationY()
- totalTranslation;
} else {
@@ -229,14 +229,19 @@
return result;
}
- private void transformGroups(MessagingGroup ownGroup, MessagingGroup otherGroup,
+ /**
+ * Transform two groups towards each other.
+ *
+ * @return the total transformation distance that the group goes through
+ */
+ private int transformGroups(MessagingGroup ownGroup, MessagingGroup otherGroup,
float transformationAmount, boolean to) {
boolean useLinearTransformation =
otherGroup.getIsolatedMessage() == null && !mTransformInfo.isAnimating();
transformView(transformationAmount, to, ownGroup.getSenderView(), otherGroup.getSenderView(),
true /* sameAsAny */, useLinearTransformation);
- transformView(transformationAmount, to, ownGroup.getAvatar(), otherGroup.getAvatar(),
- true /* sameAsAny */, useLinearTransformation);
+ int totalAvatarTranslation = transformView(transformationAmount, to, ownGroup.getAvatar(),
+ otherGroup.getAvatar(), true /* sameAsAny */, useLinearTransformation);
List<MessagingMessage> ownMessages = ownGroup.getMessages();
List<MessagingMessage> otherMessages = otherGroup.getMessages();
float previousTranslation = 0;
@@ -245,6 +250,7 @@
if (isGone(child)) {
continue;
}
+ float messageAmount = transformationAmount;
int otherIndex = otherMessages.size() - 1 - i;
View otherChild = null;
if (otherIndex >= 0) {
@@ -257,18 +263,19 @@
// Let's fade out as we approach the top of the screen. We can only do this if
// we're actually moving up
float distanceToTop = child.getTop() + child.getHeight() + previousTranslation;
- transformationAmount = distanceToTop / child.getHeight();
- transformationAmount = Math.max(0.0f, Math.min(1.0f, transformationAmount));
+ messageAmount = distanceToTop / child.getHeight();
+ messageAmount = Math.max(0.0f, Math.min(1.0f, messageAmount));
if (to) {
- transformationAmount = 1.0f - transformationAmount;
+ messageAmount = 1.0f - messageAmount;
}
}
- transformView(transformationAmount, to, child, otherChild, false, /* sameAsAny */
- useLinearTransformation);
+ int totalTranslation = transformView(messageAmount, to, child, otherChild,
+ false /* sameAsAny */, useLinearTransformation);
boolean otherIsIsolated = otherGroup.getIsolatedMessage() == otherChild;
- if (transformationAmount == 0.0f
+ if (messageAmount == 0.0f
&& (otherIsIsolated || otherGroup.isSingleLine())) {
ownGroup.setClippingDisabled(true);
+ mMessagingLayout.setMessagingClippingDisabled(true);
}
if (otherChild == null) {
child.setTranslationY(previousTranslation);
@@ -276,23 +283,28 @@
} else if (ownGroup.getIsolatedMessage() == child || otherIsIsolated) {
// We don't want to add any translation for the image that is transforming
} else if (to) {
- float totalTranslation = child.getTop() + ownGroup.getTop()
- - otherChild.getTop() - otherChild.getTop();
previousTranslation = otherChild.getTranslationY() - totalTranslation;
} else {
previousTranslation = child.getTranslationY();
}
}
ownGroup.updateClipRect();
+ return totalAvatarTranslation;
}
- private void transformView(float transformationAmount, boolean to, View ownView,
+ /**
+ * Transform a view to another view.
+ *
+ * @return the total translationY this view goes through
+ */
+ private int transformView(float transformationAmount, boolean to, View ownView,
View otherView, boolean sameAsAny, boolean useLinearTransformation) {
TransformState ownState = TransformState.createFrom(ownView, mTransformInfo);
if (useLinearTransformation) {
ownState.setDefaultInterpolator(Interpolators.LINEAR);
}
ownState.setIsSameAsAnyView(sameAsAny && !isGone(otherView));
+ int totalTranslationDistance = 0;
if (to) {
if (otherView != null) {
TransformState otherState = TransformState.createFrom(otherView, mTransformInfo);
@@ -306,6 +318,8 @@
// since avatars serve as anchors for the rest of the layout transition
ownState.transformViewVerticalTo(otherState, transformationAmount);
}
+ totalTranslationDistance = ownState.getLaidOutLocationOnScreen()[1]
+ - otherState.getLaidOutLocationOnScreen()[1];
otherState.recycle();
} else {
ownState.disappear(transformationAmount, null);
@@ -323,12 +337,15 @@
// since avatars serve as anchors for the rest of the layout transition
ownState.transformViewVerticalFrom(otherState, transformationAmount);
}
+ totalTranslationDistance = ownState.getLaidOutLocationOnScreen()[1]
+ - otherState.getLaidOutLocationOnScreen()[1];
otherState.recycle();
} else {
ownState.appear(transformationAmount, null);
}
}
ownState.recycle();
+ return totalTranslationDistance;
}
private HashMap<MessagingGroup, MessagingGroup> findPairs(ArrayList<MessagingGroup> ownGroups,
@@ -362,6 +379,9 @@
if (view.getVisibility() == View.GONE) {
return true;
}
+ if (view.getParent() == null) {
+ return true;
+ }
final ViewGroup.LayoutParams lp = view.getLayoutParams();
if (lp instanceof MessagingLinearLayout.LayoutParams
&& ((MessagingLinearLayout.LayoutParams) lp).hide) {
@@ -433,6 +453,7 @@
ownGroup.setClippingDisabled(false);
ownGroup.updateClipRect();
}
+ mMessagingLayout.setMessagingClippingDisabled(false);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java
index 337f312..82fb491 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java
@@ -100,7 +100,7 @@
transformViewFullyFrom(otherState, transformationAmount);
}
- protected void ensureVisible() {
+ public void ensureVisible() {
if (mTransformedView.getVisibility() == View.INVISIBLE
|| mTransformedView.getAlpha() != 1.0f) {
// We have the same content, lets show ourselves
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt
index 8674047..1d5c289 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt
@@ -78,12 +78,6 @@
val aPersonType = a.getPeopleNotificationType()
val bPersonType = b.getPeopleNotificationType()
- val aIsPeople = aPersonType == TYPE_PERSON
- val bIsPeople = bPersonType == TYPE_PERSON
-
- val aIsImportantPeople = aPersonType == TYPE_IMPORTANT_PERSON
- val bIsImportantPeople = bPersonType == TYPE_IMPORTANT_PERSON
-
val aMedia = isImportantMedia(a)
val bMedia = isImportantMedia(b)
@@ -100,9 +94,14 @@
aHeadsUp != bHeadsUp -> if (aHeadsUp) -1 else 1
// Provide consistent ranking with headsUpManager
aHeadsUp -> headsUpManager.compare(a, b)
- usePeopleFiltering && aIsPeople != bIsPeople -> if (aIsPeople) -1 else 1
- usePeopleFiltering && aIsImportantPeople != bIsImportantPeople ->
- if (aIsImportantPeople) -1 else 1
+ usePeopleFiltering && aPersonType != bPersonType -> when (aPersonType) {
+ TYPE_IMPORTANT_PERSON -> -1
+ TYPE_PERSON -> when (bPersonType) {
+ TYPE_IMPORTANT_PERSON -> 1
+ else -> -1
+ }
+ else -> 1
+ }
// Upsort current media notification.
aMedia != bMedia -> if (aMedia) -1 else 1
// Upsort PRIORITY_MAX system notifications
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
index 46d5044..324bc92 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImpl.java
@@ -156,7 +156,7 @@
if (entry.getBubbleMetadata() == null
|| (entry.getBubbleMetadata().getShortcutId() == null
- && entry.getBubbleMetadata().getBubbleIntent() == null)) {
+ && entry.getBubbleMetadata().getIntent() == null)) {
if (DEBUG) {
Log.d(TAG, "No bubble up: notification: " + sbn.getKey()
+ " doesn't have valid metadata");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
index 1088cdc3..8e2bfb8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java
@@ -20,11 +20,10 @@
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_LOW;
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
-import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_CACHED;
-import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC;
-import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED;
import static android.provider.Settings.Secure.BUBBLE_IMPORTANT_CONVERSATIONS;
+import static com.android.systemui.Interpolators.FAST_OUT_SLOW_IN;
+
import static java.lang.annotation.RetentionPolicy.SOURCE;
import android.annotation.IntDef;
@@ -36,7 +35,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
-import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
@@ -49,6 +47,10 @@
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
import android.text.TextUtils;
+import android.transition.ChangeBounds;
+import android.transition.Fade;
+import android.transition.TransitionManager;
+import android.transition.TransitionSet;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Slog;
@@ -65,13 +67,10 @@
import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.Dependency;
import com.android.systemui.R;
-import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.statusbar.notification.VisualStabilityManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-import com.android.systemui.statusbar.phone.ShadeController;
import java.lang.annotation.Retention;
-import java.util.Arrays;
import java.util.List;
/**
@@ -83,11 +82,9 @@
private INotificationManager mINotificationManager;
- private LauncherApps mLauncherApps;
ShortcutManager mShortcutManager;
private PackageManager mPm;
private VisualStabilityManager mVisualStabilityManager;
- private ShadeController mShadeController;
private ConversationIconFactory mIconFactory;
private String mPackageName;
@@ -97,44 +94,34 @@
private NotificationChannel mNotificationChannel;
private ShortcutInfo mShortcutInfo;
private String mConversationId;
- private NotificationEntry mEntry;
private StatusBarNotification mSbn;
private boolean mIsDeviceProvisioned;
- private boolean mStartedAsBubble;
- private boolean mIsBubbleable;
+ private TextView mPriorityDescriptionView;
+ private TextView mDefaultDescriptionView;
+ private TextView mSilentDescriptionView;
private @Action int mSelectedAction = -1;
private OnSnoozeClickListener mOnSnoozeClickListener;
private OnSettingsClickListener mOnSettingsClickListener;
private NotificationGuts mGutsContainer;
- private BubbleController mBubbleController;
@VisibleForTesting
boolean mSkipPost = false;
@Retention(SOURCE)
- @IntDef({ACTION_BUBBLE, ACTION_HOME, ACTION_FAVORITE, ACTION_SNOOZE, ACTION_MUTE,
- ACTION_UNBUBBLE, ACTION_SETTINGS})
+ @IntDef({ACTION_DEFAULT, ACTION_HOME, ACTION_FAVORITE, ACTION_SNOOZE, ACTION_MUTE,
+ ACTION_SETTINGS})
private @interface Action {}
- static final int ACTION_BUBBLE = 0;
+ static final int ACTION_DEFAULT = 0;
static final int ACTION_HOME = 1;
static final int ACTION_FAVORITE = 2;
static final int ACTION_SNOOZE = 3;
static final int ACTION_MUTE = 4;
static final int ACTION_SETTINGS = 5;
- static final int ACTION_UNBUBBLE = 6;
- private OnClickListener mOnBubbleClick = v -> {
- mSelectedAction = mStartedAsBubble ? ACTION_UNBUBBLE : ACTION_BUBBLE;
- if (mStartedAsBubble) {
- mBubbleController.onUserDemotedBubbleFromNotification(mEntry);
- } else {
- mBubbleController.onUserCreatedBubbleFromNotification(mEntry);
- }
- closeControls(v, true);
- };
-
+ // TODO: b/152050825
+ /*
private OnClickListener mOnHomeClick = v -> {
mSelectedAction = ACTION_HOME;
mShortcutManager.requestPinShortcut(mShortcutInfo, null);
@@ -142,21 +129,30 @@
closeControls(v, true);
};
- private OnClickListener mOnFavoriteClick = v -> {
- mSelectedAction = ACTION_FAVORITE;
- updateChannel();
-
- };
-
private OnClickListener mOnSnoozeClick = v -> {
mSelectedAction = ACTION_SNOOZE;
mOnSnoozeClickListener.onClick(v, 1);
closeControls(v, true);
};
+ */
+
+ private OnClickListener mOnFavoriteClick = v -> {
+ mSelectedAction = ACTION_FAVORITE;
+ updateToggleActions(mSelectedAction, true);
+ };
+
+ private OnClickListener mOnDefaultClick = v -> {
+ mSelectedAction = ACTION_DEFAULT;
+ updateToggleActions(mSelectedAction, true);
+ };
private OnClickListener mOnMuteClick = v -> {
mSelectedAction = ACTION_MUTE;
- updateChannel();
+ updateToggleActions(mSelectedAction, true);
+ };
+
+ private OnClickListener mOnDone = v -> {
+ closeControls(v, true);
};
public NotificationConversationInfo(Context context, AttributeSet attrs) {
@@ -177,7 +173,6 @@
public void bindNotification(
ShortcutManager shortcutManager,
- LauncherApps launcherApps,
PackageManager pm,
INotificationManager iNotificationManager,
VisualStabilityManager visualStabilityManager,
@@ -185,16 +180,13 @@
NotificationChannel notificationChannel,
NotificationEntry entry,
OnSettingsClickListener onSettingsClick,
- OnAppSettingsClickListener onAppSettingsClick,
OnSnoozeClickListener onSnoozeClickListener,
ConversationIconFactory conversationIconFactory,
boolean isDeviceProvisioned) {
mSelectedAction = -1;
mINotificationManager = iNotificationManager;
mVisualStabilityManager = visualStabilityManager;
- mBubbleController = Dependency.get(BubbleController.class);
mPackageName = pkg;
- mEntry = entry;
mSbn = entry.getSbn();
mPm = pm;
mAppName = mPackageName;
@@ -204,11 +196,9 @@
mDelegatePkg = mSbn.getOpPkg();
mIsDeviceProvisioned = isDeviceProvisioned;
mOnSnoozeClickListener = onSnoozeClickListener;
- mShadeController = Dependency.get(ShadeController.class);
mIconFactory = conversationIconFactory;
mShortcutManager = shortcutManager;
- mLauncherApps = launcherApps;
mConversationId = mNotificationChannel.getConversationId();
if (TextUtils.isEmpty(mNotificationChannel.getConversationId())) {
mConversationId = mSbn.getShortcutId(mContext);
@@ -218,16 +208,13 @@
}
mShortcutInfo = entry.getRanking().getShortcutInfo();
- mIsBubbleable = mEntry.getBubbleMetadata() != null
- && Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.NOTIFICATION_BUBBLES, 0) == 1;
- mStartedAsBubble = mEntry.isBubble();
-
createConversationChannelIfNeeded();
bindHeader();
bindActions();
+ View done = findViewById(R.id.done);
+ done.setOnClickListener(mOnDone);
}
void createConversationChannelIfNeeded() {
@@ -252,37 +239,28 @@
}
private void bindActions() {
- // TODO: figure out what should happen for non-configurable channels
- Button bubble = findViewById(R.id.bubble);
- bubble.setVisibility(mIsBubbleable ? VISIBLE : GONE);
- bubble.setOnClickListener(mOnBubbleClick);
- if (mStartedAsBubble) {
- bubble.setText(R.string.notification_conversation_unbubble);
- } else {
- bubble.setText(R.string.notification_conversation_bubble);
- }
-
+ // TODO: b/152050825
+ /*
Button home = findViewById(R.id.home);
home.setOnClickListener(mOnHomeClick);
home.setVisibility(mShortcutInfo != null
&& mShortcutManager.isRequestPinShortcutSupported()
? VISIBLE : GONE);
- View favorite = findViewById(R.id.fave);
- favorite.setOnClickListener(mOnFavoriteClick);
-
Button snooze = findViewById(R.id.snooze);
snooze.setOnClickListener(mOnSnoozeClick);
+ */
- View mute = findViewById(R.id.mute);
- mute.setOnClickListener(mOnMuteClick);
+ findViewById(R.id.priority).setOnClickListener(mOnFavoriteClick);
+ findViewById(R.id.default_behavior).setOnClickListener(mOnDefaultClick);
+ findViewById(R.id.silence).setOnClickListener(mOnMuteClick);
final View settingsButton = findViewById(R.id.info);
settingsButton.setOnClickListener(getSettingsOnClickListener());
settingsButton.setVisibility(settingsButton.hasOnClickListeners() ? VISIBLE : GONE);
- updateToggleActions();
+ updateToggleActions(getSelectedAction(), false);
}
private void bindHeader() {
@@ -310,16 +288,16 @@
// TODO: bring back when channel name does not include name
// bindName();
bindPackage();
- bindIcon();
+ bindIcon(mNotificationChannel.isImportantConversation());
}
- private void bindIcon() {
+ private void bindIcon(boolean important) {
ImageView image = findViewById(R.id.conversation_icon);
if (mShortcutInfo != null) {
image.setImageDrawable(mIconFactory.getConversationDrawable(
mShortcutInfo, mPackageName, mAppUid,
- mNotificationChannel.isImportantConversation()));
+ important));
} else {
if (mSbn.getNotification().extras.getBoolean(EXTRA_IS_GROUP_CONVERSATION, false)) {
// TODO: maybe use a generic group icon, or a composite of recent senders
@@ -378,11 +356,6 @@
((TextView) findViewById(R.id.pkg_name)).setText(mAppName);
}
- private boolean bubbleImportantConversations() {
- return Settings.Secure.getInt(mContext.getContentResolver(),
- BUBBLE_IMPORTANT_CONVERSATIONS, 1) == 1;
- }
-
private void bindDelegate() {
TextView delegateView = findViewById(R.id.delegate_name);
@@ -431,6 +404,15 @@
}
@Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ mPriorityDescriptionView = findViewById(R.id.priority_summary);
+ mDefaultDescriptionView = findViewById(R.id.default_summary);
+ mSilentDescriptionView = findViewById(R.id.silence_summary);
+ }
+
+ @Override
public void onFinishedClosing() {
// TODO: do we need to do anything here?
}
@@ -450,32 +432,84 @@
}
}
- private void updateToggleActions() {
- ImageButton favorite = findViewById(R.id.fave);
- if (mNotificationChannel.isImportantConversation()) {
- favorite.setContentDescription(
- mContext.getString(R.string.notification_conversation_favorite));
- favorite.setImageResource(R.drawable.ic_important);
- } else {
- favorite.setContentDescription(
- mContext.getString(R.string.notification_conversation_unfavorite));
- favorite.setImageResource(R.drawable.ic_important_outline);
+ private void updateToggleActions(int selectedAction, boolean userTriggered) {
+ if (userTriggered) {
+ TransitionSet transition = new TransitionSet();
+ transition.setOrdering(TransitionSet.ORDERING_TOGETHER);
+ transition.addTransition(new Fade(Fade.OUT))
+ .addTransition(new ChangeBounds())
+ .addTransition(
+ new Fade(Fade.IN)
+ .setStartDelay(150)
+ .setDuration(200)
+ .setInterpolator(FAST_OUT_SLOW_IN));
+ transition.setDuration(350);
+ transition.setInterpolator(FAST_OUT_SLOW_IN);
+ TransitionManager.beginDelayedTransition(this, transition);
}
- ImageButton mute = findViewById(R.id.mute);
- if (mNotificationChannel.getImportance() >= IMPORTANCE_DEFAULT
- || mNotificationChannel.getImportance() == IMPORTANCE_UNSPECIFIED) {
- mute.setContentDescription(
- mContext.getString(R.string.notification_conversation_unmute));
- mute.setImageResource(R.drawable.ic_notifications_alert);
- } else {
- mute.setContentDescription(
- mContext.getString(R.string.notification_conversation_mute));
- mute.setImageResource(R.drawable.ic_notifications_silence);
+ View priority = findViewById(R.id.priority);
+ View defaultBehavior = findViewById(R.id.default_behavior);
+ View silence = findViewById(R.id.silence);
+
+ switch (selectedAction) {
+ case ACTION_FAVORITE:
+ mPriorityDescriptionView.setVisibility(VISIBLE);
+ mDefaultDescriptionView.setVisibility(GONE);
+ mSilentDescriptionView.setVisibility(GONE);
+ post(() -> {
+ priority.setSelected(true);
+ defaultBehavior.setSelected(false);
+ silence.setSelected(false);
+ });
+ break;
+
+ case ACTION_MUTE:
+ mSilentDescriptionView.setVisibility(VISIBLE);
+ mDefaultDescriptionView.setVisibility(GONE);
+ mPriorityDescriptionView.setVisibility(GONE);
+ post(() -> {
+ priority.setSelected(false);
+ defaultBehavior.setSelected(false);
+ silence.setSelected(true);
+ });
+ break;
+
+ case ACTION_DEFAULT:
+ mDefaultDescriptionView.setVisibility(VISIBLE);
+ mSilentDescriptionView.setVisibility(GONE);
+ mPriorityDescriptionView.setVisibility(GONE);
+ post(() -> {
+ priority.setSelected(false);
+ defaultBehavior.setSelected(true);
+ silence.setSelected(false);
+ });
+ break;
+
+ default:
+ throw new IllegalArgumentException("Unrecognized behavior: " + mSelectedAction);
}
+ boolean isAChange = getSelectedAction() != selectedAction;
+ TextView done = findViewById(R.id.done);
+ done.setText(isAChange
+ ? R.string.inline_ok_button
+ : R.string.inline_done_button);
+
// update icon in case importance has changed
- bindIcon();
+ bindIcon(selectedAction == ACTION_FAVORITE);
+ }
+
+ int getSelectedAction() {
+ if (mNotificationChannel.getImportance() <= IMPORTANCE_LOW
+ && mNotificationChannel.getImportance() > IMPORTANCE_UNSPECIFIED) {
+ return ACTION_MUTE;
+ } else {
+ if (mNotificationChannel.isImportantConversation()) {
+ return ACTION_FAVORITE;
+ }
+ }
+ return ACTION_DEFAULT;
}
private void updateChannel() {
@@ -517,11 +551,7 @@
@Override
public boolean shouldBeSaved() {
- // Toggle actions are already saved by the time the guts are closed; save for any other
- // taps
- return mSelectedAction > -1
- && mSelectedAction != ACTION_FAVORITE
- && mSelectedAction != ACTION_MUTE;
+ return mSelectedAction == ACTION_FAVORITE || mSelectedAction == ACTION_MUTE;
}
@Override
@@ -568,45 +598,41 @@
@Override
public void run() {
try {
- boolean channelSettingChanged = mAction != ACTION_HOME && mAction != ACTION_SNOOZE;
switch (mAction) {
- case ACTION_BUBBLE:
- case ACTION_UNBUBBLE:
- boolean canBubble = mAction == ACTION_BUBBLE;
- if (mChannelToUpdate.canBubble() != canBubble) {
- channelSettingChanged = true;
- mChannelToUpdate.setAllowBubbles(canBubble);
- } else {
- channelSettingChanged = false;
- }
- break;
case ACTION_FAVORITE:
mChannelToUpdate.setImportantConversation(
!mChannelToUpdate.isImportantConversation());
- if (mChannelToUpdate.isImportantConversation()
- && bubbleImportantConversations()) {
+ if (mChannelToUpdate.isImportantConversation()) {
mChannelToUpdate.setAllowBubbles(true);
}
+ mChannelToUpdate.setImportance(Math.max(
+ mChannelToUpdate.getOriginalImportance(), IMPORTANCE_DEFAULT));
+ break;
+ case ACTION_DEFAULT:
+ mChannelToUpdate.setImportance(Math.max(
+ mChannelToUpdate.getOriginalImportance(), IMPORTANCE_DEFAULT));
+ if (mChannelToUpdate.isImportantConversation()) {
+ mChannelToUpdate.setImportantConversation(false);
+ mChannelToUpdate.setAllowBubbles(false);
+ }
break;
case ACTION_MUTE:
if (mChannelToUpdate.getImportance() == IMPORTANCE_UNSPECIFIED
|| mChannelToUpdate.getImportance() >= IMPORTANCE_DEFAULT) {
mChannelToUpdate.setImportance(IMPORTANCE_LOW);
- } else {
- mChannelToUpdate.setImportance(Math.max(
- mChannelToUpdate.getOriginalImportance(), IMPORTANCE_DEFAULT));
+ }
+ if (mChannelToUpdate.isImportantConversation()) {
+ mChannelToUpdate.setImportantConversation(false);
+ mChannelToUpdate.setAllowBubbles(false);
}
break;
}
- if (channelSettingChanged) {
- mINotificationManager.updateNotificationChannelForPackage(
+ mINotificationManager.updateNotificationChannelForPackage(
mAppPkg, mAppUid, mChannelToUpdate);
- }
} catch (RemoteException e) {
Log.e(TAG, "Unable to update notification channel", e);
}
- ThreadUtils.postOnMainThread(() -> updateToggleActions());
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
index 1d7d611..2487d1a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java
@@ -394,7 +394,6 @@
notificationInfoView.bindNotification(
mShortcutManager,
- mLauncherApps,
pmUser,
mNotificationManager,
mVisualStabilityManager,
@@ -402,7 +401,6 @@
row.getEntry().getChannel(),
row.getEntry(),
onSettingsClick,
- onAppSettingsClick,
onSnoozeClickListener,
iconFactoryLoader,
mDeviceProvisionedController.isDeviceProvisioned());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt
index 162786c..91a2e7c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt
@@ -18,47 +18,56 @@
import android.content.Context
import android.view.View
-
+import android.view.ViewGroup
import com.android.internal.widget.ConversationLayout
import com.android.internal.widget.MessagingLinearLayout
import com.android.systemui.R
+import com.android.systemui.statusbar.TransformableView
+import com.android.systemui.statusbar.ViewTransformationHelper
import com.android.systemui.statusbar.notification.NotificationUtils
+import com.android.systemui.statusbar.notification.TransformState
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
+import com.android.systemui.statusbar.notification.row.HybridNotificationView
/**
- * Wraps a notification containing a converation template
+ * Wraps a notification containing a conversation template
*/
class NotificationConversationTemplateViewWrapper constructor(
ctx: Context,
view: View,
row: ExpandableNotificationRow
-)
- : NotificationTemplateViewWrapper(ctx, view, row) {
+) : NotificationTemplateViewWrapper(ctx, view, row) {
- private val minHeightWithActions: Int
- private val conversationLayout: ConversationLayout
- private var conversationIcon: View? = null
- private var conversationBadge: View? = null
- private var expandButton: View? = null
+ private val minHeightWithActions: Int = NotificationUtils.getFontScaledHeight(
+ ctx,
+ R.dimen.notification_messaging_actions_min_height
+ )
+ private val conversationLayout: ConversationLayout = view as ConversationLayout
+
+ private lateinit var conversationIcon: View
+ private lateinit var conversationBadgeBg: View
+ private lateinit var expandButton: View
private lateinit var expandButtonContainer: View
- private var messagingLinearLayout: MessagingLinearLayout? = null
-
- init {
- conversationLayout = view as ConversationLayout
- minHeightWithActions = NotificationUtils.getFontScaledHeight(ctx,
- R.dimen.notification_messaging_actions_min_height)
- }
+ private lateinit var imageMessageContainer: ViewGroup
+ private lateinit var messagingLinearLayout: MessagingLinearLayout
+ private lateinit var conversationTitle: View
+ private lateinit var importanceRing: View
+ private lateinit var appName: View
private fun resolveViews() {
messagingLinearLayout = conversationLayout.messagingLinearLayout
- conversationIcon = conversationLayout.requireViewById(
- com.android.internal.R.id.conversation_icon)
- conversationBadge = conversationLayout.requireViewById(
- com.android.internal.R.id.conversation_icon_badge)
- expandButton = conversationLayout.requireViewById(
- com.android.internal.R.id.expand_button)
- expandButtonContainer = conversationLayout.requireViewById(
- com.android.internal.R.id.expand_button_container)
+ imageMessageContainer = conversationLayout.imageMessageContainer
+ with(conversationLayout) {
+ conversationIcon = requireViewById(com.android.internal.R.id.conversation_icon)
+ conversationBadgeBg =
+ requireViewById(com.android.internal.R.id.conversation_icon_badge_bg)
+ expandButton = requireViewById(com.android.internal.R.id.expand_button)
+ expandButtonContainer =
+ requireViewById(com.android.internal.R.id.expand_button_container)
+ importanceRing = requireViewById(com.android.internal.R.id.conversation_icon_badge_ring)
+ appName = requireViewById(com.android.internal.R.id.app_name_text)
+ conversationTitle = requireViewById(com.android.internal.R.id.conversation_text)
+ }
}
override fun onContentUpdated(row: ExpandableNotificationRow) {
@@ -71,41 +80,69 @@
override fun updateTransformedTypes() {
// This also clears the existing types
super.updateTransformedTypes()
- messagingLinearLayout?.let {
- mTransformationHelper.addTransformedView(it.id, it)
- }
- conversationIcon?.let {
- mTransformationHelper.addViewTransformingToSimilar(it.id, it)
- }
- conversationBadge?.let {
- mTransformationHelper.addViewTransformingToSimilar(it.id, it)
- }
- expandButton?.let {
- mTransformationHelper.addViewTransformingToSimilar(it.id, it)
- }
+
+ addTransformedViews(
+ messagingLinearLayout,
+ appName,
+ conversationTitle)
+
+ // Let's ignore the image message container since that is transforming as part of the
+ // messages already
+ mTransformationHelper.setCustomTransformation(
+ object : ViewTransformationHelper.CustomTransformation() {
+ override fun transformTo(
+ ownState: TransformState,
+ otherView: TransformableView,
+ transformationAmount: Float
+ ): Boolean {
+ if (otherView is HybridNotificationView) {
+ return false
+ }
+ // we're hidden by default by the transformState
+ ownState.ensureVisible()
+ // Let's do nothing otherwise, this is already handled by the messages
+ return true
+ }
+
+ override fun transformFrom(
+ ownState: TransformState,
+ otherView: TransformableView,
+ transformationAmount: Float
+ ): Boolean =
+ transformTo(ownState, otherView, transformationAmount)
+ },
+ imageMessageContainer.id
+ )
+
+ addViewsTransformingToSimilar(
+ conversationIcon,
+ conversationBadgeBg,
+ expandButton,
+ importanceRing
+ )
}
- override fun setRemoteInputVisible(visible: Boolean) {
- conversationLayout.showHistoricMessages(visible)
- }
+ override fun setRemoteInputVisible(visible: Boolean) =
+ conversationLayout.showHistoricMessages(visible)
- override fun updateExpandability(expandable: Boolean, onClickListener: View.OnClickListener?) {
- conversationLayout.updateExpandability(expandable, onClickListener)
- }
+ override fun updateExpandability(expandable: Boolean, onClickListener: View.OnClickListener?) =
+ conversationLayout.updateExpandability(expandable, onClickListener)
override fun disallowSingleClick(x: Float, y: Float): Boolean {
- if (expandButtonContainer.visibility == View.VISIBLE
- && isOnView(expandButtonContainer, x, y)) {
- return true
- }
- return super.disallowSingleClick(x, y)
+ val isOnExpandButton = expandButtonContainer.visibility == View.VISIBLE &&
+ isOnView(expandButtonContainer, x, y)
+ return isOnExpandButton || super.disallowSingleClick(x, y)
}
- override fun getMinLayoutHeight(): Int {
- if (mActionsContainer != null && mActionsContainer.visibility != View.GONE) {
- return minHeightWithActions
- } else {
- return super.getMinLayoutHeight()
- }
- }
+ override fun getMinLayoutHeight(): Int =
+ if (mActionsContainer != null && mActionsContainer.visibility != View.GONE)
+ minHeightWithActions
+ else
+ super.getMinLayoutHeight()
+
+ private fun addTransformedViews(vararg vs: View) =
+ vs.forEach(mTransformationHelper::addTransformedView)
+
+ private fun addViewsTransformingToSimilar(vararg vs: View) =
+ vs.forEach(mTransformationHelper::addViewTransformingToSimilar)
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
index 1d06198..a44ad3d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
@@ -132,11 +132,6 @@
updateCropToPaddingForImageViews();
Notification notification = row.getEntry().getSbn().getNotification();
mIcon.setTag(ImageTransformState.ICON_TAG, notification.getSmallIcon());
- if (mWorkProfileImage != null) {
- // The work profile image is always the same lets just set the icon tag for it not to
- // animate
- mWorkProfileImage.setTag(ImageTransformState.ICON_TAG, notification.getSmallIcon());
- }
// We need to reset all views that are no longer transforming in case a view was previously
// transformed, but now we decided to transform its container instead.
@@ -183,6 +178,7 @@
mTransformationHelper.reset();
mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_ICON,
mIcon);
+ mTransformationHelper.addViewTransformingToSimilar(mWorkProfileImage);
if (mIsLowPriority && mHeaderText != null) {
mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_TITLE,
mHeaderText);
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/AdminSecondaryLockScreenControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/AdminSecondaryLockScreenControllerTest.java
index 0e9a245..cf1299f 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/AdminSecondaryLockScreenControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/AdminSecondaryLockScreenControllerTest.java
@@ -105,7 +105,7 @@
IKeyguardCallback callback = (IKeyguardCallback) invocation.getArguments()[1];
callback.onRemoteContentReady(mSurfacePackage);
return null;
- }).when(mKeyguardClient).onSurfaceReady(any(), any(IKeyguardCallback.class));
+ }).when(mKeyguardClient).onCreateKeyguardSurface(any(), any(IKeyguardCallback.class));
mTestController.show(mServiceIntent);
@@ -119,7 +119,7 @@
IKeyguardCallback callback = (IKeyguardCallback) invocation.getArguments()[1];
callback.onDismiss();
return null;
- }).when(mKeyguardClient).onSurfaceReady(any(), any(IKeyguardCallback.class));
+ }).when(mKeyguardClient).onCreateKeyguardSurface(any(), any(IKeyguardCallback.class));
mTestController.show(mServiceIntent);
@@ -133,7 +133,7 @@
IKeyguardCallback callback = (IKeyguardCallback) invocation.getArguments()[1];
callback.onRemoteContentReady(mSurfacePackage);
return null;
- }).when(mKeyguardClient).onSurfaceReady(any(), any(IKeyguardCallback.class));
+ }).when(mKeyguardClient).onCreateKeyguardSurface(any(), any(IKeyguardCallback.class));
mTestController.show(mServiceIntent);
SurfaceView v = verifySurfaceReady();
@@ -151,9 +151,9 @@
}
@Test
- public void testDismissed_onSurfaceReady_RemoteException() throws Exception {
+ public void testDismissed_onCreateKeyguardSurface_RemoteException() throws Exception {
doThrow(new RemoteException()).when(mKeyguardClient)
- .onSurfaceReady(any(), any(IKeyguardCallback.class));
+ .onCreateKeyguardSurface(any(), any(IKeyguardCallback.class));
mTestController.show(mServiceIntent);
@@ -161,9 +161,9 @@
}
@Test
- public void testDismissed_onSurfaceReady_timeout() throws Exception {
- // Mocked KeyguardClient never handles the onSurfaceReady, so the operation times out,
- // resulting in the view being dismissed.
+ public void testDismissed_onCreateKeyguardSurface_timeout() throws Exception {
+ // Mocked KeyguardClient never handles the onCreateKeyguardSurface, so the operation
+ // times out, resulting in the view being dismissed.
doAnswer(answerVoid(Runnable::run)).when(mHandler)
.postDelayed(any(Runnable.class), anyLong());
@@ -178,7 +178,7 @@
verify(mParent).addView(captor.capture());
mTestableLooper.processAllMessages();
- verify(mKeyguardClient).onSurfaceReady(any(), any(IKeyguardCallback.class));
+ verify(mKeyguardClient).onCreateKeyguardSurface(any(), any(IKeyguardCallback.class));
return captor.getValue();
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index bd50a73..9d9ba1b 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -38,6 +38,7 @@
import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -567,7 +568,10 @@
ResolveInfo resolveInfo = new ResolveInfo();
resolveInfo.serviceInfo = serviceInfo;
when(mPackageManager.resolveService(any(Intent.class), eq(0))).thenReturn(resolveInfo);
- when(mDevicePolicyManager.isSecondaryLockscreenEnabled(eq(user))).thenReturn(true, false);
+ when(mDevicePolicyManager.isSecondaryLockscreenEnabled(eq(UserHandle.of(user))))
+ .thenReturn(true, false);
+ when(mDevicePolicyManager.getProfileOwnerAsUser(user))
+ .thenReturn(new ComponentName(packageName, cls));
// Initially null.
assertThat(mKeyguardUpdateMonitor.getSecondaryLockscreenRequirement(user)).isNull();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleDataTest.java
index 866dfdc..c86b5f7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleDataTest.java
@@ -966,8 +966,8 @@
private NotificationEntry createBubbleEntry(int userId, String notifKey, String packageName,
long postTime) {
// BubbleMetadata
- Notification.BubbleMetadata bubbleMetadata = new Notification.BubbleMetadata.Builder()
- .createIntentBubble(mExpandIntent, Icon.createWithResource("", 0))
+ Notification.BubbleMetadata bubbleMetadata = new Notification.BubbleMetadata.Builder(
+ mExpandIntent, Icon.createWithResource("", 0))
.setDeleteIntent(mDeleteIntent)
.build();
// Notification -> BubbleMetadata
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleTest.java
index 7f67657..72f816f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleTest.java
@@ -74,8 +74,8 @@
mBubble = new Bubble(mEntry, mSuppressionListener);
Intent target = new Intent(mContext, BubblesTestActivity.class);
- Notification.BubbleMetadata metadata = new Notification.BubbleMetadata.Builder()
- .createIntentBubble(PendingIntent.getActivity(mContext, 0, target, 0),
+ Notification.BubbleMetadata metadata = new Notification.BubbleMetadata.Builder(
+ PendingIntent.getActivity(mContext, 0, target, 0),
Icon.createWithResource(mContext, R.drawable.android))
.build();
mEntry.setBubbleMetadata(metadata);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt
index cdf0f2d..a2599ec 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt
@@ -42,7 +42,6 @@
import dagger.Lazy
import junit.framework.Assert.assertEquals
import org.junit.Before
-import org.junit.Ignore
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.mock
@@ -194,7 +193,6 @@
assertEquals(listOf(b, a), rankingManager.updateRanking(null, listOf(a, b), "test"))
}
- @Ignore // TODO: (b/149046729) fix test and re-enable
@Test
fun testSort_importantPeople() {
whenever(sectionsManager.isFilteringEnabled()).thenReturn(true)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java
index f9c62e1..5cbfcc1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java
@@ -487,8 +487,8 @@
}
private NotificationEntry createBubble() {
- Notification.BubbleMetadata data = new Notification.BubbleMetadata.Builder()
- .createIntentBubble(PendingIntent.getActivity(mContext, 0, new Intent(), 0),
+ Notification.BubbleMetadata data = new Notification.BubbleMetadata.Builder(
+ PendingIntent.getActivity(mContext, 0, new Intent(), 0),
Icon.createWithResource(mContext.getResources(), R.drawable.android))
.build();
Notification n = new Notification.Builder(getContext(), "a")
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java
index e1ab33a..6998edd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfoTest.java
@@ -26,6 +26,8 @@
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
+import static com.google.common.truth.Truth.assertThat;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
@@ -203,9 +205,8 @@
PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0,
new Intent(mContext, BubblesTestActivity.class), 0);
mBubbleSbn = new SbnBuilder(mSbn).setBubbleMetadata(
- new Notification.BubbleMetadata.Builder()
- .createIntentBubble(bubbleIntent,
- Icon.createWithResource(mContext, R.drawable.android)).build())
+ new Notification.BubbleMetadata.Builder(bubbleIntent,
+ Icon.createWithResource(mContext, R.drawable.android)).build())
.build();
mBubbleEntry = new NotificationEntryBuilder()
.setSbn(mBubbleSbn)
@@ -224,7 +225,6 @@
public void testBindNotification_SetsShortcutIcon() {
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -233,7 +233,6 @@
mEntry,
null,
null,
- null,
mIconFactory,
true);
final ImageView view = mNotificationInfo.findViewById(R.id.conversation_icon);
@@ -245,7 +244,6 @@
when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name");
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -254,7 +252,6 @@
mEntry,
null,
null,
- null,
mIconFactory,
true);
final TextView textView = mNotificationInfo.findViewById(R.id.pkg_name);
@@ -292,7 +289,6 @@
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -301,7 +297,6 @@
mEntry,
null,
null,
- null,
mIconFactory,
true);
final TextView textView = mNotificationInfo.findViewById(R.id.group_name);
@@ -315,7 +310,6 @@
public void testBindNotification_GroupNameHiddenIfNoGroup() {
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -324,7 +318,6 @@
mEntry,
null,
null,
- null,
mIconFactory,
true);
final TextView textView = mNotificationInfo.findViewById(R.id.group_name);
@@ -337,7 +330,6 @@
public void testBindNotification_noDelegate() {
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -346,7 +338,6 @@
mEntry,
null,
null,
- null,
mIconFactory,
true);
final TextView nameView = mNotificationInfo.findViewById(R.id.delegate_name);
@@ -366,7 +357,6 @@
NotificationEntry entry = new NotificationEntryBuilder().setSbn(mSbn).build();
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -375,7 +365,6 @@
entry,
null,
null,
- null,
mIconFactory,
true);
final TextView nameView = mNotificationInfo.findViewById(R.id.delegate_name);
@@ -388,7 +377,6 @@
final CountDownLatch latch = new CountDownLatch(1);
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -400,7 +388,6 @@
latch.countDown();
},
null,
- null,
mIconFactory,
true);
@@ -414,7 +401,6 @@
public void testBindNotification_SettingsButtonInvisibleWhenNoClickListener() {
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -423,7 +409,6 @@
mEntry,
null,
null,
- null,
mIconFactory,
true);
final View settingsButton = mNotificationInfo.findViewById(R.id.info);
@@ -435,7 +420,6 @@
final CountDownLatch latch = new CountDownLatch(1);
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -447,7 +431,6 @@
latch.countDown();
},
null,
- null,
mIconFactory,
false);
final View settingsButton = mNotificationInfo.findViewById(R.id.info);
@@ -455,380 +438,11 @@
}
@Test
- public void testBindNotification_bubbleActionVisibleWhenCanBubble() {
- Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1);
- mNotificationInfo.bindNotification(
- mShortcutManager,
- mLauncherApps,
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mBubbleEntry,
- null,
- null,
- null,
- mIconFactory,
- true);
-
- View bubbleView = mNotificationInfo.findViewById(R.id.bubble);
- assertEquals(View.VISIBLE, bubbleView.getVisibility());
- }
-
- @Test
- public void testBindNotification_bubbleAction_noBubbleMetadata() {
- Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1);
- mNotificationInfo.bindNotification(
- mShortcutManager,
- mLauncherApps,
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mEntry,
- null,
- null,
- null,
- mIconFactory,
- true);
-
- View bubbleView = mNotificationInfo.findViewById(R.id.bubble);
- assertEquals(View.GONE, bubbleView.getVisibility());
- }
-
- @Test
- public void testBindNotification_bubbleActionGloballyOff() {
- Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 0);
- mNotificationInfo.bindNotification(
- mShortcutManager,
- mLauncherApps,
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mBubbleEntry,
- null,
- null,
- null,
- mIconFactory,
- true);
-
- View bubbleView = mNotificationInfo.findViewById(R.id.bubble);
- assertEquals(View.GONE, bubbleView.getVisibility());
- }
-
- @Test
- public void testAddToHome() throws Exception {
- when(mShortcutManager.isRequestPinShortcutSupported()).thenReturn(true);
-
- mNotificationInfo.bindNotification(
- mShortcutManager,
- mLauncherApps,
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mBubbleEntry,
- null,
- null,
- null,
- mIconFactory,
- true);
-
- // Promote it
- mNotificationInfo.findViewById(R.id.home).performClick();
- mTestableLooper.processAllMessages();
-
- verify(mShortcutManager, times(1)).requestPinShortcut(mShortcutInfo, null);
- verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
- anyString(), anyInt(), any());
- verify(mShadeController).animateCollapsePanels();
- }
-
- @Test
- public void testSnooze() throws Exception {
- final CountDownLatch latch = new CountDownLatch(1);
-
- mNotificationInfo.bindNotification(
- mShortcutManager,
- mLauncherApps,
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mBubbleEntry,
- null,
- null,
- (View v, int hours) -> {
- latch.countDown();
- },
- mIconFactory,
- true);
-
- // Promote it
- mNotificationInfo.findViewById(R.id.snooze).performClick();
- mTestableLooper.processAllMessages();
-
- assertEquals(0, latch.getCount());
- verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
- anyString(), anyInt(), any());
- }
-
- @Test
- public void testBubble_promotesBubble() throws Exception {
- Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1);
- mNotificationChannel.setAllowBubbles(false);
- mConversationChannel.setAllowBubbles(false);
-
- mNotificationInfo.bindNotification(
- mShortcutManager,
- mLauncherApps,
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mBubbleEntry,
- null,
- null,
- null,
- mIconFactory,
- true);
-
- assertFalse(mBubbleEntry.isBubble());
-
- // Promote it
- mNotificationInfo.findViewById(R.id.bubble).performClick();
- mTestableLooper.processAllMessages();
-
- verify(mBubbleController, times(1)).onUserCreatedBubbleFromNotification(mBubbleEntry);
- ArgumentCaptor<NotificationChannel> captor =
- ArgumentCaptor.forClass(NotificationChannel.class);
- verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
- anyString(), anyInt(), captor.capture());
- assertTrue(captor.getValue().canBubble());
- }
-
- @Test
- public void testBubble_demotesBubble() throws Exception {
- Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1);
- mBubbleEntry.getSbn().getNotification().flags |= FLAG_BUBBLE;
-
- mNotificationInfo.bindNotification(
- mShortcutManager,
- mLauncherApps,
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mBubbleEntry,
- null,
- null,
- null,
- mIconFactory,
- true);
-
- assertTrue(mBubbleEntry.isBubble());
-
- // Demote it
- mNotificationInfo.findViewById(R.id.bubble).performClick();
- mTestableLooper.processAllMessages();
-
- verify(mBubbleController, times(1)).onUserDemotedBubbleFromNotification(mBubbleEntry);
- ArgumentCaptor<NotificationChannel> captor =
- ArgumentCaptor.forClass(NotificationChannel.class);
- verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
- anyString(), anyInt(), captor.capture());
- assertFalse(captor.getValue().canBubble());
- }
-
- @Test
- public void testBubble_noChannelChange() throws Exception {
- Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, 1);
- mNotificationInfo.bindNotification(
- mShortcutManager,
- mLauncherApps,
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mBubbleEntry,
- null,
- null,
- null,
- mIconFactory,
- true);
-
- assertFalse(mBubbleEntry.isBubble());
- assertTrue(mNotificationChannel.canBubble());
-
- // Promote it
- mNotificationInfo.findViewById(R.id.bubble).performClick();
- mTestableLooper.processAllMessages();
-
- verify(mBubbleController, times(1)).onUserCreatedBubbleFromNotification(mBubbleEntry);
- verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
- anyString(), anyInt(), any());
- }
-
- @Test
- public void testFavorite_favorite_noBubble() throws Exception {
- Settings.Secure.putInt(mContext.getContentResolver(),
- BUBBLE_IMPORTANT_CONVERSATIONS, 0);
- mNotificationChannel.setAllowBubbles(false);
- mConversationChannel.setAllowBubbles(false);
- mNotificationInfo.bindNotification(
- mShortcutManager,
- mLauncherApps,
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mEntry,
- null,
- null,
- null,
- mIconFactory,
- true);
-
- ImageButton fave = mNotificationInfo.findViewById(R.id.fave);
- assertEquals(mContext.getString(R.string.notification_conversation_unfavorite),
- fave.getContentDescription().toString());
-
- fave.performClick();
- mTestableLooper.processAllMessages();
-
- ArgumentCaptor<NotificationChannel> captor =
- ArgumentCaptor.forClass(NotificationChannel.class);
- verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
- anyString(), anyInt(), captor.capture());
- assertTrue(captor.getValue().isImportantConversation());
- assertFalse(captor.getValue().canBubble());
- verify(mBubbleController, never()).onUserCreatedBubbleFromNotification(mEntry);
- }
-
- @Test
- public void testFavorite_favorite_bubble() throws Exception {
- Settings.Secure.putInt(mContext.getContentResolver(),
- BUBBLE_IMPORTANT_CONVERSATIONS, 1);
- mNotificationChannel.setAllowBubbles(false);
- mConversationChannel.setAllowBubbles(false);
- mNotificationInfo.bindNotification(
- mShortcutManager,
- mLauncherApps,
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mEntry,
- null,
- null,
- null,
- mIconFactory,
- true);
-
- ImageButton fave = mNotificationInfo.findViewById(R.id.fave);
- assertEquals(mContext.getString(R.string.notification_conversation_unfavorite),
- fave.getContentDescription().toString());
-
- fave.performClick();
- mTestableLooper.processAllMessages();
-
- ArgumentCaptor<NotificationChannel> captor =
- ArgumentCaptor.forClass(NotificationChannel.class);
- verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
- anyString(), anyInt(), captor.capture());
- assertTrue(captor.getValue().isImportantConversation());
- assertTrue(captor.getValue().canBubble());
- }
-
- @Test
- public void testFavorite_unfavorite() throws Exception {
- mNotificationChannel.setImportantConversation(true);
- mConversationChannel.setImportantConversation(true);
-
- mNotificationInfo.bindNotification(
- mShortcutManager,
- mLauncherApps,
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mEntry,
- null,
- null,
- null,
- mIconFactory,
- true);
-
- ImageButton fave = mNotificationInfo.findViewById(R.id.fave);
- assertEquals(mContext.getString(R.string.notification_conversation_favorite),
- fave.getContentDescription().toString());
-
- fave.performClick();
- mTestableLooper.processAllMessages();
-
- ArgumentCaptor<NotificationChannel> captor =
- ArgumentCaptor.forClass(NotificationChannel.class);
- verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
- anyString(), anyInt(), captor.capture());
- assertFalse(captor.getValue().isImportantConversation());
- }
-
- @Test
- public void testMute_mute() throws Exception {
- mNotificationChannel.setImportance(IMPORTANCE_DEFAULT);
- mConversationChannel.setImportance(IMPORTANCE_DEFAULT);
-
- mNotificationInfo.bindNotification(
- mShortcutManager,
- mLauncherApps,
- mMockPackageManager,
- mMockINotificationManager,
- mVisualStabilityManager,
- TEST_PACKAGE_NAME,
- mNotificationChannel,
- mEntry,
- null,
- null,
- null,
- mIconFactory,
- true);
-
- ImageButton mute = mNotificationInfo.findViewById(R.id.mute);
- assertEquals(mContext.getString(R.string.notification_conversation_unmute),
- mute.getContentDescription().toString());
-
- mute.performClick();
- mTestableLooper.processAllMessages();
-
- ArgumentCaptor<NotificationChannel> captor =
- ArgumentCaptor.forClass(NotificationChannel.class);
- verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
- anyString(), anyInt(), captor.capture());
- assertEquals(IMPORTANCE_LOW, captor.getValue().getImportance());
- }
-
- @Test
- public void testMute_unmute() throws Exception {
- mNotificationChannel.setImportance(IMPORTANCE_LOW);
- mNotificationChannel.setOriginalImportance(IMPORTANCE_HIGH);
+ public void testBindNotification_silentSelected_isFave_isSilent() {
mConversationChannel.setImportance(IMPORTANCE_LOW);
- mConversationChannel.setOriginalImportance(IMPORTANCE_HIGH);
-
+ mConversationChannel.setImportantConversation(true);
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -837,15 +451,200 @@
mEntry,
null,
null,
+ mIconFactory,
+ true);
+ View view = mNotificationInfo.findViewById(R.id.silence);
+ assertThat(view.isSelected()).isTrue();
+ }
+
+ @Test
+ public void testBindNotification_defaultSelected_notFave_notSilent() {
+ mConversationChannel.setImportance(IMPORTANCE_HIGH);
+ mConversationChannel.setImportantConversation(false);
+ mConversationChannel.setAllowBubbles(true);
+ mNotificationInfo.bindNotification(
+ mShortcutManager,
+ mMockPackageManager,
+ mMockINotificationManager,
+ mVisualStabilityManager,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ null,
+ null,
+ mIconFactory,
+ true);
+ View view = mNotificationInfo.findViewById(R.id.default_behavior);
+ assertThat(view.isSelected()).isTrue();
+ }
+
+ @Test
+ public void testFavorite() throws Exception {
+ mConversationChannel.setAllowBubbles(false);
+ mConversationChannel.setImportance(IMPORTANCE_LOW);
+ mConversationChannel.setImportantConversation(false);
+
+ mNotificationInfo.bindNotification(
+ mShortcutManager,
+ mMockPackageManager,
+ mMockINotificationManager,
+ mVisualStabilityManager,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ null,
null,
mIconFactory,
true);
- ImageButton mute = mNotificationInfo.findViewById(R.id.mute);
- assertEquals(mContext.getString(R.string.notification_conversation_mute),
- mute.getContentDescription().toString());
+ View fave = mNotificationInfo.findViewById(R.id.priority);
+ fave.performClick();
+ mTestableLooper.processAllMessages();
- mute.performClick();
+ // silence subtext visible, others not
+ assertThat(mNotificationInfo.findViewById(R.id.priority_summary).getVisibility())
+ .isEqualTo(VISIBLE);
+ assertThat(mNotificationInfo.findViewById(R.id.default_summary).getVisibility())
+ .isEqualTo(GONE);
+ assertThat(mNotificationInfo.findViewById(R.id.silence_summary).getVisibility())
+ .isEqualTo(GONE);
+
+ // no changes until hit done
+ verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
+ anyString(), anyInt(), any());
+ assertFalse(mConversationChannel.isImportantConversation());
+ assertFalse(mConversationChannel.canBubble());
+ assertEquals(IMPORTANCE_LOW, mConversationChannel.getImportance());
+ }
+
+ @Test
+ public void testDefault() throws Exception {
+ mConversationChannel.setAllowBubbles(false);
+ mConversationChannel.setImportance(IMPORTANCE_LOW);
+ mConversationChannel.setImportantConversation(false);
+ mNotificationInfo.bindNotification(
+ mShortcutManager,
+ mMockPackageManager,
+ mMockINotificationManager,
+ mVisualStabilityManager,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ null,
+ null,
+ mIconFactory,
+ true);
+
+ mNotificationInfo.findViewById(R.id.default_behavior).performClick();
+ mTestableLooper.processAllMessages();
+
+ // silence subtext visible, others not
+ assertThat(mNotificationInfo.findViewById(R.id.priority_summary).getVisibility())
+ .isEqualTo(GONE);
+ assertThat(mNotificationInfo.findViewById(R.id.default_summary).getVisibility())
+ .isEqualTo(VISIBLE);
+ assertThat(mNotificationInfo.findViewById(R.id.silence_summary).getVisibility())
+ .isEqualTo(GONE);
+
+ // no changes until hit done
+ verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
+ anyString(), anyInt(), any());
+ assertFalse(mConversationChannel.isImportantConversation());
+ assertFalse(mConversationChannel.canBubble());
+ assertEquals(IMPORTANCE_LOW, mConversationChannel.getImportance());
+ }
+
+ @Test
+ public void testSilence() throws Exception {
+ mConversationChannel.setImportance(IMPORTANCE_DEFAULT);
+ mConversationChannel.setImportantConversation(false);
+
+ mNotificationInfo.bindNotification(
+ mShortcutManager,
+ mMockPackageManager,
+ mMockINotificationManager,
+ mVisualStabilityManager,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ null,
+ null,
+ mIconFactory,
+ true);
+
+ View silence = mNotificationInfo.findViewById(R.id.silence);
+
+ silence.performClick();
+ mTestableLooper.processAllMessages();
+
+ // silence subtext visible, others not
+ assertThat(mNotificationInfo.findViewById(R.id.priority_summary).getVisibility())
+ .isEqualTo(GONE);
+ assertThat(mNotificationInfo.findViewById(R.id.default_summary).getVisibility())
+ .isEqualTo(GONE);
+ assertThat(mNotificationInfo.findViewById(R.id.silence_summary).getVisibility())
+ .isEqualTo(VISIBLE);
+
+ // no changes until save
+ verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
+ anyString(), anyInt(), any());
+ assertEquals(IMPORTANCE_DEFAULT, mConversationChannel.getImportance());
+ }
+
+ @Test
+ public void testFavorite_andSave() throws Exception {
+ mConversationChannel.setAllowBubbles(false);
+ mConversationChannel.setImportance(IMPORTANCE_LOW);
+ mConversationChannel.setImportantConversation(false);
+
+ mNotificationInfo.bindNotification(
+ mShortcutManager,
+ mMockPackageManager,
+ mMockINotificationManager,
+ mVisualStabilityManager,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ null,
+ null,
+ mIconFactory,
+ true);
+
+ View fave = mNotificationInfo.findViewById(R.id.priority);
+ fave.performClick();
+ mNotificationInfo.findViewById(R.id.done).performClick();
+ mTestableLooper.processAllMessages();
+
+ ArgumentCaptor<NotificationChannel> captor =
+ ArgumentCaptor.forClass(NotificationChannel.class);
+ verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
+ anyString(), anyInt(), captor.capture());
+ assertTrue(captor.getValue().isImportantConversation());
+ assertTrue(captor.getValue().canBubble());
+ assertEquals(IMPORTANCE_DEFAULT, captor.getValue().getImportance());
+ }
+
+ @Test
+ public void testFavorite_andSave_doesNotLowerImportance() throws Exception {
+ mConversationChannel.setOriginalImportance(IMPORTANCE_HIGH);
+ mConversationChannel.setImportance(9);
+
+ mNotificationInfo.bindNotification(
+ mShortcutManager,
+ mMockPackageManager,
+ mMockINotificationManager,
+ mVisualStabilityManager,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ null,
+ null,
+ mIconFactory,
+ true);
+
+ View fave = mNotificationInfo.findViewById(R.id.priority);
+ fave.performClick();
+ mNotificationInfo.findViewById(R.id.done).performClick();
mTestableLooper.processAllMessages();
ArgumentCaptor<NotificationChannel> captor =
@@ -856,10 +655,12 @@
}
@Test
- public void testBindNotification_createsNewChannel() throws Exception {
+ public void testDefault_andSave() throws Exception {
+ mConversationChannel.setAllowBubbles(true);
+ mConversationChannel.setOriginalImportance(IMPORTANCE_HIGH);
+ mConversationChannel.setImportantConversation(true);
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -868,6 +669,126 @@
mEntry,
null,
null,
+ mIconFactory,
+ true);
+
+ mNotificationInfo.findViewById(R.id.default_behavior).performClick();
+ mNotificationInfo.findViewById(R.id.done).performClick();
+ mTestableLooper.processAllMessages();
+
+ ArgumentCaptor<NotificationChannel> captor =
+ ArgumentCaptor.forClass(NotificationChannel.class);
+ verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
+ anyString(), anyInt(), captor.capture());
+ assertFalse(captor.getValue().isImportantConversation());
+ assertFalse(captor.getValue().canBubble());
+ assertEquals(IMPORTANCE_HIGH, captor.getValue().getImportance());
+ }
+
+ @Test
+ public void testDefault_andSave_doesNotChangeNonImportantBubbling() throws Exception {
+ mConversationChannel.setAllowBubbles(true);
+ mConversationChannel.setOriginalImportance(IMPORTANCE_HIGH);
+ mConversationChannel.setImportantConversation(false);
+ mNotificationInfo.bindNotification(
+ mShortcutManager,
+ mMockPackageManager,
+ mMockINotificationManager,
+ mVisualStabilityManager,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ null,
+ null,
+ mIconFactory,
+ true);
+
+ mNotificationInfo.findViewById(R.id.default_behavior).performClick();
+ mNotificationInfo.findViewById(R.id.done).performClick();
+ mTestableLooper.processAllMessages();
+
+ ArgumentCaptor<NotificationChannel> captor =
+ ArgumentCaptor.forClass(NotificationChannel.class);
+ verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
+ anyString(), anyInt(), captor.capture());
+ assertFalse(captor.getValue().isImportantConversation());
+ assertTrue(captor.getValue().canBubble());
+ assertEquals(IMPORTANCE_HIGH, captor.getValue().getImportance());
+ }
+
+ @Test
+ public void testDefault_andSave_doesNotDemoteImportance() throws Exception {
+ mConversationChannel.setImportance(9);
+ mConversationChannel.setOriginalImportance(IMPORTANCE_HIGH);
+
+ mNotificationInfo.bindNotification(
+ mShortcutManager,
+ mMockPackageManager,
+ mMockINotificationManager,
+ mVisualStabilityManager,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ null,
+ null,
+ mIconFactory,
+ true);
+
+ mNotificationInfo.findViewById(R.id.default_behavior).performClick();
+ mNotificationInfo.findViewById(R.id.done).performClick();
+ mTestableLooper.processAllMessages();
+
+ ArgumentCaptor<NotificationChannel> captor =
+ ArgumentCaptor.forClass(NotificationChannel.class);
+ verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
+ anyString(), anyInt(), captor.capture());
+ assertEquals(IMPORTANCE_HIGH, captor.getValue().getImportance());
+ }
+
+ @Test
+ public void testSilence_andSave() throws Exception {
+ mConversationChannel.setImportance(IMPORTANCE_DEFAULT);
+ mConversationChannel.setImportantConversation(true);
+ mConversationChannel.setAllowBubbles(true);
+
+ mNotificationInfo.bindNotification(
+ mShortcutManager,
+ mMockPackageManager,
+ mMockINotificationManager,
+ mVisualStabilityManager,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ null,
+ null,
+ mIconFactory,
+ true);
+
+ View silence = mNotificationInfo.findViewById(R.id.silence);
+ silence.performClick();
+ mNotificationInfo.findViewById(R.id.done).performClick();
+ mTestableLooper.processAllMessages();
+
+ ArgumentCaptor<NotificationChannel> captor =
+ ArgumentCaptor.forClass(NotificationChannel.class);
+ verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
+ anyString(), anyInt(), captor.capture());
+ assertFalse(captor.getValue().isImportantConversation());
+ assertFalse(captor.getValue().canBubble());
+ assertEquals(IMPORTANCE_LOW, captor.getValue().getImportance());
+ }
+
+ @Test
+ public void testBindNotification_createsNewChannel() throws Exception {
+ mNotificationInfo.bindNotification(
+ mShortcutManager,
+ mMockPackageManager,
+ mMockINotificationManager,
+ mVisualStabilityManager,
+ TEST_PACKAGE_NAME,
+ mNotificationChannel,
+ mEntry,
+ null,
null,
mIconFactory,
true);
@@ -881,7 +802,6 @@
mNotificationChannel.setConversationId("", CONVERSATION_ID);
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -890,7 +810,6 @@
mEntry,
null,
null,
- null,
mIconFactory,
true);
@@ -904,7 +823,6 @@
mConversationChannel.setImportance(IMPORTANCE_DEFAULT);
mNotificationInfo.bindNotification(
mShortcutManager,
- mLauncherApps,
mMockPackageManager,
mMockINotificationManager,
mVisualStabilityManager,
@@ -913,11 +831,13 @@
mEntry,
null,
null,
- null,
mIconFactory,
true);
- mNotificationInfo.findViewById(R.id.mute).performClick();
+ mNotificationInfo.findViewById(R.id.silence).performClick();
+ mNotificationInfo.findViewById(R.id.done).performClick();
+
+ mTestableLooper.processAllMessages();
verify(mVisualStabilityManager).temporarilyAllowReordering();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
index 077d863..2134a3d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
@@ -430,8 +430,7 @@
Intent target = new Intent(mContext, BubblesTestActivity.class);
PendingIntent bubbleIntent = PendingIntent.getActivity(mContext, 0, target, 0);
- return new BubbleMetadata.Builder()
- .createIntentBubble(bubbleIntent,
+ return new BubbleMetadata.Builder(bubbleIntent,
Icon.createWithResource(mContext, R.drawable.android))
.setDeleteIntent(deleteIntent)
.setDesiredHeight(314)
diff --git a/packages/Tethering/common/TetheringLib/api/module-lib-current.txt b/packages/Tethering/common/TetheringLib/api/module-lib-current.txt
index e823e17..754584e 100644
--- a/packages/Tethering/common/TetheringLib/api/module-lib-current.txt
+++ b/packages/Tethering/common/TetheringLib/api/module-lib-current.txt
@@ -110,16 +110,16 @@
}
public static class TetheringManager.TetheringRequest {
- }
-
- public static class TetheringManager.TetheringRequest.Builder {
- ctor public TetheringManager.TetheringRequest.Builder(int);
- method @NonNull public android.net.TetheringManager.TetheringRequest build();
method @Nullable public android.net.LinkAddress getClientStaticIpv4Address();
method @Nullable public android.net.LinkAddress getLocalIpv4Address();
method public boolean getShouldShowEntitlementUi();
method public int getTetheringType();
method public boolean isExemptFromEntitlementCheck();
+ }
+
+ public static class TetheringManager.TetheringRequest.Builder {
+ ctor public TetheringManager.TetheringRequest.Builder(int);
+ method @NonNull public android.net.TetheringManager.TetheringRequest build();
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean);
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setShouldShowEntitlementUi(boolean);
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setStaticIpv4Addresses(@NonNull android.net.LinkAddress, @NonNull android.net.LinkAddress);
diff --git a/packages/Tethering/common/TetheringLib/api/system-current.txt b/packages/Tethering/common/TetheringLib/api/system-current.txt
index 4ac44ba..edd1ebb 100644
--- a/packages/Tethering/common/TetheringLib/api/system-current.txt
+++ b/packages/Tethering/common/TetheringLib/api/system-current.txt
@@ -80,16 +80,16 @@
}
public static class TetheringManager.TetheringRequest {
- }
-
- public static class TetheringManager.TetheringRequest.Builder {
- ctor public TetheringManager.TetheringRequest.Builder(int);
- method @NonNull public android.net.TetheringManager.TetheringRequest build();
method @Nullable public android.net.LinkAddress getClientStaticIpv4Address();
method @Nullable public android.net.LinkAddress getLocalIpv4Address();
method public boolean getShouldShowEntitlementUi();
method public int getTetheringType();
method public boolean isExemptFromEntitlementCheck();
+ }
+
+ public static class TetheringManager.TetheringRequest.Builder {
+ ctor public TetheringManager.TetheringRequest.Builder(int);
+ method @NonNull public android.net.TetheringManager.TetheringRequest build();
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean);
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setShouldShowEntitlementUi(boolean);
method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setStaticIpv4Addresses(@NonNull android.net.LinkAddress, @NonNull android.net.LinkAddress);
diff --git a/packages/Tethering/common/TetheringLib/src/android/net/TetheringManager.java b/packages/Tethering/common/TetheringLib/src/android/net/TetheringManager.java
index bd65fc2..3509801 100644
--- a/packages/Tethering/common/TetheringLib/src/android/net/TetheringManager.java
+++ b/packages/Tethering/common/TetheringLib/src/android/net/TetheringManager.java
@@ -620,33 +620,40 @@
public TetheringRequest build() {
return new TetheringRequest(mBuilderParcel);
}
+ }
- @Nullable
- public LinkAddress getLocalIpv4Address() {
- return mBuilderParcel.localIPv4Address;
- }
+ /**
+ * Get the local IPv4 address, if one was configured with
+ * {@link Builder#setStaticIpv4Addresses}.
+ */
+ @Nullable
+ public LinkAddress getLocalIpv4Address() {
+ return mRequestParcel.localIPv4Address;
+ }
- /** Get static client address. */
- @Nullable
- public LinkAddress getClientStaticIpv4Address() {
- return mBuilderParcel.staticClientAddress;
- }
+ /**
+ * Get the static IPv4 address of the client, if one was configured with
+ * {@link Builder#setStaticIpv4Addresses}.
+ */
+ @Nullable
+ public LinkAddress getClientStaticIpv4Address() {
+ return mRequestParcel.staticClientAddress;
+ }
- /** Get tethering type. */
- @TetheringType
- public int getTetheringType() {
- return mBuilderParcel.tetheringType;
- }
+ /** Get tethering type. */
+ @TetheringType
+ public int getTetheringType() {
+ return mRequestParcel.tetheringType;
+ }
- /** Check if exempt from entitlement check. */
- public boolean isExemptFromEntitlementCheck() {
- return mBuilderParcel.exemptFromEntitlementCheck;
- }
+ /** Check if exempt from entitlement check. */
+ public boolean isExemptFromEntitlementCheck() {
+ return mRequestParcel.exemptFromEntitlementCheck;
+ }
- /** Check if show entitlement ui. */
- public boolean getShouldShowEntitlementUi() {
- return mBuilderParcel.showProvisioningUi;
- }
+ /** Check if show entitlement ui. */
+ public boolean getShouldShowEntitlementUi() {
+ return mRequestParcel.showProvisioningUi;
}
/**
diff --git a/packages/overlays/IconShapeFlowerOverlay/AndroidManifest.xml b/packages/overlays/IconShapeFlowerOverlay/AndroidManifest.xml
index 9d20c6b..22411a2 100644
--- a/packages/overlays/IconShapeFlowerOverlay/AndroidManifest.xml
+++ b/packages/overlays/IconShapeFlowerOverlay/AndroidManifest.xml
@@ -19,6 +19,7 @@
android:versionName="1.0">
<overlay
android:targetPackage="android"
+ android:targetName="IconShapeCustomization"
android:category="android.theme.customization.adaptive_icon_shape"
android:priority="1"/>
diff --git a/packages/overlays/IconShapeHexagonOverlay/AndroidManifest.xml b/packages/overlays/IconShapeHexagonOverlay/AndroidManifest.xml
index bf408fd..384d5b3 100644
--- a/packages/overlays/IconShapeHexagonOverlay/AndroidManifest.xml
+++ b/packages/overlays/IconShapeHexagonOverlay/AndroidManifest.xml
@@ -20,6 +20,7 @@
android:versionName="1.0">
<overlay
android:targetPackage="android"
+ android:targetName="IconShapeCustomization"
android:category="android.theme.customization.adaptive_icon_shape"
android:priority="1"/>
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index 260703d..8c1360c 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -35,6 +35,8 @@
import android.app.PendingIntent;
import android.app.admin.DevicePolicyManagerInternal;
import android.app.admin.DevicePolicyManagerInternal.OnCrossProfileWidgetProvidersChangeListener;
+import android.app.usage.UsageEvents;
+import android.app.usage.UsageStatsManagerInternal;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetManagerInternal;
import android.appwidget.AppWidgetProviderInfo;
@@ -235,6 +237,7 @@
private PackageManagerInternal mPackageManagerInternal;
private ActivityManagerInternal mActivityManagerInternal;
private AppOpsManagerInternal mAppOpsManagerInternal;
+ private UsageStatsManagerInternal mUsageStatsManagerInternal;
private SecurityPolicy mSecurityPolicy;
@@ -278,6 +281,7 @@
void systemServicesReady() {
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
mAppOpsManagerInternal = LocalServices.getService(AppOpsManagerInternal.class);
+ mUsageStatsManagerInternal = LocalServices.getService(UsageStatsManagerInternal.class);
}
private void computeMaximumWidgetBitmapMemory() {
@@ -879,8 +883,6 @@
outUpdates.add(updatesMap.valueAt(j));
}
}
- updateAppOpsLocked(host, true);
-
// Reset the update counter once all the updates have been calculated
host.lastWidgetUpdateSequenceNo = updateSequenceNo;
return new ParceledListSlice<>(outUpdates);
@@ -909,7 +911,7 @@
if (host != null) {
host.callbacks = null;
pruneHostLocked(host);
- updateAppOpsLocked(host, false);
+ mAppOpsManagerInternal.updateAppWidgetVisibility(host.getWidgetUids(), false);
}
}
}
@@ -3646,26 +3648,49 @@
return false;
}
- private void updateAppOpsLocked(Host host, boolean visible) {
- if (visible) {
- final int procState = mActivityManagerInternal.getUidProcessState(host.id.uid);
+ /**
+ * Note an app widget is tapped on. If a app widget is tapped, the underlying app is treated as
+ * foreground so the app can get while-in-use permission.
+ *
+ * @param uid UID of the underlying app.
+ * @param packageName Package name of the app.
+ */
+ @Override
+ public void noteAppWidgetTapped(int uid, String packageName) {
+ final int callingUid = Binder.getCallingUid();
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ // The launcher must be at TOP.
+ final int procState = mActivityManagerInternal.getUidProcessState(callingUid);
if (procState > ActivityManager.PROCESS_STATE_TOP) {
- // The launcher must be at TOP.
return;
}
- }
- final List<ResolveInfo> allHomeCandidates = new ArrayList<>();
- // Default launcher from package manager.
- final ComponentName defaultLauncher = mPackageManagerInternal
- .getHomeActivitiesAsUser(allHomeCandidates, UserHandle.getUserId(host.id.uid));
- // The launcher must be default launcher.
- if (defaultLauncher == null
- || !defaultLauncher.getPackageName().equals(host.id.packageName)) {
- return;
+ // Default launcher from package manager.
+ final ComponentName defaultLauncher = mPackageManagerInternal
+ .getDefaultHomeActivity(UserHandle.getUserId(callingUid));
+ int defaultLauncherUid = 0;
+ try {
+ defaultLauncherUid = mPackageManager.getApplicationInfo(
+ defaultLauncher.getPackageName(), 0 ,
+ UserHandle.getUserId(callingUid)).uid;
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to getApplicationInfo for package:"
+ + defaultLauncher.getPackageName(), e);
+ return;
+ }
+ // The callingUid must be default launcher uid.
+ if (defaultLauncherUid != callingUid) {
+ return;
+ }
+ final SparseArray<String> uid2PackageName = new SparseArray<String>();
+ uid2PackageName.put(uid, packageName);
+ mAppOpsManagerInternal.updateAppWidgetVisibility(uid2PackageName, true);
+ mUsageStatsManagerInternal.reportEvent(packageName, UserHandle.getUserId(uid),
+ UsageEvents.Event.USER_INTERACTION);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
-
- mAppOpsManagerInternal.updateAppWidgetVisibility(host.getWidgetUids(), visible);
}
private final class CallbackHandler extends Handler {
diff --git a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java
index b4b0641..8b50b01 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java
@@ -28,6 +28,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
@@ -250,23 +251,31 @@
final InlineSuggestionsResponse inlineSuggestionsResponse =
InlineSuggestionFactory.createAugmentedInlineSuggestionsResponse(
request, inlineSuggestionsData, focusedId,
- dataset -> {
- mCallbacks.logAugmentedAutofillSelected(sessionId,
- dataset.getId());
- try {
- final ArrayList<AutofillId> fieldIds = dataset.getFieldIds();
- final int size = fieldIds.size();
- final boolean hideHighlight = size == 1
- && fieldIds.get(0).equals(focusedId);
- if (dataset.getAuthentication() != null) {
- client.startIntentSender(dataset.getAuthentication(),
- new Intent());
- } else {
+ new InlineSuggestionFactory.InlineSuggestionUiCallback() {
+ @Override
+ public void autofill(Dataset dataset) {
+ mCallbacks.logAugmentedAutofillSelected(sessionId,
+ dataset.getId());
+ try {
+ final ArrayList<AutofillId> fieldIds = dataset.getFieldIds();
+ final int size = fieldIds.size();
+ final boolean hideHighlight = size == 1
+ && fieldIds.get(0).equals(focusedId);
client.autofill(sessionId, fieldIds, dataset.getFieldValues(),
hideHighlight);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Encounter exception autofilling the values");
}
- } catch (RemoteException e) {
- Slog.w(TAG, "Encounter exception autofilling the values");
+ }
+
+ @Override
+ public void startIntentSender(IntentSender intentSender,
+ Intent intent) {
+ try {
+ client.startIntentSender(intentSender, intent);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "RemoteException starting intent sender");
+ }
}
}, onErrorCallback, remoteRenderService);
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 8032e9b..e942b27 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -2604,17 +2604,20 @@
@GuardedBy("mLock")
private void updateViewStateAndUiOnValueChangedLocked(AutofillId id, AutofillValue value,
ViewState viewState, int flags) {
- viewState.setCurrentValue(value);
-
- final String filterText;
+ final String textValue;
if (value == null || !value.isText()) {
- filterText = null;
+ textValue = null;
} else {
final CharSequence text = value.getTextValue();
// Text should never be null, but it doesn't hurt to check to avoid a
// system crash...
- filterText = (text == null) ? null : text.toString();
+ textValue = (text == null) ? null : text.toString();
}
+ updateFilteringStateOnValueChangedLocked(textValue, viewState);
+
+ viewState.setCurrentValue(value);
+
+ final String filterText = textValue;
final AutofillValue filledValue = viewState.getAutofilledValue();
if (filledValue != null) {
@@ -2645,6 +2648,52 @@
getUiForShowing().filterFillUi(filterText, this);
}
+ /**
+ * Disable filtering of inline suggestions for further text changes in this view if any
+ * character was removed earlier and now any character is being added. Such behaviour may
+ * indicate the IME attempting to probe the potentially sensitive content of inline suggestions.
+ */
+ @GuardedBy("mLock")
+ private void updateFilteringStateOnValueChangedLocked(@Nullable String newTextValue,
+ ViewState viewState) {
+ if (newTextValue == null) {
+ // Don't just return here, otherwise the IME can circumvent this logic using non-text
+ // values.
+ newTextValue = "";
+ }
+ final AutofillValue currentValue = viewState.getCurrentValue();
+ final String currentTextValue;
+ if (currentValue == null || !currentValue.isText()) {
+ currentTextValue = "";
+ } else {
+ currentTextValue = currentValue.getTextValue().toString();
+ }
+
+ if ((viewState.getState() & ViewState.STATE_CHAR_REMOVED) == 0) {
+ if (!containsCharsInOrder(newTextValue, currentTextValue)) {
+ viewState.setState(ViewState.STATE_CHAR_REMOVED);
+ }
+ } else if (!containsCharsInOrder(currentTextValue, newTextValue)) {
+ // Characters were added or replaced.
+ viewState.setState(ViewState.STATE_INLINE_DISABLED);
+ }
+ }
+
+ /**
+ * Returns true if {@code s1} contains all characters of {@code s2}, in order.
+ */
+ private static boolean containsCharsInOrder(String s1, String s2) {
+ int prevIndex = -1;
+ for (char ch : s2.toCharArray()) {
+ int index = TextUtils.indexOf(s1, ch, prevIndex + 1);
+ if (index == -1) {
+ return false;
+ }
+ prevIndex = index;
+ }
+ return true;
+ }
+
@Override
public void onFillReady(@NonNull FillResponse response, @NonNull AutofillId filledId,
@Nullable AutofillValue value) {
@@ -2735,6 +2784,10 @@
return false;
}
+ final ViewState currentView = mViewStates.get(mCurrentViewId);
+ if ((currentView.getState() & ViewState.STATE_INLINE_DISABLED) != 0) {
+ response.getDatasets().clear();
+ }
InlineSuggestionsResponse inlineSuggestionsResponse =
InlineSuggestionFactory.createInlineSuggestionsResponse(
inlineSuggestionsRequest.get(), response, filterText, mCurrentViewId,
diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java
index f7c24f0..9114576 100644
--- a/services/autofill/java/com/android/server/autofill/ViewState.java
+++ b/services/autofill/java/com/android/server/autofill/ViewState.java
@@ -76,6 +76,10 @@
public static final int STATE_TRIGGERED_AUGMENTED_AUTOFILL = 0x1000;
/** Inline suggestions were shown for this View. */
public static final int STATE_INLINE_SHOWN = 0x2000;
+ /** A character was removed from the View value (not by the service). */
+ public static final int STATE_CHAR_REMOVED = 0x4000;
+ /** Showing inline suggestions is not allowed for this View. */
+ public static final int STATE_INLINE_DISABLED = 0x8000;
public final AutofillId id;
diff --git a/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java b/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java
index c26d7ee..e98ac75 100644
--- a/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java
+++ b/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java
@@ -21,6 +21,8 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.Intent;
+import android.content.IntentSender;
import android.os.IBinder;
import android.os.RemoteException;
import android.service.autofill.Dataset;
@@ -49,6 +51,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
+import java.util.function.Consumer;
import java.util.regex.Pattern;
public final class InlineSuggestionFactory {
@@ -62,6 +65,11 @@
* Callback to autofill a dataset to the client app.
*/
void autofill(@NonNull Dataset dataset);
+
+ /**
+ * Callback to start Intent in client app.
+ */
+ void startIntentSender(@NonNull IntentSender intentSender, @NonNull Intent intent);
}
/**
@@ -94,7 +102,8 @@
response.getAuthentication() == null ? null : response.getInlinePresentation();
return createInlineSuggestionsResponseInternal(/* isAugmented= */ false, request,
response.getDatasets(), filterText, inlineAuthentication, autofillId,
- onErrorCallback, onClickFactory, remoteRenderService);
+ onErrorCallback, onClickFactory, (intentSender) ->
+ client.startIntentSender(intentSender, new Intent()), remoteRenderService);
}
/**
@@ -111,8 +120,12 @@
if (sDebug) Slog.d(TAG, "createAugmentedInlineSuggestionsResponse called");
return createInlineSuggestionsResponseInternal(/* isAugmented= */ true, request,
datasets, /* filterText= */ null, /* inlineAuthentication= */ null,
- autofillId, onErrorCallback, (dataset, datasetIndex) ->
- inlineSuggestionUiCallback.autofill(dataset), remoteRenderService);
+ autofillId, onErrorCallback,
+ (dataset, datasetIndex) ->
+ inlineSuggestionUiCallback.autofill(dataset),
+ (intentSender) ->
+ inlineSuggestionUiCallback.startIntentSender(intentSender, new Intent()),
+ remoteRenderService);
}
@Nullable
@@ -121,12 +134,13 @@
@Nullable List<Dataset> datasets, @Nullable String filterText,
@Nullable InlinePresentation inlineAuthentication, @NonNull AutofillId autofillId,
@NonNull Runnable onErrorCallback, @NonNull BiConsumer<Dataset, Integer> onClickFactory,
+ @NonNull Consumer<IntentSender> intentSenderConsumer,
@Nullable RemoteInlineSuggestionRenderService remoteRenderService) {
final ArrayList<InlineSuggestion> inlineSuggestions = new ArrayList<>();
if (inlineAuthentication != null) {
InlineSuggestion inlineAuthSuggestion = createInlineAuthSuggestion(inlineAuthentication,
- remoteRenderService, onClickFactory, onErrorCallback,
+ remoteRenderService, onClickFactory, onErrorCallback, intentSenderConsumer,
request.getHostInputToken(), request.getHostDisplayId());
inlineSuggestions.add(inlineAuthSuggestion);
@@ -157,7 +171,7 @@
InlineSuggestion inlineSuggestion = createInlineSuggestion(isAugmented, dataset,
datasetIndex,
mergedInlinePresentation(request, datasetIndex, inlinePresentation),
- onClickFactory, remoteRenderService, onErrorCallback,
+ onClickFactory, remoteRenderService, onErrorCallback, intentSenderConsumer,
request.getHostInputToken(), request.getHostDisplayId());
inlineSuggestions.add(inlineSuggestion);
@@ -201,7 +215,8 @@
@NonNull InlinePresentation inlinePresentation,
@NonNull BiConsumer<Dataset, Integer> onClickFactory,
@NonNull RemoteInlineSuggestionRenderService remoteRenderService,
- @NonNull Runnable onErrorCallback, @Nullable IBinder hostInputToken,
+ @NonNull Runnable onErrorCallback, @NonNull Consumer<IntentSender> intentSenderConsumer,
+ @Nullable IBinder hostInputToken,
int displayId) {
final String suggestionSource = isAugmented ? InlineSuggestionInfo.SOURCE_PLATFORM
: InlineSuggestionInfo.SOURCE_AUTOFILL;
@@ -216,7 +231,7 @@
final InlineSuggestion inlineSuggestion = new InlineSuggestion(inlineSuggestionInfo,
createInlineContentProvider(inlinePresentation,
() -> onClickFactory.accept(dataset, datasetIndex), onErrorCallback,
- remoteRenderService, hostInputToken, displayId));
+ intentSenderConsumer, remoteRenderService, hostInputToken, displayId));
return inlineSuggestion;
}
@@ -225,6 +240,7 @@
@NonNull InlinePresentation inlinePresentation,
@NonNull RemoteInlineSuggestionRenderService remoteRenderService,
@NonNull BiConsumer<Dataset, Integer> onClickFactory, @NonNull Runnable onErrorCallback,
+ @NonNull Consumer<IntentSender> intentSenderConsumer,
@Nullable IBinder hostInputToken, int displayId) {
final InlineSuggestionInfo inlineSuggestionInfo = new InlineSuggestionInfo(
inlinePresentation.getInlinePresentationSpec(),
@@ -235,7 +251,8 @@
createInlineContentProvider(inlinePresentation,
() -> onClickFactory.accept(null,
AutofillManager.AUTHENTICATION_ID_DATASET_ID_UNDEFINED),
- onErrorCallback, remoteRenderService, hostInputToken, displayId));
+ onErrorCallback, intentSenderConsumer, remoteRenderService, hostInputToken,
+ displayId));
}
/**
@@ -261,6 +278,7 @@
private static IInlineContentProvider.Stub createInlineContentProvider(
@NonNull InlinePresentation inlinePresentation, @Nullable Runnable onClickAction,
@NonNull Runnable onErrorCallback,
+ @NonNull Consumer<IntentSender> intentSenderConsumer,
@Nullable RemoteInlineSuggestionRenderService remoteRenderService,
@Nullable IBinder hostInputToken,
int displayId) {
@@ -269,7 +287,7 @@
public void provideContent(int width, int height, IInlineContentCallback callback) {
UiThread.getHandler().post(() -> {
final IInlineSuggestionUiCallback uiCallback = createInlineSuggestionUiCallback(
- callback, onClickAction, onErrorCallback);
+ callback, onClickAction, onErrorCallback, intentSenderConsumer);
if (remoteRenderService == null) {
Slog.e(TAG, "RemoteInlineSuggestionRenderService is null");
@@ -285,7 +303,8 @@
private static IInlineSuggestionUiCallback.Stub createInlineSuggestionUiCallback(
@NonNull IInlineContentCallback callback, @NonNull Runnable onAutofillCallback,
- @NonNull Runnable onErrorCallback) {
+ @NonNull Runnable onErrorCallback,
+ @NonNull Consumer<IntentSender> intentSenderConsumer) {
return new IInlineSuggestionUiCallback.Stub() {
@Override
public void onClick() throws RemoteException {
@@ -320,6 +339,11 @@
onErrorCallback.run();
}
}
+
+ @Override
+ public void onStartIntentSender(IntentSender intentSender) {
+ intentSenderConsumer.accept(intentSender);
+ }
};
}
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 723c6b1..7a26b21 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -118,7 +118,7 @@
"android.hardware.health-V2.1-java",
"android.hardware.light-java",
"android.hardware.weaver-V1.0-java",
- "android.hardware.biometrics.face-V1.1-java",
+ "android.hardware.biometrics.face-V1.0-java",
"android.hardware.biometrics.fingerprint-V2.2-java",
"android.hardware.oemlock-V1.0-java",
"android.hardware.configstore-V1.0-java",
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index a767347..0bf81e0 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -682,6 +682,7 @@
private static final int H_ABORT_IDLE_MAINT = 12;
private static final int H_BOOT_COMPLETED = 13;
private static final int H_COMPLETE_UNLOCK_USER = 14;
+ private static final int H_VOLUME_STATE_CHANGED = 15;
class StorageManagerServiceHandler extends Handler {
public StorageManagerServiceHandler(Looper looper) {
@@ -805,6 +806,11 @@
completeUnlockUser((int) msg.obj);
break;
}
+ case H_VOLUME_STATE_CHANGED: {
+ final SomeArgs args = (SomeArgs) msg.obj;
+ onVolumeStateChangedInternal((VolumeInfo) args.arg1, (int) args.arg2,
+ (int) args.arg3);
+ }
}
}
}
@@ -1323,7 +1329,11 @@
final int oldState = vol.state;
final int newState = state;
vol.state = newState;
- onVolumeStateChangedLocked(vol, oldState, newState);
+ final SomeArgs args = SomeArgs.obtain();
+ args.arg1 = vol;
+ args.arg2 = oldState;
+ args.arg3 = newState;
+ mHandler.obtainMessage(H_VOLUME_STATE_CHANGED, args).sendToTarget();
}
}
}
@@ -1496,78 +1506,89 @@
return true;
}
- @GuardedBy("mLock")
- private void onVolumeStateChangedLocked(VolumeInfo vol, int oldState, int newState) {
- if (vol.type == VolumeInfo.TYPE_EMULATED && newState != VolumeInfo.STATE_MOUNTED) {
- mFuseMountedUser.remove(vol.getMountUserId());
- }
- // Remember that we saw this volume so we're ready to accept user
- // metadata, or so we can annoy them when a private volume is ejected
- if (!TextUtils.isEmpty(vol.fsUuid)) {
- VolumeRecord rec = mRecords.get(vol.fsUuid);
- if (rec == null) {
- rec = new VolumeRecord(vol.type, vol.fsUuid);
- rec.partGuid = vol.partGuid;
- rec.createdMillis = System.currentTimeMillis();
- if (vol.type == VolumeInfo.TYPE_PRIVATE) {
- rec.nickname = vol.disk.getDescription();
- }
- mRecords.put(rec.fsUuid, rec);
- } else {
- // Handle upgrade case where we didn't store partition GUID
- if (TextUtils.isEmpty(rec.partGuid)) {
+ private void onVolumeStateChangedInternal(VolumeInfo vol, int oldState, int newState) {
+ synchronized (mLock) {
+ if (vol.type == VolumeInfo.TYPE_EMULATED && newState != VolumeInfo.STATE_MOUNTED) {
+ mFuseMountedUser.remove(vol.getMountUserId());
+ }
+ // Remember that we saw this volume so we're ready to accept user
+ // metadata, or so we can annoy them when a private volume is ejected
+ if (!TextUtils.isEmpty(vol.fsUuid)) {
+ VolumeRecord rec = mRecords.get(vol.fsUuid);
+ if (rec == null) {
+ rec = new VolumeRecord(vol.type, vol.fsUuid);
rec.partGuid = vol.partGuid;
+ rec.createdMillis = System.currentTimeMillis();
+ if (vol.type == VolumeInfo.TYPE_PRIVATE) {
+ rec.nickname = vol.disk.getDescription();
+ }
+ mRecords.put(rec.fsUuid, rec);
+ } else {
+ // Handle upgrade case where we didn't store partition GUID
+ if (TextUtils.isEmpty(rec.partGuid)) {
+ rec.partGuid = vol.partGuid;
+ }
+ }
+
+ rec.lastSeenMillis = System.currentTimeMillis();
+ writeSettingsLocked();
+ }
+ }
+ // This is a blocking call to Storage Service which needs to process volume state changed
+ // before notifying other listeners.
+ // Intentionally called without the mLock to avoid deadlocking from the Storage Service.
+ try {
+ mStorageSessionController.notifyVolumeStateChanged(vol);
+ } catch (ExternalStorageServiceException e) {
+ Log.e(TAG, "Failed to notify volume state changed to the Storage Service", e);
+ }
+ synchronized (mLock) {
+ mCallbacks.notifyVolumeStateChanged(vol, oldState, newState);
+
+ // Do not broadcast before boot has completed to avoid launching the
+ // processes that receive the intent unnecessarily.
+ if (mBootCompleted && isBroadcastWorthy(vol)) {
+ final Intent intent = new Intent(VolumeInfo.ACTION_VOLUME_STATE_CHANGED);
+ intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, vol.id);
+ intent.putExtra(VolumeInfo.EXTRA_VOLUME_STATE, newState);
+ intent.putExtra(VolumeRecord.EXTRA_FS_UUID, vol.fsUuid);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
+ | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
+ mHandler.obtainMessage(H_INTERNAL_BROADCAST, intent).sendToTarget();
+ }
+
+ final String oldStateEnv = VolumeInfo.getEnvironmentForState(oldState);
+ final String newStateEnv = VolumeInfo.getEnvironmentForState(newState);
+
+ if (!Objects.equals(oldStateEnv, newStateEnv)) {
+ // Kick state changed event towards all started users. Any users
+ // started after this point will trigger additional
+ // user-specific broadcasts.
+ for (int userId : mSystemUnlockedUsers) {
+ if (vol.isVisibleForRead(userId)) {
+ final StorageVolume userVol = vol.buildStorageVolume(mContext, userId,
+ false);
+ mHandler.obtainMessage(H_VOLUME_BROADCAST, userVol).sendToTarget();
+
+ mCallbacks.notifyStorageStateChanged(userVol.getPath(), oldStateEnv,
+ newStateEnv);
+ }
}
}
- rec.lastSeenMillis = System.currentTimeMillis();
- writeSettingsLocked();
- }
-
- mCallbacks.notifyVolumeStateChanged(vol, oldState, newState);
-
- // Do not broadcast before boot has completed to avoid launching the
- // processes that receive the intent unnecessarily.
- if (mBootCompleted && isBroadcastWorthy(vol)) {
- final Intent intent = new Intent(VolumeInfo.ACTION_VOLUME_STATE_CHANGED);
- intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, vol.id);
- intent.putExtra(VolumeInfo.EXTRA_VOLUME_STATE, newState);
- intent.putExtra(VolumeRecord.EXTRA_FS_UUID, vol.fsUuid);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
- | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
- mHandler.obtainMessage(H_INTERNAL_BROADCAST, intent).sendToTarget();
- }
-
- final String oldStateEnv = VolumeInfo.getEnvironmentForState(oldState);
- final String newStateEnv = VolumeInfo.getEnvironmentForState(newState);
-
- if (!Objects.equals(oldStateEnv, newStateEnv)) {
- // Kick state changed event towards all started users. Any users
- // started after this point will trigger additional
- // user-specific broadcasts.
- for (int userId : mSystemUnlockedUsers) {
- if (vol.isVisibleForRead(userId)) {
- final StorageVolume userVol = vol.buildStorageVolume(mContext, userId, false);
- mHandler.obtainMessage(H_VOLUME_BROADCAST, userVol).sendToTarget();
-
- mCallbacks.notifyStorageStateChanged(userVol.getPath(), oldStateEnv,
- newStateEnv);
- }
- }
- }
-
- if ((vol.type == VolumeInfo.TYPE_PUBLIC || vol.type == VolumeInfo.TYPE_STUB)
+ if ((vol.type == VolumeInfo.TYPE_PUBLIC || vol.type == VolumeInfo.TYPE_STUB)
&& vol.state == VolumeInfo.STATE_EJECTING) {
- // TODO: this should eventually be handled by new ObbVolume state changes
- /*
- * Some OBBs might have been unmounted when this volume was
- * unmounted, so send a message to the handler to let it know to
- * remove those from the list of mounted OBBS.
- */
- mObbActionHandler.sendMessage(mObbActionHandler.obtainMessage(
- OBB_FLUSH_MOUNT_STATE, vol.path));
+ // TODO: this should eventually be handled by new ObbVolume state changes
+ /*
+ * Some OBBs might have been unmounted when this volume was
+ * unmounted, so send a message to the handler to let it know to
+ * remove those from the list of mounted OBBS.
+ */
+ mObbActionHandler.sendMessage(mObbActionHandler.obtainMessage(
+ OBB_FLUSH_MOUNT_STATE, vol.path));
+ }
+ maybeLogMediaMount(vol, newState);
}
- maybeLogMediaMount(vol, newState);
}
private void maybeLogMediaMount(VolumeInfo vol, int newState) {
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index 12a1a95..564f9f3 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -159,22 +159,13 @@
public UiModeManagerService(Context context) {
super(context);
+ mConfiguration.setToDefaults();
}
@VisibleForTesting
- protected UiModeManagerService(Context context, WindowManagerInternal wm, AlarmManager am,
- PowerManager pm, PowerManager.WakeLock wl, TwilightManager tm,
- PowerManagerInternal localPowerManager,
- boolean setupWizardComplete) {
- super(context);
- mWindowManager = wm;
- mWakeLock = wl;
- mTwilightManager = tm;
+ protected UiModeManagerService(Context context, boolean setupWizardComplete) {
+ this(context);
mSetupWizardComplete = setupWizardComplete;
- mAlarmManager = am;
- mPowerManager = pm;
- mLocalPowerManager = localPowerManager;
- initPowerSave();
}
private static Intent buildHomeIntent(String category) {
@@ -249,8 +240,8 @@
};
/**
- * DO NOT USE DIRECTLY
- * see register registerScreenOffEvent and unregisterScreenOffEvent
+ * DO NOT USE DIRECTLY
+ * see register registerScreenOffEvent and unregisterScreenOffEvent
*/
private final BroadcastReceiver mOnScreenOffHandler = new BroadcastReceiver() {
@Override
@@ -333,34 +324,45 @@
}
@Override
+ public void onBootPhase(int phase) {
+ if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
+ synchronized (mLock) {
+ final Context context = getContext();
+ mSystemReady = true;
+ mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ mWakeLock = mPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, TAG);
+ mWindowManager = LocalServices.getService(WindowManagerInternal.class);
+ mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
+ mLocalPowerManager =
+ LocalServices.getService(PowerManagerInternal.class);
+ mTwilightManager = getLocalService(TwilightManager.class);
+ initPowerSave();
+ mCarModeEnabled = mDockState == Intent.EXTRA_DOCK_STATE_CAR;
+ registerVrStateListener();
+ // register listeners
+ context.getContentResolver()
+ .registerContentObserver(Secure.getUriFor(Secure.UI_NIGHT_MODE),
+ false, mDarkThemeObserver, 0);
+ context.registerReceiver(mDockModeReceiver,
+ new IntentFilter(Intent.ACTION_DOCK_EVENT));
+ IntentFilter batteryFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
+ context.registerReceiver(mBatteryReceiver, batteryFilter);
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_USER_SWITCHED);
+ context.registerReceiver(new UserSwitchedReceiver(), filter, null, mHandler);
+ updateConfigurationLocked();
+ applyConfigurationExternallyLocked();
+ }
+ }
+ }
+
+ @Override
public void onStart() {
final Context context = getContext();
-
- mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
- mWakeLock = mPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, TAG);
- mWindowManager = LocalServices.getService(WindowManagerInternal.class);
- mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
-
// If setup isn't complete for this user listen for completion so we can unblock
// being able to send a night mode configuration change event
verifySetupWizardCompleted();
- context.registerReceiver(mDockModeReceiver,
- new IntentFilter(Intent.ACTION_DOCK_EVENT));
- IntentFilter batteryFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
- context.registerReceiver(mBatteryReceiver, batteryFilter);
-
- context.registerReceiver(mSettingsRestored,
- new IntentFilter(Intent.ACTION_SETTING_RESTORED), null, mHandler);
-
- mLocalPowerManager =
- LocalServices.getService(PowerManagerInternal.class);
- initPowerSave();
-
- mTwilightManager = getLocalService(TwilightManager.class);
-
- mConfiguration.setToDefaults();
-
final Resources res = context.getResources();
mDefaultUiModeType = res.getInteger(
com.android.internal.R.integer.config_defaultUiModeType);
@@ -383,21 +385,12 @@
SystemServerInitThreadPool.submit(() -> {
synchronized (mLock) {
updateNightModeFromSettingsLocked(context, res, UserHandle.getCallingUserId());
- updateConfigurationLocked();
- applyConfigurationExternallyLocked();
+ updateSystemProperties();
}
}, TAG + ".onStart");
publishBinderService(Context.UI_MODE_SERVICE, mService);
publishLocalService(UiModeManagerInternal.class, mLocalService);
-
- IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_USER_SWITCHED);
- context.registerReceiver(new UserSwitchedReceiver(), filter, null, mHandler);
-
- context.getContentResolver().registerContentObserver(Secure.getUriFor(Secure.UI_NIGHT_MODE),
- false, mDarkThemeObserver, 0);
- mHandler.post(() -> updateSystemProperties());
}
private final BroadcastReceiver mSettingsRestored = new BroadcastReceiver() {
@@ -475,9 +468,10 @@
/**
* Updates the night mode setting in Settings.Global and returns if the value was successfully
* changed.
+ *
* @param context A valid context
- * @param res A valid resource object
- * @param userId The user to update the setting for
+ * @param res A valid resource object
+ * @param userId The user to update the setting for
* @return True if the new value is different from the old value. False otherwise.
*/
private boolean updateNightModeFromSettingsLocked(Context context, Resources res, int userId) {
@@ -493,12 +487,12 @@
Secure.UI_NIGHT_MODE_OVERRIDE_OFF, 0, userId) != 0;
mCustomAutoNightModeStartMilliseconds = LocalTime.ofNanoOfDay(
Secure.getLongForUser(context.getContentResolver(),
- Secure.DARK_THEME_CUSTOM_START_TIME,
- DEFAULT_CUSTOM_NIGHT_START_TIME.toNanoOfDay() / 1000L, userId) * 1000);
+ Secure.DARK_THEME_CUSTOM_START_TIME,
+ DEFAULT_CUSTOM_NIGHT_START_TIME.toNanoOfDay() / 1000L, userId) * 1000);
mCustomAutoNightModeEndMilliseconds = LocalTime.ofNanoOfDay(
Secure.getLongForUser(context.getContentResolver(),
- Secure.DARK_THEME_CUSTOM_END_TIME,
- DEFAULT_CUSTOM_NIGHT_END_TIME.toNanoOfDay() / 1000L, userId) * 1000);
+ Secure.DARK_THEME_CUSTOM_END_TIME,
+ DEFAULT_CUSTOM_NIGHT_END_TIME.toNanoOfDay() / 1000L, userId) * 1000);
} else {
mNightMode = defaultNightMode;
mCustomAutoNightModeEndMilliseconds = DEFAULT_CUSTOM_NIGHT_END_TIME;
@@ -863,18 +857,6 @@
}
}
- @Override
- public void onBootPhase(int phase) {
- if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
- synchronized (mLock) {
- mSystemReady = true;
- mCarModeEnabled = mDockState == Intent.EXTRA_DOCK_STATE_CAR;
- registerVrStateListener();
- updateLocked(0, 0);
- }
- }
- }
-
/**
* Updates the global car mode state.
* The device is considered to be in car mode if there exists an app at any priority level which
@@ -931,7 +913,8 @@
// Anyone can disable the default priority.
isDefaultPriority
// If priority was enabled, only enabling package can disable it.
- || isPriorityTracked && mCarModePackagePriority.get(priority).equals(packageName)
+ || isPriorityTracked && mCarModePackagePriority.get(priority).equals(
+ packageName)
// Disable all priorities flag can disable all regardless.
|| isDisableAll;
if (isChangeAllowed) {
@@ -1092,10 +1075,10 @@
if (LOG) {
Slog.d(TAG,
- "updateConfigurationLocked: mDockState=" + mDockState
- + "; mCarMode=" + mCarModeEnabled
- + "; mNightMode=" + mNightMode
- + "; uiMode=" + uiMode);
+ "updateConfigurationLocked: mDockState=" + mDockState
+ + "; mCarMode=" + mCarModeEnabled
+ + "; mNightMode=" + mNightMode
+ + "; uiMode=" + uiMode);
}
mCurUiMode = uiMode;
@@ -1291,9 +1274,9 @@
if (LOG) {
Slog.v(TAG, String.format(
- "Handling broadcast result for action %s: enable=0x%08x, disable=0x%08x, "
- + "category=%s",
- action, enableFlags, disableFlags, category));
+ "Handling broadcast result for action %s: enable=0x%08x, disable=0x%08x, "
+ + "category=%s",
+ action, enableFlags, disableFlags, category));
}
sendConfigurationAndStartDreamOrDockAppLocked(category);
@@ -1356,8 +1339,8 @@
// have no effect until the device is unlocked.
if (mStatusBarManager != null) {
mStatusBarManager.disable(mCarModeEnabled
- ? StatusBarManager.DISABLE_NOTIFICATION_TICKER
- : StatusBarManager.DISABLE_NONE);
+ ? StatusBarManager.DISABLE_NOTIFICATION_TICKER
+ : StatusBarManager.DISABLE_NONE);
}
if (mNotificationManager == null) {
@@ -1382,7 +1365,8 @@
.setContentText(
context.getString(R.string.car_mode_disable_notification_message))
.setContentIntent(
- PendingIntent.getActivityAsUser(context, 0, carModeOffIntent, 0,
+ PendingIntent.getActivityAsUser(context, 0,
+ carModeOffIntent, 0,
null, UserHandle.CURRENT));
mNotificationManager.notifyAsUser(null,
SystemMessage.NOTE_CAR_MODE_DISABLE, n.build(), UserHandle.ALL);
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 0ebb5bb..d77bee3 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -1705,7 +1705,7 @@
if (acceptances > 0 || rejections > 0) {
FrameworkStatsLog.write(
FrameworkStatsLog.FOREGROUND_SERVICE_APP_OP_SESSION_ENDED,
- mProcessRecord.uid, AppOpsManager.opToLoggingId(op),
+ mProcessRecord.uid, op,
modeToEnum(mAppOpModes.get(op)),
acceptances, rejections
);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index a458498..4cfcd2b 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -17633,7 +17633,6 @@
@GuardedBy("this")
final void updateProcessForegroundLocked(ProcessRecord proc, boolean isForeground,
int fgServiceTypes, boolean oomAdj) {
-
if (isForeground != proc.hasForegroundServices()
|| proc.getForegroundServiceTypes() != fgServiceTypes) {
proc.setHasForegroundServices(isForeground, fgServiceTypes);
@@ -17666,10 +17665,9 @@
ProcessChangeItem item = enqueueProcessChangeItemLocked(proc.pid, proc.info.uid);
item.changes = ProcessChangeItem.CHANGE_FOREGROUND_SERVICES;
item.foregroundServiceTypes = fgServiceTypes;
-
- if (oomAdj) {
- updateOomAdjLocked(proc, OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
- }
+ }
+ if (oomAdj) {
+ updateOomAdjLocked(proc, OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
}
}
diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags
index cc5df40..17f4187 100644
--- a/services/core/java/com/android/server/am/EventLogTags.logtags
+++ b/services/core/java/com/android/server/am/EventLogTags.logtags
@@ -93,3 +93,16 @@
# The task is being unfrozen
30069 am_unfreeze (Pid|1|5),(Process Name|3)
+
+# User switch events
+30070 uc_finish_user_unlocking (UID|1|5)
+30071 uc_finish_user_unlocked (UID|1|5)
+30072 uc_finish_user_unlocked_completed (UID|1|5)
+30073 uc_finish_user_stopping (UID|1|5)
+30074 uc_finish_user_stopped (UID|1|5)
+30075 uc_switch_user (UID|1|5)
+30076 uc_start_user_internal (UID|1|5)
+30077 uc_unlock_user (UID|1|5)
+30078 uc_finish_user_boot (UID|1|5)
+30079 uc_dispatch_user_switch (oldUID|1|5) (newUID|1|5)
+30080 uc_continue_user_switch (oldUID|1|5) (newUID|1|5)
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index 2b1534b..d4a0502 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -1520,8 +1520,16 @@
!= 0 ? PROCESS_CAPABILITY_FOREGROUND_MICROPHONE
: TEMP_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE;
} else {
- capabilityFromFGS |= PROCESS_CAPABILITY_FOREGROUND_CAMERA
- | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE;
+ // Remove fgsType check and assign PROCESS_CAPABILITY_FOREGROUND_CAMERA
+ // and MICROPHONE when finish debugging.
+ capabilityFromFGS |=
+ (fgsType & FOREGROUND_SERVICE_TYPE_CAMERA)
+ != 0 ? PROCESS_CAPABILITY_FOREGROUND_CAMERA
+ : TEMP_PROCESS_CAPABILITY_FOREGROUND_CAMERA;
+ capabilityFromFGS |=
+ (fgsType & FOREGROUND_SERVICE_TYPE_MICROPHONE)
+ != 0 ? PROCESS_CAPABILITY_FOREGROUND_MICROPHONE
+ : TEMP_PROCESS_CAPABILITY_FOREGROUND_MICROPHONE;
}
}
}
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index 343b4ba..636a0e9 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -83,6 +83,7 @@
import android.os.storage.StorageManager;
import android.text.format.DateUtils;
import android.util.ArraySet;
+import android.util.EventLog;
import android.util.IntArray;
import android.util.Pair;
import android.util.Slog;
@@ -382,8 +383,8 @@
private void finishUserBoot(UserState uss, IIntentReceiver resultTo) {
final int userId = uss.mHandle.getIdentifier();
+ EventLog.writeEvent(EventLogTags.UC_FINISH_USER_BOOT, userId);
- Slog.d(TAG, "Finishing user boot " + userId);
synchronized (mLock) {
// Bail if we ended up with a stale user
if (mStartedUsers.get(userId) != uss) {
@@ -451,7 +452,7 @@
*/
private boolean finishUserUnlocking(final UserState uss) {
final int userId = uss.mHandle.getIdentifier();
- Slog.d(TAG, "UserController event: finishUserUnlocking(" + userId + ")");
+ EventLog.writeEvent(EventLogTags.UC_FINISH_USER_UNLOCKING, userId);
// Only keep marching forward if user is actually unlocked
if (!StorageManager.isUserKeyUnlocked(userId)) return false;
synchronized (mLock) {
@@ -496,7 +497,7 @@
*/
void finishUserUnlocked(final UserState uss) {
final int userId = uss.mHandle.getIdentifier();
- Slog.d(TAG, "UserController event: finishUserUnlocked(" + userId + ")");
+ EventLog.writeEvent(EventLogTags.UC_FINISH_USER_UNLOCKED, userId);
// Only keep marching forward if user is actually unlocked
if (!StorageManager.isUserKeyUnlocked(userId)) return;
synchronized (mLock) {
@@ -567,7 +568,7 @@
private void finishUserUnlockedCompleted(UserState uss) {
final int userId = uss.mHandle.getIdentifier();
- Slog.d(TAG, "UserController event: finishUserUnlockedCompleted(" + userId + ")");
+ EventLog.writeEvent(EventLogTags.UC_FINISH_USER_UNLOCKED_COMPLETED, userId);
synchronized (mLock) {
// Bail if we ended up with a stale user
if (mStartedUsers.get(uss.mHandle.getIdentifier()) != uss) return;
@@ -830,7 +831,7 @@
void finishUserStopping(final int userId, final UserState uss,
final boolean allowDelayedLocking) {
- Slog.d(TAG, "UserController event: finishUserStopping(" + userId + ")");
+ EventLog.writeEvent(EventLogTags.UC_FINISH_USER_STOPPING, userId);
// On to the next.
final Intent shutdownIntent = new Intent(Intent.ACTION_SHUTDOWN);
// This is the result receiver for the final shutdown broadcast.
@@ -870,7 +871,7 @@
void finishUserStopped(UserState uss, boolean allowDelayedLocking) {
final int userId = uss.mHandle.getIdentifier();
- Slog.d(TAG, "UserController event: finishUserStopped(" + userId + ")");
+ EventLog.writeEvent(EventLogTags.UC_FINISH_USER_STOPPED, userId);
final boolean stopped;
boolean lockUser = true;
final ArrayList<IStopUserCallback> stopCallbacks;
@@ -1147,7 +1148,7 @@
private boolean startUserInternal(@UserIdInt int userId, boolean foreground,
@Nullable IProgressListener unlockListener, @NonNull TimingsTraceAndSlog t) {
- Slog.i(TAG, "Starting userid:" + userId + " fg:" + foreground);
+ EventLog.writeEvent(EventLogTags.UC_START_USER_INTERNAL, userId);
final int callingUid = Binder.getCallingUid();
final int callingPid = Binder.getCallingPid();
@@ -1396,7 +1397,7 @@
boolean unlockUser(final @UserIdInt int userId, byte[] token, byte[] secret,
IProgressListener listener) {
checkCallingPermission(INTERACT_ACROSS_USERS_FULL, "unlockUser");
- Slog.i(TAG, "unlocking user " + userId);
+ EventLog.writeEvent(EventLogTags.UC_UNLOCK_USER, userId);
final long binderToken = Binder.clearCallingIdentity();
try {
return unlockUserCleared(userId, token, secret, listener);
@@ -1481,7 +1482,7 @@
boolean switchUser(final int targetUserId) {
enforceShellRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES, targetUserId);
- Slog.i(TAG, "switching to user " + targetUserId);
+ EventLog.writeEvent(EventLogTags.UC_SWITCH_USER, targetUserId);
int currentUserId = getCurrentUserId();
UserInfo targetUserInfo = getUserInfo(targetUserId);
if (targetUserId == currentUserId) {
@@ -1604,7 +1605,8 @@
}
void dispatchUserSwitch(final UserState uss, final int oldUserId, final int newUserId) {
- Slog.d(TAG, "Dispatch onUserSwitching oldUser #" + oldUserId + " newUser #" + newUserId);
+ EventLog.writeEvent(EventLogTags.UC_DISPATCH_USER_SWITCH, oldUserId, newUserId);
+
final int observerCount = mUserSwitchObservers.beginBroadcast();
if (observerCount > 0) {
final ArraySet<String> curWaitingUserSwitchCallbacks = new ArraySet<>();
@@ -1666,7 +1668,8 @@
}
void continueUserSwitch(UserState uss, int oldUserId, int newUserId) {
- Slog.d(TAG, "Continue user switch oldUser #" + oldUserId + ", newUser #" + newUserId);
+ EventLog.writeEvent(EventLogTags.UC_CONTINUE_USER_SWITCH, oldUserId, newUserId);
+
if (isUserSwitchUiEnabled()) {
mInjector.getWindowManager().stopFreezingScreen();
}
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 2e2241f..6613d5f 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -670,15 +670,19 @@
}
// TODO: remove this toast after feature development is done
- // If the procstate is foreground service and while-in-use permission is denied, show a
- // toast message to ask user to file a bugreport so we know how many apps are impacted by
- // the new background started foreground service while-in-use permission restriction.
+ // For DEBUG_FGS_ALLOW_WHILE_IN_USE, if the procstate is foreground service and while-in-use
+ // permission is denied, show a toast message and generate a WTF log so we know
+ // how many apps are impacted by the new background started foreground service while-in-use
+ // permission restriction.
+ // For DEBUG_FGS_ENFORCE_TYPE, The process has a foreground service that does not have
+ // camera/microphone foregroundServiceType in manifest file, and the process is asking
+ // AppOps for camera/microphone ops, show a toast message and generate a WTF log.
void maybeShowWhileInUseDebugToast(int op, int mode) {
- if (state != UID_STATE_FOREGROUND_SERVICE) {
+ if (mode == DEBUG_FGS_ALLOW_WHILE_IN_USE && state != UID_STATE_FOREGROUND_SERVICE) {
return;
}
final long now = System.currentTimeMillis();
- if (lastTimeShowDebugToast == 0 || now - lastTimeShowDebugToast > 3600000) {
+ if (lastTimeShowDebugToast == 0 || now - lastTimeShowDebugToast > 600000) {
lastTimeShowDebugToast = now;
mHandler.sendMessage(PooledLambda.obtainMessage(
ActivityManagerInternal::showWhileInUseDebugToast,
diff --git a/services/core/java/com/android/server/biometrics/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/AuthenticationClient.java
index 7bbda9f..766e5c4 100644
--- a/services/core/java/com/android/server/biometrics/AuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/AuthenticationClient.java
@@ -20,14 +20,11 @@
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricsProtoEnums;
-import android.hardware.biometrics.IBiometricNativeHandle;
import android.os.IBinder;
-import android.os.NativeHandle;
import android.os.RemoteException;
import android.security.KeyStore;
import android.util.Slog;
-import java.io.IOException;
import java.util.ArrayList;
/**
@@ -44,7 +41,6 @@
public static final int LOCKOUT_PERMANENT = 2;
private final boolean mRequireConfirmation;
- private final NativeHandle mWindowId;
// We need to track this state since it's possible for applications to request for
// authentication while the device is already locked out. In that case, the client is created
@@ -73,25 +69,11 @@
public AuthenticationClient(Context context, Constants constants,
BiometricServiceBase.DaemonWrapper daemon, long halDeviceId, IBinder token,
BiometricServiceBase.ServiceListener listener, int targetUserId, int groupId, long opId,
- boolean restricted, String owner, int cookie, boolean requireConfirmation,
- IBiometricNativeHandle windowId) {
+ boolean restricted, String owner, int cookie, boolean requireConfirmation) {
super(context, constants, daemon, halDeviceId, token, listener, targetUserId, groupId,
restricted, owner, cookie);
mOpId = opId;
mRequireConfirmation = requireConfirmation;
- mWindowId = Utils.dupNativeHandle(windowId);
- }
-
- @Override
- public void destroy() {
- if (mWindowId != null && mWindowId.getFileDescriptors() != null) {
- try {
- mWindowId.close();
- } catch (IOException e) {
- Slog.e(getLogTag(), "Failed to close windowId NativeHandle: ", e);
- }
- }
- super.destroy();
}
protected long getStartTimeMs() {
@@ -251,7 +233,7 @@
onStart();
try {
mStartTimeMs = System.currentTimeMillis();
- final int result = getDaemonWrapper().authenticate(mOpId, getGroupId(), mWindowId);
+ final int result = getDaemonWrapper().authenticate(mOpId, getGroupId());
if (result != 0) {
Slog.w(getLogTag(), "startAuthentication failed, result=" + result);
mMetricsLogger.histogram(mConstants.tagAuthStartError(), result);
diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
index 49006de..ebd407d 100644
--- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
+++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
@@ -32,7 +32,6 @@
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricsProtoEnums;
-import android.hardware.biometrics.IBiometricNativeHandle;
import android.hardware.biometrics.IBiometricService;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.biometrics.IBiometricServiceReceiverInternal;
@@ -44,7 +43,6 @@
import android.os.IBinder;
import android.os.IHwBinder;
import android.os.IRemoteCallback;
-import android.os.NativeHandle;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
@@ -223,10 +221,9 @@
public AuthenticationClientImpl(Context context, DaemonWrapper daemon, long halDeviceId,
IBinder token, ServiceListener listener, int targetUserId, int groupId, long opId,
- boolean restricted, String owner, int cookie, boolean requireConfirmation,
- IBiometricNativeHandle windowId) {
+ boolean restricted, String owner, int cookie, boolean requireConfirmation) {
super(context, getConstants(), daemon, halDeviceId, token, listener, targetUserId,
- groupId, opId, restricted, owner, cookie, requireConfirmation, windowId);
+ groupId, opId, restricted, owner, cookie, requireConfirmation);
}
@Override
@@ -287,10 +284,10 @@
public EnrollClientImpl(Context context, DaemonWrapper daemon, long halDeviceId,
IBinder token, ServiceListener listener, int userId, int groupId,
byte[] cryptoToken, boolean restricted, String owner,
- final int[] disabledFeatures, int timeoutSec, IBiometricNativeHandle windowId) {
+ final int[] disabledFeatures, int timeoutSec) {
super(context, getConstants(), daemon, halDeviceId, token, listener,
userId, groupId, cryptoToken, restricted, owner, getBiometricUtils(),
- disabledFeatures, timeoutSec, windowId);
+ disabledFeatures, timeoutSec);
}
@Override
@@ -476,13 +473,12 @@
*/
protected interface DaemonWrapper {
int ERROR_ESRCH = 3; // Likely HAL is dead. see errno.h.
- int authenticate(long operationId, int groupId, NativeHandle windowId)
- throws RemoteException;
+ int authenticate(long operationId, int groupId) throws RemoteException;
int cancel() throws RemoteException;
int remove(int groupId, int biometricId) throws RemoteException;
int enumerate() throws RemoteException;
int enroll(byte[] token, int groupId, int timeout,
- ArrayList<Integer> disabledFeatures, NativeHandle windowId) throws RemoteException;
+ ArrayList<Integer> disabledFeatures) throws RemoteException;
void resetLockout(byte[] token) throws RemoteException;
}
diff --git a/services/core/java/com/android/server/biometrics/EnrollClient.java b/services/core/java/com/android/server/biometrics/EnrollClient.java
index 684795e..7ebb7c0 100644
--- a/services/core/java/com/android/server/biometrics/EnrollClient.java
+++ b/services/core/java/com/android/server/biometrics/EnrollClient.java
@@ -20,13 +20,10 @@
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricsProtoEnums;
-import android.hardware.biometrics.IBiometricNativeHandle;
import android.os.IBinder;
-import android.os.NativeHandle;
import android.os.RemoteException;
import android.util.Slog;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -38,7 +35,6 @@
private final BiometricUtils mBiometricUtils;
private final int[] mDisabledFeatures;
private final int mTimeoutSec;
- private final NativeHandle mWindowId;
private long mEnrollmentStartTimeMs;
@@ -48,26 +44,13 @@
BiometricServiceBase.DaemonWrapper daemon, long halDeviceId, IBinder token,
BiometricServiceBase.ServiceListener listener, int userId, int groupId,
byte[] cryptoToken, boolean restricted, String owner, BiometricUtils utils,
- final int[] disabledFeatures, int timeoutSec, IBiometricNativeHandle windowId) {
+ final int[] disabledFeatures, int timeoutSec) {
super(context, constants, daemon, halDeviceId, token, listener, userId, groupId, restricted,
owner, 0 /* cookie */);
mBiometricUtils = utils;
mCryptoToken = Arrays.copyOf(cryptoToken, cryptoToken.length);
mDisabledFeatures = Arrays.copyOf(disabledFeatures, disabledFeatures.length);
mTimeoutSec = timeoutSec;
- mWindowId = Utils.dupNativeHandle(windowId);
- }
-
- @Override
- public void destroy() {
- if (mWindowId != null && mWindowId.getFileDescriptors() != null) {
- try {
- mWindowId.close();
- } catch (IOException e) {
- Slog.e(getLogTag(), "Failed to close windowId NativeHandle: ", e);
- }
- }
- super.destroy();
}
@Override
@@ -119,7 +102,7 @@
}
final int result = getDaemonWrapper().enroll(mCryptoToken, getGroupId(), mTimeoutSec,
- disabledFeatures, mWindowId);
+ disabledFeatures);
if (result != 0) {
Slog.w(getLogTag(), "startEnroll failed, result=" + result);
mMetricsLogger.histogram(mConstants.tagEnrollStartError(), result);
diff --git a/services/core/java/com/android/server/biometrics/Utils.java b/services/core/java/com/android/server/biometrics/Utils.java
index 3235499..14378da 100644
--- a/services/core/java/com/android/server/biometrics/Utils.java
+++ b/services/core/java/com/android/server/biometrics/Utils.java
@@ -23,17 +23,12 @@
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.BiometricPrompt;
import android.hardware.biometrics.BiometricPrompt.AuthenticationResultType;
-import android.hardware.biometrics.IBiometricNativeHandle;
import android.os.Build;
import android.os.Bundle;
-import android.os.NativeHandle;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.Slog;
-import java.io.FileDescriptor;
-import java.io.IOException;
-
public class Utils {
public static boolean isDebugEnabled(Context context, int targetUserId) {
if (targetUserId == UserHandle.USER_NULL) {
@@ -261,31 +256,4 @@
throw new IllegalArgumentException("Unsupported dismissal reason: " + reason);
}
}
-
- /**
- * Converts an {@link IBiometricNativeHandle} to a {@link NativeHandle} by duplicating the
- * the underlying file descriptors.
- *
- * Both the original and new handle must be closed after use.
- *
- * @param h {@link IBiometricNativeHandle} received as a binder call argument. Usually used to
- * identify a WindowManager window. Can be null.
- * @return A {@link NativeHandle} representation of {@code h}. Will be null if either {@code h}
- * or its contents are null.
- */
- public static NativeHandle dupNativeHandle(IBiometricNativeHandle h) {
- NativeHandle handle = null;
- if (h != null && h.fds != null && h.ints != null) {
- FileDescriptor[] fds = new FileDescriptor[h.fds.length];
- for (int i = 0; i < h.fds.length; ++i) {
- try {
- fds[i] = h.fds[i].dup().getFileDescriptor();
- } catch (IOException e) {
- return null;
- }
- }
- handle = new NativeHandle(fds, h.ints, true /* own */);
- }
- return handle;
- }
}
diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java
index f222f39..fd54129 100644
--- a/services/core/java/com/android/server/biometrics/face/FaceService.java
+++ b/services/core/java/com/android/server/biometrics/face/FaceService.java
@@ -34,7 +34,6 @@
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricsProtoEnums;
-import android.hardware.biometrics.IBiometricNativeHandle;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.biometrics.IBiometricServiceReceiverInternal;
import android.hardware.biometrics.face.V1_0.IBiometricsFace;
@@ -215,10 +214,9 @@
public FaceAuthClient(Context context,
DaemonWrapper daemon, long halDeviceId, IBinder token,
ServiceListener listener, int targetUserId, int groupId, long opId,
- boolean restricted, String owner, int cookie, boolean requireConfirmation,
- IBiometricNativeHandle windowId) {
+ boolean restricted, String owner, int cookie, boolean requireConfirmation) {
super(context, daemon, halDeviceId, token, listener, targetUserId, groupId, opId,
- restricted, owner, cookie, requireConfirmation, windowId);
+ restricted, owner, cookie, requireConfirmation);
}
@Override
@@ -375,7 +373,7 @@
@Override // Binder call
public void enroll(int userId, final IBinder token, final byte[] cryptoToken,
final IFaceServiceReceiver receiver, final String opPackageName,
- final int[] disabledFeatures, IBiometricNativeHandle windowId) {
+ final int[] disabledFeatures) {
checkPermission(MANAGE_BIOMETRIC);
updateActiveGroup(userId, opPackageName);
@@ -386,7 +384,7 @@
final EnrollClientImpl client = new EnrollClientImpl(getContext(), mDaemonWrapper,
mHalDeviceId, token, new ServiceListenerImpl(receiver), mCurrentUserId,
0 /* groupId */, cryptoToken, restricted, opPackageName, disabledFeatures,
- ENROLL_TIMEOUT_SEC, windowId) {
+ ENROLL_TIMEOUT_SEC) {
@Override
public int[] getAcquireIgnorelist() {
@@ -413,14 +411,6 @@
}
@Override // Binder call
- public void enrollRemotely(int userId, final IBinder token, final byte[] cryptoToken,
- final IFaceServiceReceiver receiver, final String opPackageName,
- final int[] disabledFeatures) {
- checkPermission(MANAGE_BIOMETRIC);
- // TODO(b/145027036): Implement this.
- }
-
- @Override // Binder call
public void cancelEnrollment(final IBinder token) {
checkPermission(MANAGE_BIOMETRIC);
cancelEnrollmentInternal(token);
@@ -436,7 +426,7 @@
final AuthenticationClientImpl client = new FaceAuthClient(getContext(),
mDaemonWrapper, mHalDeviceId, token, new ServiceListenerImpl(receiver),
mCurrentUserId, 0 /* groupId */, opId, restricted, opPackageName,
- 0 /* cookie */, false /* requireConfirmation */, null /* windowId */);
+ 0 /* cookie */, false /* requireConfirmation */);
authenticateInternal(client, opId, opPackageName);
}
@@ -452,7 +442,7 @@
mDaemonWrapper, mHalDeviceId, token,
new BiometricPromptServiceListenerImpl(wrapperReceiver),
mCurrentUserId, 0 /* groupId */, opId, restricted, opPackageName, cookie,
- requireConfirmation, null /* windowId */);
+ requireConfirmation);
authenticateInternal(client, opId, opPackageName, callingUid, callingPid,
callingUserId);
}
@@ -986,8 +976,7 @@
*/
private final DaemonWrapper mDaemonWrapper = new DaemonWrapper() {
@Override
- public int authenticate(long operationId, int groupId, NativeHandle windowId)
- throws RemoteException {
+ public int authenticate(long operationId, int groupId) throws RemoteException {
IBiometricsFace daemon = getFaceDaemon();
if (daemon == null) {
Slog.w(TAG, "authenticate(): no face HAL!");
@@ -1028,7 +1017,7 @@
@Override
public int enroll(byte[] cryptoToken, int groupId, int timeout,
- ArrayList<Integer> disabledFeatures, NativeHandle windowId) throws RemoteException {
+ ArrayList<Integer> disabledFeatures) throws RemoteException {
IBiometricsFace daemon = getFaceDaemon();
if (daemon == null) {
Slog.w(TAG, "enroll(): no face HAL!");
@@ -1038,17 +1027,7 @@
for (int i = 0; i < cryptoToken.length; i++) {
token.add(cryptoToken[i]);
}
- android.hardware.biometrics.face.V1_1.IBiometricsFace daemon11 =
- android.hardware.biometrics.face.V1_1.IBiometricsFace.castFrom(
- daemon);
- if (daemon11 != null) {
- return daemon11.enroll_1_1(token, timeout, disabledFeatures, windowId);
- } else if (windowId == null) {
- return daemon.enroll(token, timeout, disabledFeatures);
- } else {
- Slog.e(TAG, "enroll(): windowId is only supported in @1.1 HAL");
- return ERROR_ESRCH;
- }
+ return daemon.enroll(token, timeout, disabledFeatures);
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintAuthenticator.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintAuthenticator.java
index 5bbeef1..4604752 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintAuthenticator.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintAuthenticator.java
@@ -38,7 +38,7 @@
String opPackageName, int cookie, int callingUid, int callingPid, int callingUserId)
throws RemoteException {
mFingerprintService.prepareForAuthentication(token, sessionId, userId, wrapperReceiver,
- opPackageName, cookie, callingUid, callingPid, callingUserId, null /* windowId */);
+ opPackageName, cookie, callingUid, callingPid, callingUserId);
}
@Override
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
index 4d55450..acb1a2f 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
@@ -38,7 +38,6 @@
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricConstants;
import android.hardware.biometrics.BiometricsProtoEnums;
-import android.hardware.biometrics.IBiometricNativeHandle;
import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
import android.hardware.biometrics.IBiometricServiceReceiverInternal;
import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
@@ -52,7 +51,6 @@
import android.os.Build;
import android.os.Environment;
import android.os.IBinder;
-import android.os.NativeHandle;
import android.os.RemoteException;
import android.os.SELinux;
import android.os.SystemClock;
@@ -135,9 +133,9 @@
DaemonWrapper daemon, long halDeviceId, IBinder token,
ServiceListener listener, int targetUserId, int groupId, long opId,
boolean restricted, String owner, int cookie,
- boolean requireConfirmation, IBiometricNativeHandle windowId) {
+ boolean requireConfirmation) {
super(context, daemon, halDeviceId, token, listener, targetUserId, groupId, opId,
- restricted, owner, cookie, requireConfirmation, windowId);
+ restricted, owner, cookie, requireConfirmation);
}
@Override
@@ -201,7 +199,7 @@
@Override // Binder call
public void enroll(final IBinder token, final byte[] cryptoToken, final int userId,
final IFingerprintServiceReceiver receiver, final int flags,
- final String opPackageName, IBiometricNativeHandle windowId) {
+ final String opPackageName) {
checkPermission(MANAGE_FINGERPRINT);
final boolean restricted = isRestricted();
@@ -209,7 +207,7 @@
final EnrollClientImpl client = new EnrollClientImpl(getContext(), mDaemonWrapper,
mHalDeviceId, token, new ServiceListenerImpl(receiver), mCurrentUserId, groupId,
cryptoToken, restricted, opPackageName, new int[0] /* disabledFeatures */,
- ENROLL_TIMEOUT_SEC, windowId) {
+ ENROLL_TIMEOUT_SEC) {
@Override
public boolean shouldVibrate() {
return true;
@@ -233,22 +231,20 @@
@Override // Binder call
public void authenticate(final IBinder token, final long opId, final int groupId,
final IFingerprintServiceReceiver receiver, final int flags,
- final String opPackageName, IBiometricNativeHandle windowId) {
+ final String opPackageName) {
updateActiveGroup(groupId, opPackageName);
final boolean restricted = isRestricted();
final AuthenticationClientImpl client = new FingerprintAuthClient(getContext(),
mDaemonWrapper, mHalDeviceId, token, new ServiceListenerImpl(receiver),
mCurrentUserId, groupId, opId, restricted, opPackageName,
- 0 /* cookie */, false /* requireConfirmation */,
- windowId);
+ 0 /* cookie */, false /* requireConfirmation */);
authenticateInternal(client, opId, opPackageName);
}
@Override // Binder call
public void prepareForAuthentication(IBinder token, long opId, int groupId,
IBiometricServiceReceiverInternal wrapperReceiver, String opPackageName,
- int cookie, int callingUid, int callingPid, int callingUserId,
- IBiometricNativeHandle windowId) {
+ int cookie, int callingUid, int callingPid, int callingUserId) {
checkPermission(MANAGE_BIOMETRIC);
updateActiveGroup(groupId, opPackageName);
final boolean restricted = true; // BiometricPrompt is always restricted
@@ -256,8 +252,7 @@
mDaemonWrapper, mHalDeviceId, token,
new BiometricPromptServiceListenerImpl(wrapperReceiver),
mCurrentUserId, groupId, opId, restricted, opPackageName, cookie,
- false /* requireConfirmation */,
- windowId);
+ false /* requireConfirmation */);
authenticateInternal(client, opId, opPackageName, callingUid, callingPid,
callingUserId);
}
@@ -656,24 +651,13 @@
*/
private final DaemonWrapper mDaemonWrapper = new DaemonWrapper() {
@Override
- public int authenticate(long operationId, int groupId, NativeHandle windowId)
- throws RemoteException {
+ public int authenticate(long operationId, int groupId) throws RemoteException {
IBiometricsFingerprint daemon = getFingerprintDaemon();
if (daemon == null) {
Slog.w(TAG, "authenticate(): no fingerprint HAL!");
return ERROR_ESRCH;
}
- android.hardware.biometrics.fingerprint.V2_2.IBiometricsFingerprint daemon22 =
- android.hardware.biometrics.fingerprint.V2_2.IBiometricsFingerprint.castFrom(
- daemon);
- if (daemon22 != null) {
- return daemon22.authenticate_2_2(operationId, groupId, windowId);
- } else if (windowId == null) {
- return daemon.authenticate(operationId, groupId);
- } else {
- Slog.e(TAG, "authenticate(): windowId is only supported in @2.2 HAL");
- return ERROR_ESRCH;
- }
+ return daemon.authenticate(operationId, groupId);
}
@Override
@@ -708,27 +692,13 @@
@Override
public int enroll(byte[] cryptoToken, int groupId, int timeout,
- ArrayList<Integer> disabledFeatures, NativeHandle windowId) throws RemoteException {
+ ArrayList<Integer> disabledFeatures) throws RemoteException {
IBiometricsFingerprint daemon = getFingerprintDaemon();
if (daemon == null) {
Slog.w(TAG, "enroll(): no fingerprint HAL!");
return ERROR_ESRCH;
}
- android.hardware.biometrics.fingerprint.V2_2.IBiometricsFingerprint daemon22 =
- android.hardware.biometrics.fingerprint.V2_2.IBiometricsFingerprint.castFrom(
- daemon);
- if (daemon22 != null) {
- ArrayList<Byte> cryptoTokenAsList = new ArrayList<>(cryptoToken.length);
- for (byte b : cryptoToken) {
- cryptoTokenAsList.add(b);
- }
- return daemon22.enroll_2_2(cryptoTokenAsList, groupId, timeout, windowId);
- } else if (windowId == null) {
- return daemon.enroll(cryptoToken, groupId, timeout);
- } else {
- Slog.e(TAG, "enroll(): windowId is only supported in @2.2 HAL");
- return ERROR_ESRCH;
- }
+ return daemon.enroll(cryptoToken, groupId, timeout);
}
@Override
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 065e0c3..0b22586 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -60,6 +60,7 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.provider.DeviceConfig;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.text.TextUtils;
@@ -126,6 +127,9 @@
private static final String EXCLUDED_DEVICES_PATH = "etc/excluded-input-devices.xml";
private static final String PORT_ASSOCIATIONS_PATH = "etc/input-port-associations.xml";
+ // Feature flag name for the deep press feature
+ private static final String DEEP_PRESS_ENABLED = "deep_press_enabled";
+
private static final int MSG_DELIVER_INPUT_DEVICES_CHANGED = 1;
private static final int MSG_SWITCH_KEYBOARD_LAYOUT = 2;
private static final int MSG_RELOAD_KEYBOARD_LAYOUTS = 3;
@@ -246,6 +250,7 @@
private static native void nativeSetPointerCapture(long ptr, boolean detached);
private static native boolean nativeCanDispatchToDisplay(long ptr, int deviceId, int displayId);
private static native void nativeNotifyPortAssociationsChanged(long ptr);
+ private static native void nativeSetMotionClassifierEnabled(long ptr, boolean enabled);
// Input event injection constants defined in InputDispatcher.h.
private static final int INPUT_EVENT_INJECTION_SUCCEEDED = 0;
@@ -356,6 +361,7 @@
registerPointerSpeedSettingObserver();
registerShowTouchesSettingObserver();
registerAccessibilityLargePointerSettingObserver();
+ registerLongPressTimeoutObserver();
mContext.registerReceiver(new BroadcastReceiver() {
@Override
@@ -363,12 +369,14 @@
updatePointerSpeedFromSettings();
updateShowTouchesFromSettings();
updateAccessibilityLargePointerFromSettings();
+ updateDeepPressStatusFromSettings("user switched");
}
}, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mHandler);
updatePointerSpeedFromSettings();
updateShowTouchesFromSettings();
updateAccessibilityLargePointerFromSettings();
+ updateDeepPressStatusFromSettings("just booted");
}
// TODO(BT) Pass in parameter for bluetooth system
@@ -1600,7 +1608,7 @@
setPointerSpeedUnchecked(speed);
}
- public void updatePointerSpeedFromSettings() {
+ private void updatePointerSpeedFromSettings() {
int speed = getPointerSpeedSetting();
setPointerSpeedUnchecked(speed);
}
@@ -1632,7 +1640,7 @@
return speed;
}
- public void updateShowTouchesFromSettings() {
+ private void updateShowTouchesFromSettings() {
int setting = getShowTouchesSetting(0);
nativeSetShowTouches(mPtr, setting != 0);
}
@@ -1648,7 +1656,7 @@
}, UserHandle.USER_ALL);
}
- public void updateAccessibilityLargePointerFromSettings() {
+ private void updateAccessibilityLargePointerFromSettings() {
final int accessibilityConfig = Settings.Secure.getIntForUser(
mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON,
0, UserHandle.USER_CURRENT);
@@ -1667,6 +1675,34 @@
}, UserHandle.USER_ALL);
}
+ private void updateDeepPressStatusFromSettings(String reason) {
+ // Not using ViewConfiguration.getLongPressTimeout here because it may return a stale value
+ final int timeout = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.LONG_PRESS_TIMEOUT, ViewConfiguration.DEFAULT_LONG_PRESS_TIMEOUT,
+ UserHandle.USER_CURRENT);
+ final boolean featureEnabledFlag =
+ DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_INPUT_NATIVE_BOOT,
+ DEEP_PRESS_ENABLED, true /* default */);
+ final boolean enabled =
+ featureEnabledFlag && timeout <= ViewConfiguration.DEFAULT_LONG_PRESS_TIMEOUT;
+ Log.i(TAG,
+ (enabled ? "Enabling" : "Disabling") + " motion classifier because " + reason
+ + ": feature " + (featureEnabledFlag ? "enabled" : "disabled")
+ + ", long press timeout = " + timeout);
+ nativeSetMotionClassifierEnabled(mPtr, enabled);
+ }
+
+ private void registerLongPressTimeoutObserver() {
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.LONG_PRESS_TIMEOUT), true,
+ new ContentObserver(mHandler) {
+ @Override
+ public void onChange(boolean selfChange) {
+ updateDeepPressStatusFromSettings("timeout changed");
+ }
+ }, UserHandle.USER_ALL);
+ }
+
private int getShowTouchesSetting(int defaultValue) {
int result = defaultValue;
try {
diff --git a/services/core/java/com/android/server/notification/BubbleExtractor.java b/services/core/java/com/android/server/notification/BubbleExtractor.java
index c96880c..e5cb554 100644
--- a/services/core/java/com/android/server/notification/BubbleExtractor.java
+++ b/services/core/java/com/android/server/notification/BubbleExtractor.java
@@ -219,7 +219,7 @@
String shortcutId = metadata.getShortcutId();
boolean shortcutValid = shortcutId != null
&& mShortcutHelper.hasValidShortcutInfo(shortcutId, pkg, r.getUser());
- if (metadata.getBubbleIntent() == null && !shortcutValid) {
+ if (metadata.getIntent() == null && !shortcutValid) {
// Should have a shortcut if intent is null
logBubbleError(r.getKey(),
"couldn't find valid shortcut for bubble with shortcutId: " + shortcutId);
@@ -229,7 +229,7 @@
return true;
}
// no log: canLaunch method has the failure log
- return canLaunchInActivityView(mContext, metadata.getBubbleIntent(), pkg);
+ return canLaunchInActivityView(mContext, metadata.getIntent(), pkg);
}
/**
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 89e245c..b79f75a 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -24660,15 +24660,6 @@
}
@Override
- public void clearMimeGroup(String packageName, String mimeGroup) {
- boolean changed = mSettings.mPackages.get(packageName).clearMimeGroup(mimeGroup);
-
- if (changed) {
- applyMimeGroupChanges(packageName, mimeGroup);
- }
- }
-
- @Override
public List<String> getMimeGroup(String packageName, String mimeGroup) {
return mSettings.mPackages.get(packageName).getMimeGroup(mimeGroup);
}
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java
index a83a847..9a8692d 100644
--- a/services/core/java/com/android/server/pm/PackageSetting.java
+++ b/services/core/java/com/android/server/pm/PackageSetting.java
@@ -241,7 +241,8 @@
public boolean setMimeGroup(String mimeGroup, List<String> mimeTypes) {
ArraySet<String> oldMimeTypes = getMimeGroupInternal(mimeGroup);
if (oldMimeTypes == null) {
- return false;
+ throw new IllegalArgumentException("Unknown MIME group " + mimeGroup
+ + " for package " + name);
}
ArraySet<String> newMimeTypes = new ArraySet<>(mimeTypes);
@@ -250,21 +251,11 @@
return hasChanges;
}
- public boolean clearMimeGroup(String mimeGroup) {
- ArraySet<String> mimeTypes = getMimeGroupInternal(mimeGroup);
-
- if (mimeTypes == null || mimeTypes.isEmpty()) {
- return false;
- }
-
- mimeTypes.clear();
- return true;
- }
-
public List<String> getMimeGroup(String mimeGroup) {
ArraySet<String> mimeTypes = getMimeGroupInternal(mimeGroup);
if (mimeTypes == null) {
- return null;
+ throw new IllegalArgumentException("Unknown MIME group " + mimeGroup
+ + " for package " + name);
}
return new ArrayList<>(mimeTypes);
}
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index e3abcda..a726d39 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -125,7 +125,6 @@
static {
- PHONE_PERMISSIONS.add(Manifest.permission.READ_PHONE_STATE);
PHONE_PERMISSIONS.add(Manifest.permission.CALL_PHONE);
PHONE_PERMISSIONS.add(Manifest.permission.READ_CALL_LOG);
PHONE_PERMISSIONS.add(Manifest.permission.WRITE_CALL_LOG);
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index 5d6eaf2..79d0c2d 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -59,6 +59,7 @@
import android.app.ApplicationPackageManager;
import android.app.IActivityManager;
import android.app.admin.DeviceAdminInfo;
+import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledAfter;
@@ -113,6 +114,7 @@
import android.util.SparseBooleanArray;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.compat.IPlatformCompat;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -243,6 +245,9 @@
@GuardedBy("mLock")
private final PermissionSettings mSettings;
+ /** Injector that can be used to facilitate testing. */
+ private final Injector mInjector;
+
@GuardedBy("mLock")
private ArraySet<String> mPrivappPermissionsViolations;
@@ -352,10 +357,17 @@
PermissionManagerService(Context context,
@NonNull Object externalLock) {
+ this(context, externalLock, new Injector(context));
+ }
+
+ @VisibleForTesting
+ PermissionManagerService(Context context, @NonNull Object externalLock,
+ @NonNull Injector injector) {
+ mInjector = injector;
// The package info cache is the cache for package and permission information.
- PackageManager.invalidatePackageInfoCache();
- PermissionManager.disablePermissionCache();
- PermissionManager.disablePackageNamePermissionCache();
+ mInjector.invalidatePackageInfoCache();
+ mInjector.disablePermissionCache();
+ mInjector.disablePackageNamePermissionCache();
mContext = context;
mLock = externalLock;
@@ -952,6 +964,59 @@
}
@Override
+ public int checkDeviceIdentifierAccess(@Nullable String packageName, @Nullable String message,
+ @Nullable String callingFeatureId, int pid, int uid) {
+ // If the check is being requested by an app then only allow the app to query its own
+ // access status.
+ int callingUid = mInjector.getCallingUid();
+ int callingPid = mInjector.getCallingPid();
+ if (UserHandle.getAppId(callingUid) >= Process.FIRST_APPLICATION_UID && (callingUid != uid
+ || callingPid != pid)) {
+ String response = String.format(
+ "Calling uid %d, pid %d cannot check device identifier access for package %s "
+ + "(uid=%d, pid=%d)",
+ callingUid, callingPid, packageName, uid, pid);
+ Log.w(TAG, response);
+ throw new SecurityException(response);
+ }
+ // Allow system and root access to the device identifiers.
+ final int appId = UserHandle.getAppId(uid);
+ if (appId == Process.SYSTEM_UID || appId == Process.ROOT_UID) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ // Allow access to packages that have the READ_PRIVILEGED_PHONE_STATE permission.
+ if (mInjector.checkPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, pid,
+ uid) == PackageManager.PERMISSION_GRANTED) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ // If the calling package is not null then perform the appop and device / profile owner
+ // check.
+ if (packageName != null) {
+ // Allow access to a package that has been granted the READ_DEVICE_IDENTIFIERS appop.
+ long token = mInjector.clearCallingIdentity();
+ AppOpsManager appOpsManager = (AppOpsManager) mInjector.getSystemService(
+ Context.APP_OPS_SERVICE);
+ try {
+ if (appOpsManager.noteOpNoThrow(AppOpsManager.OPSTR_READ_DEVICE_IDENTIFIERS, uid,
+ packageName, callingFeatureId, message) == AppOpsManager.MODE_ALLOWED) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ } finally {
+ mInjector.restoreCallingIdentity(token);
+ }
+ // Check if the calling packages meets the device / profile owner requirements for
+ // identifier access.
+ DevicePolicyManager devicePolicyManager =
+ (DevicePolicyManager) mInjector.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ if (devicePolicyManager != null && devicePolicyManager.hasDeviceIdentifierAccess(
+ packageName, pid, uid)) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ }
+ return PackageManager.PERMISSION_DENIED;
+ }
+
+ @Override
public void addOnPermissionsChangeListener(IOnPermissionsChangeListener listener) {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS,
@@ -4797,4 +4862,94 @@
}
}
}
+
+ /**
+ * Allows injection of services and method responses to facilitate testing.
+ *
+ * <p>Test classes can create a mock of this class and pass it to the PermissionManagerService
+ * constructor to control behavior of services and external methods during execution.
+ * @hide
+ */
+ @VisibleForTesting
+ public static class Injector {
+ private final Context mContext;
+
+ /**
+ * Public constructor that accepts a {@code context} within which to operate.
+ */
+ public Injector(@NonNull Context context) {
+ mContext = context;
+ }
+
+ /**
+ * Returns the UID of the calling package.
+ */
+ public int getCallingUid() {
+ return Binder.getCallingUid();
+ }
+
+ /**
+ * Returns the process ID of the calling package.
+ */
+ public int getCallingPid() {
+ return Binder.getCallingPid();
+ }
+
+ /**
+ * Invalidates the package info cache.
+ */
+ public void invalidatePackageInfoCache() {
+ PackageManager.invalidatePackageInfoCache();
+ }
+
+ /**
+ * Disables the permission cache.
+ */
+ public void disablePermissionCache() {
+ PermissionManager.disablePermissionCache();
+ }
+
+ /**
+ * Disables the package name permission cache.
+ */
+ public void disablePackageNamePermissionCache() {
+ PermissionManager.disablePackageNamePermissionCache();
+ }
+
+ /**
+ * Checks if the package running under the specified {@code pid} and {@code uid} has been
+ * granted the provided {@code permission}.
+ *
+ * @return {@link PackageManager#PERMISSION_GRANTED} if the package has been granted the
+ * permission, {@link PackageManager#PERMISSION_DENIED} otherwise
+ */
+ public int checkPermission(@NonNull String permission, int pid, int uid) {
+ return mContext.checkPermission(permission, pid, uid);
+ }
+
+ /**
+ * Clears the calling identity to allow subsequent calls to be treated as coming from this
+ * package.
+ *
+ * @return a token that can be used to restore the calling identity
+ */
+ public long clearCallingIdentity() {
+ return Binder.clearCallingIdentity();
+ }
+
+ /**
+ * Restores the calling identity to that of the calling package based on the provided
+ * {@code token}.
+ */
+ public void restoreCallingIdentity(long token) {
+ Binder.restoreCallingIdentity(token);
+ }
+
+ /**
+ * Returns the system service with the provided {@code name}.
+ */
+ public Object getSystemService(@NonNull String name) {
+ return mContext.getSystemService(name);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java b/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java
index 6c18c8d..39aeafc 100644
--- a/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java
+++ b/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java
@@ -163,7 +163,7 @@
}
@Override
public boolean mayAllowExtraAppOp() {
- return !shouldApplyRestriction && targetSDK <= Build.VERSION_CODES.Q
+ return !shouldApplyRestriction
&& (hasRequestedLegacyExternalStorage
|| hasWriteMediaStorageGrantedForUid
|| shouldPreserveLegacyExternalStorage);
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 1fc9594..b1c40cc 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -2439,7 +2439,7 @@
private boolean isAttentiveTimeoutExpired(long now) {
long attentiveTimeout = getAttentiveTimeoutLocked();
- return attentiveTimeout >= 0 && now > mLastUserActivityTime + attentiveTimeout;
+ return attentiveTimeout >= 0 && now >= mLastUserActivityTime + attentiveTimeout;
}
/**
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index f1f5bfe..e133c0fa 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -2901,7 +2901,7 @@
e.setAtomId(atomTag);
e.writeInt(uid);
e.writeString(packageOps.getPackageName());
- e.writeInt(op.getLoggingOpCode());
+ e.writeInt(op.getOpCode());
e.writeLong(op.getForegroundAccessCount(OP_FLAGS_PULLED));
e.writeLong(op.getBackgroundAccessCount(OP_FLAGS_PULLED));
e.writeLong(op.getForegroundRejectCount(OP_FLAGS_PULLED));
@@ -3044,7 +3044,7 @@
if (atomTag == FrameworkStatsLog.ATTRIBUTED_APP_OPS) {
e.writeString(attributionTag);
}
- e.writeInt(op.getLoggingOpCode());
+ e.writeInt(op.getOpCode());
e.writeLong(op.getForegroundAccessCount(OP_FLAGS_PULLED));
e.writeLong(op.getBackgroundAccessCount(OP_FLAGS_PULLED));
e.writeLong(op.getForegroundRejectCount(OP_FLAGS_PULLED));
diff --git a/services/core/java/com/android/server/storage/StorageSessionController.java b/services/core/java/com/android/server/storage/StorageSessionController.java
index baef5d6..0fd77b9c 100644
--- a/services/core/java/com/android/server/storage/StorageSessionController.java
+++ b/services/core/java/com/android/server/storage/StorageSessionController.java
@@ -106,6 +106,38 @@
}
/**
+ * Notifies the Storage Service that volume state for {@code vol} is changed.
+ * A session may already be created for this volume if it is mounted before or the volume state
+ * has changed to mounted.
+ *
+ * Does nothing if {@link #shouldHandle} is {@code false}
+ *
+ * Blocks until the Storage Service processes/scans the volume or fails in doing so.
+ *
+ * @throws ExternalStorageServiceException if it fails to connect to ExternalStorageService
+ */
+ public void notifyVolumeStateChanged(VolumeInfo vol) throws ExternalStorageServiceException {
+ if (!shouldHandle(vol)) {
+ return;
+ }
+ String sessionId = vol.getId();
+ int userId = vol.getMountUserId();
+
+ StorageUserConnection connection = null;
+ synchronized (mLock) {
+ connection = mConnections.get(userId);
+ if (connection != null) {
+ Slog.i(TAG, "Notifying volume state changed for session with id: " + sessionId);
+ connection.notifyVolumeStateChanged(sessionId,
+ vol.buildStorageVolume(mContext, userId, false));
+ } else {
+ Slog.w(TAG, "No available storage user connection for userId : " + userId);
+ }
+ }
+ }
+
+
+ /**
* Removes and returns the {@link StorageUserConnection} for {@code vol}.
*
* Does nothing if {@link #shouldHandle} is {@code false}
diff --git a/services/core/java/com/android/server/storage/StorageUserConnection.java b/services/core/java/com/android/server/storage/StorageUserConnection.java
index dd18f4e..c207a7b 100644
--- a/services/core/java/com/android/server/storage/StorageUserConnection.java
+++ b/services/core/java/com/android/server/storage/StorageUserConnection.java
@@ -35,6 +35,7 @@
import android.os.RemoteCallback;
import android.os.UserHandle;
import android.os.storage.StorageManagerInternal;
+import android.os.storage.StorageVolume;
import android.service.storage.ExternalStorageService;
import android.service.storage.IExternalStorageService;
import android.text.TextUtils;
@@ -100,6 +101,23 @@
}
/**
+ * Notifies Storage Service about volume state changed.
+ *
+ * @throws ExternalStorageServiceException if failed to notify the Storage Service that
+ * {@code StorageVolume} is changed
+ */
+ public void notifyVolumeStateChanged(String sessionId, StorageVolume vol)
+ throws ExternalStorageServiceException {
+ Objects.requireNonNull(sessionId);
+ Objects.requireNonNull(vol);
+
+ prepareRemote();
+ synchronized (mLock) {
+ mActiveConnection.notifyVolumeStateChangedLocked(sessionId, vol);
+ }
+ }
+
+ /**
* Removes a session without ending it or waiting for exit.
*
* This should only be used if the session has certainly been ended because the volume was
@@ -287,6 +305,20 @@
}
}
+ public void notifyVolumeStateChangedLocked(String sessionId, StorageVolume vol) throws
+ ExternalStorageServiceException {
+ CountDownLatch latch = new CountDownLatch(1);
+ try {
+ mRemote.notifyVolumeStateChanged(sessionId, vol, new RemoteCallback(
+ result -> setResultLocked(latch, result)));
+ waitForLatch(latch, "notify_volume_state_changed " + vol);
+ maybeThrowExceptionLocked();
+ } catch (Exception e) {
+ throw new ExternalStorageServiceException("Failed to notify volume state changed "
+ + "for vol : " + vol, e);
+ }
+ }
+
private void setResultLocked(CountDownLatch latch, Bundle result) {
mLastException = result.getParcelable(EXTRA_ERROR);
latch.countDown();
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 00c6f3a..6d53786 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -7677,12 +7677,6 @@
return;
}
win.getAnimationFrames(outFrame, outInsets, outStableInsets, outSurfaceInsets);
- if (isFixedRotationTransforming()) {
- // This activity has been rotated but the display is still in old rotation. Because the
- // animation applies in display space coordinates, the rotated animation frames need to
- // be unrotated to avoid being cropped.
- unrotateAnimationFrames(outFrame, outInsets, outStableInsets, outSurfaceInsets);
- }
}
void setPictureInPictureParams(PictureInPictureParams p) {
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 38a406e..34acabe 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -336,12 +336,6 @@
@GuardedBy("mHandler")
private SleepToken mDreamingSleepToken;
- @GuardedBy("mHandler")
- private SleepToken mWindowSleepToken;
-
- private final Runnable mAcquireSleepTokenRunnable;
- private final Runnable mReleaseSleepTokenRunnable;
-
// The windows we were told about in focusChanged.
private WindowState mFocusedWindow;
private WindowState mLastFocusedWindow;
@@ -401,8 +395,6 @@
private boolean mLastShowingDream;
private boolean mDreamingLockscreen;
private boolean mDreamingSleepTokenNeeded;
- private boolean mWindowSleepTokenNeeded;
- private boolean mLastWindowSleepTokenNeeded;
private boolean mAllowLockscreenWhenOn;
private InputConsumer mInputConsumer = null;
@@ -618,20 +610,6 @@
mStatusBarController.getAppTransitionListener());
mImmersiveModeConfirmation = new ImmersiveModeConfirmation(mContext, looper,
mService.mVrModeEnabled);
- mAcquireSleepTokenRunnable = () -> {
- if (mWindowSleepToken != null) {
- return;
- }
- mWindowSleepToken = service.mAtmInternal.acquireSleepToken(
- "WindowSleepTokenOnDisplay" + displayId, displayId);
- };
- mReleaseSleepTokenRunnable = () -> {
- if (mWindowSleepToken == null) {
- return;
- }
- mWindowSleepToken.release();
- mWindowSleepToken = null;
- };
// TODO: Make it can take screenshot on external display
mScreenshotHelper = displayContent.isDefaultDisplay
@@ -2531,7 +2509,6 @@
mAllowLockscreenWhenOn = false;
mShowingDream = false;
- mWindowSleepTokenNeeded = false;
mIsFreeformWindowOverlappingWithNavBar = false;
}
@@ -2745,23 +2722,10 @@
mService.notifyShowingDreamChanged();
}
- updateWindowSleepToken();
-
mService.mPolicy.setAllowLockscreenWhenOn(getDisplayId(), mAllowLockscreenWhenOn);
return changes;
}
- private void updateWindowSleepToken() {
- if (mWindowSleepTokenNeeded && !mLastWindowSleepTokenNeeded) {
- mHandler.removeCallbacks(mReleaseSleepTokenRunnable);
- mHandler.post(mAcquireSleepTokenRunnable);
- } else if (!mWindowSleepTokenNeeded && mLastWindowSleepTokenNeeded) {
- mHandler.removeCallbacks(mAcquireSleepTokenRunnable);
- mHandler.post(mReleaseSleepTokenRunnable);
- }
- mLastWindowSleepTokenNeeded = mWindowSleepTokenNeeded;
- }
-
/**
* @return Whether the top app should hide the statusbar based on the top fullscreen opaque
* window.
diff --git a/services/core/java/com/android/server/wm/SeamlessRotator.java b/services/core/java/com/android/server/wm/SeamlessRotator.java
index 8e1c632..c79cb04 100644
--- a/services/core/java/com/android/server/wm/SeamlessRotator.java
+++ b/services/core/java/com/android/server/wm/SeamlessRotator.java
@@ -20,7 +20,6 @@
import static android.view.Surface.ROTATION_90;
import android.graphics.Matrix;
-import android.graphics.Rect;
import android.os.IBinder;
import android.view.DisplayInfo;
import android.view.Surface.Rotation;
@@ -28,7 +27,6 @@
import android.view.SurfaceControl.Transaction;
import com.android.server.wm.utils.CoordinateTransforms;
-import com.android.server.wm.utils.InsetUtils;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -47,22 +45,18 @@
private final float[] mFloat9 = new float[9];
private final int mOldRotation;
private final int mNewRotation;
- private final int mRotationDelta;
- private final int mW;
- private final int mH;
public SeamlessRotator(@Rotation int oldRotation, @Rotation int newRotation, DisplayInfo info) {
mOldRotation = oldRotation;
mNewRotation = newRotation;
- mRotationDelta = DisplayContent.deltaRotation(oldRotation, newRotation);
final boolean flipped = info.rotation == ROTATION_90 || info.rotation == ROTATION_270;
- mH = flipped ? info.logicalWidth : info.logicalHeight;
- mW = flipped ? info.logicalHeight : info.logicalWidth;
-
+ final int pH = flipped ? info.logicalWidth : info.logicalHeight;
+ final int pW = flipped ? info.logicalHeight : info.logicalWidth;
+ // Initialize transform matrix by physical size.
final Matrix tmp = new Matrix();
- CoordinateTransforms.transformLogicalToPhysicalCoordinates(oldRotation, mW, mH, mTransform);
- CoordinateTransforms.transformPhysicalToLogicalCoordinates(newRotation, mW, mH, tmp);
+ CoordinateTransforms.transformLogicalToPhysicalCoordinates(oldRotation, pW, pH, mTransform);
+ CoordinateTransforms.transformPhysicalToLogicalCoordinates(newRotation, pW, pH, tmp);
mTransform.postConcat(tmp);
}
@@ -78,20 +72,6 @@
transaction.setPosition(win.getSurfaceControl(), winSurfacePos[0], winSurfacePos[1]);
}
- /** Rotates the frame from {@link #mNewRotation} to {@link #mOldRotation}. */
- void unrotateFrame(Rect inOut) {
- if (mRotationDelta == ROTATION_90) {
- inOut.set(inOut.top, mH - inOut.right, inOut.bottom, mH - inOut.left);
- } else if (mRotationDelta == ROTATION_270) {
- inOut.set(mW - inOut.bottom, inOut.left, mW - inOut.top, inOut.right);
- }
- }
-
- /** Rotates the insets from {@link #mNewRotation} to {@link #mOldRotation}. */
- void unrotateInsets(Rect inOut) {
- InsetUtils.rotateInsets(inOut, mRotationDelta);
- }
-
/**
* Returns the rotation of the display before it started rotating.
*
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index f826deb..fb079f3 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -1918,7 +1918,6 @@
super.onConfigurationChanged(newParentConfig);
if (wasInMultiWindowMode != inMultiWindowMode()) {
mStackSupervisor.scheduleUpdateMultiWindowMode(this);
- updateShadowsRadius(isFocused(), getPendingTransaction());
}
final int newWinMode = getWindowingMode();
@@ -1938,7 +1937,12 @@
// TODO: Should also take care of Pip mode changes here.
saveLaunchingStateIfNeeded();
- updateTaskOrganizerState(false /* forceUpdate */);
+ final boolean taskOrgChanged = updateTaskOrganizerState(false /* forceUpdate */);
+ // If the task organizer has changed, then it will already be receiving taskAppeared with
+ // the latest task-info thus the task-info won't have changed.
+ if (!taskOrgChanged && mTaskOrganizer != null) {
+ mAtmService.mTaskOrganizerController.dispatchTaskInfoChanged(this, false /* force */);
+ }
}
/**
@@ -3320,6 +3324,7 @@
}
updateSurfaceCrop();
+ updateShadowsRadius(isFocused(), getPendingTransaction());
if (mDimmer.updateDims(getPendingTransaction(), mTmpDimBoundsRect)) {
scheduleAnimation();
@@ -4043,15 +4048,16 @@
}
}
- void setTaskOrganizer(ITaskOrganizer organizer) {
+ boolean setTaskOrganizer(ITaskOrganizer organizer) {
if (mTaskOrganizer == organizer) {
- return;
+ return false;
}
// Let the old organizer know it has lost control.
sendTaskVanished();
mTaskOrganizer = organizer;
sendTaskAppeared();
onTaskOrganizerChanged();
+ return true;
}
// Called on Binder death.
@@ -4068,10 +4074,11 @@
* @param forceUpdate Updates the task organizer to the one currently specified in the task
* org controller for the task's windowing mode, ignoring the cached
* windowing mode checks.
+ * @return {@code true} if task organizer changed.
*/
- void updateTaskOrganizerState(boolean forceUpdate) {
+ boolean updateTaskOrganizerState(boolean forceUpdate) {
if (!isRootTask()) {
- return;
+ return false;
}
final int windowingMode = getWindowingMode();
@@ -4080,7 +4087,7 @@
// with our old organizer. This lets us implement the semantic
// where SysUI can continue to manage it's old tasks
// while CTS temporarily takes over the registration.
- return;
+ return false;
}
/*
* Different windowing modes may be managed by different task organizers. If
@@ -4089,8 +4096,9 @@
*/
final ITaskOrganizer org =
mWmService.mAtmService.mTaskOrganizerController.getTaskOrganizer(windowingMode);
- setTaskOrganizer(org);
+ final boolean result = setTaskOrganizer(org);
mLastTaskOrganizerWindowingMode = windowingMode;
+ return result;
}
private void onTaskOrganizerChanged() {
@@ -4141,26 +4149,40 @@
}
/**
+ * @return true if the task is visible and has at least one visible child.
+ */
+ private boolean hasVisibleChildren() {
+ if (!isAttached() || isForceHidden()) {
+ return false;
+ }
+
+ return getActivity(ActivityRecord::isVisible) != null;
+ }
+
+ /**
* @return the desired shadow radius in pixels for the current task.
*/
private float getShadowRadius(boolean taskIsFocused) {
- if (mDisplayContent == null) {
+ int elevation = 0;
+
+ // Get elevation for a specific windowing mode.
+ if (inPinnedWindowingMode()) {
+ elevation = PINNED_WINDOWING_MODE_ELEVATION_IN_DIP;
+ } else if (ENABLE_FREEFORM_COMPOSITOR_SHADOWS && inFreeformWindowingMode()) {
+ // TODO(b/149585281) remove when root task has the correct bounds for freeform
+ elevation = taskIsFocused
+ ? DECOR_SHADOW_FOCUSED_HEIGHT_IN_DIP : DECOR_SHADOW_UNFOCUSED_HEIGHT_IN_DIP;
+ } else {
+ // For all other windowing modes, do not draw a shadow.
return 0;
}
- if (inPinnedWindowingMode()) {
- return dipToPixel(PINNED_WINDOWING_MODE_ELEVATION_IN_DIP,
- mDisplayContent.getDisplayMetrics());
- }
- // TODO(b/149585281) remove when root task has the correct bounds for freeform
- if (ENABLE_FREEFORM_COMPOSITOR_SHADOWS && inFreeformWindowingMode()) {
- final int elevation = taskIsFocused
- ? DECOR_SHADOW_FOCUSED_HEIGHT_IN_DIP : DECOR_SHADOW_UNFOCUSED_HEIGHT_IN_DIP;
- return dipToPixel(elevation, mDisplayContent.getDisplayMetrics());
+ // If the task has no visible children, do not draw a shadow.
+ if (!hasVisibleChildren()) {
+ return 0;
}
- // For all other windowing modes, do not draw a shadow.
- return 0;
+ return dipToPixel(elevation, getDisplayContent().getDisplayMetrics());
}
/**
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index cc52cb4..82c590d 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -67,6 +67,21 @@
private static final int TRANSACT_EFFECTS_CLIENT_CONFIG = 1;
private static final int TRANSACT_EFFECTS_LIFECYCLE = 1 << 1;
+ /**
+ * Masks specifying which configurations task-organizers can control. Incoming transactions
+ * will be filtered to only include these.
+ */
+ private static final int CONTROLLABLE_CONFIGS = ActivityInfo.CONFIG_WINDOW_CONFIGURATION
+ | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE | ActivityInfo.CONFIG_SCREEN_SIZE;
+ private static final int CONTROLLABLE_WINDOW_CONFIGS = WindowConfiguration.WINDOW_CONFIG_BOUNDS
+ | WindowConfiguration.WINDOW_CONFIG_APP_BOUNDS;
+ /**
+ * Masks specifying which configurations are important to report back to an organizer when
+ * changed.
+ */
+ private static final int REPORT_CONFIGS = CONTROLLABLE_CONFIGS;
+ private static final int REPORT_WINDOW_CONFIGS = CONTROLLABLE_WINDOW_CONFIGS;
+
private final WindowManagerGlobalLock mGlobalLock;
private class DeathRecipient implements IBinder.DeathRecipient {
@@ -321,11 +336,23 @@
if (mTmpTaskInfo == null) {
mTmpTaskInfo = new RunningTaskInfo();
}
+ mTmpTaskInfo.configuration.unset();
task.fillTaskInfo(mTmpTaskInfo);
boolean changed = lastInfo == null
|| mTmpTaskInfo.topActivityType != lastInfo.topActivityType
|| mTmpTaskInfo.isResizable() != lastInfo.isResizable()
|| mTmpTaskInfo.pictureInPictureParams != lastInfo.pictureInPictureParams;
+ if (!changed) {
+ int cfgChanges = mTmpTaskInfo.configuration.diff(lastInfo.configuration);
+ final int winCfgChanges = (cfgChanges & ActivityInfo.CONFIG_WINDOW_CONFIGURATION) != 0
+ ? (int) mTmpTaskInfo.configuration.windowConfiguration.diff(
+ lastInfo.configuration.windowConfiguration,
+ true /* compareUndefined */) : 0;
+ if ((winCfgChanges & REPORT_WINDOW_CONFIGS) == 0) {
+ cfgChanges &= ~ActivityInfo.CONFIG_WINDOW_CONFIGURATION;
+ }
+ changed = (cfgChanges & REPORT_CONFIGS) != 0;
+ }
if (!(changed || force)) {
return;
}
@@ -480,12 +507,8 @@
final Task task = (Task) container;
// The "client"-facing API should prevent bad changes; however, just in case, sanitize
// masks here.
- int configMask = change.getConfigSetMask();
- int windowMask = change.getWindowSetMask();
- configMask &= ActivityInfo.CONFIG_WINDOW_CONFIGURATION
- | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE | ActivityInfo.CONFIG_SCREEN_SIZE;
- windowMask &= (WindowConfiguration.WINDOW_CONFIG_BOUNDS
- | WindowConfiguration.WINDOW_CONFIG_APP_BOUNDS);
+ final int configMask = change.getConfigSetMask() & CONTROLLABLE_CONFIGS;
+ final int windowMask = change.getWindowSetMask() & CONTROLLABLE_WINDOW_CONFIGS;
int effects = 0;
if (configMask != 0) {
Configuration c = new Configuration(container.getRequestedOverrideConfiguration());
@@ -672,7 +695,17 @@
false /* preserveWindow */);
try {
for (int i = haveConfigChanges.size() - 1; i >= 0; --i) {
- haveConfigChanges.valueAt(i).forAllActivities(f);
+ final WindowContainer wc = haveConfigChanges.valueAt(i);
+ final Task task = wc.asTask();
+ final TaskTile tile = task != null ? task.asTile() : null;
+ if (tile != null) {
+ // Special case for tile. Can't override normal forAllActivities
+ // because it generates duplicate calls and messes up existing
+ // code-paths.
+ tile.forAllTileActivities(f);
+ } else {
+ wc.forAllActivities(f);
+ }
}
} finally {
f.recycle();
diff --git a/services/core/java/com/android/server/wm/TaskTile.java b/services/core/java/com/android/server/wm/TaskTile.java
index 205b423..822f840 100644
--- a/services/core/java/com/android/server/wm/TaskTile.java
+++ b/services/core/java/com/android/server/wm/TaskTile.java
@@ -34,6 +34,7 @@
import java.util.ArrayList;
import java.util.Comparator;
+import java.util.function.Consumer;
/**
* A Tile. Right now this acts as a proxy for manipulating non-child stacks. Eventually, this
@@ -141,6 +142,12 @@
}
}
+ void forAllTileActivities(Consumer<ActivityRecord> callback) {
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ mChildren.get(i).forAllActivities(callback, true /* traverseTopToBottom */);
+ }
+ }
+
/**
* Until this can be part of the hierarchy, the Stack level can use this utility during
* resolveOverrideConfig to simulate inheritance.
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 3617570..161152b 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -5656,7 +5656,12 @@
// the status bar). In that case we need to use the final frame.
if (inFreeformWindowingMode()) {
outFrame.set(getFrameLw());
- } else if (isLetterboxedAppWindow()) {
+ } else if (isLetterboxedAppWindow() || mToken.isFixedRotationTransforming()) {
+ // 1. The letterbox surfaces should be animated with the owner activity, so use task
+ // bounds to include them.
+ // 2. If the activity has fixed rotation transform, its windows are rotated in activity
+ // level. Because the animation runs before display is rotated, task bounds should
+ // represent the frames in display space coordinates.
outFrame.set(getTask().getBounds());
} else if (isDockedResizing()) {
// If we are animating while docked resizing, then use the stack bounds as the
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index b7c6af2..f965f7b 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -154,7 +154,10 @@
void resetTransform() {
for (int i = mRotatedContainers.size() - 1; i >= 0; i--) {
final WindowContainer<?> c = mRotatedContainers.get(i);
- mRotator.finish(c.getPendingTransaction(), c);
+ // If the window is detached (no parent), its surface may have been released.
+ if (c.getParent() != null) {
+ mRotator.finish(c.getPendingTransaction(), c);
+ }
}
}
}
@@ -510,19 +513,6 @@
}
/**
- * Converts the rotated animation frames and insets back to display space for local animation.
- * It should only be called when {@link #hasFixedRotationTransform} is true.
- */
- void unrotateAnimationFrames(Rect outFrame, Rect outInsets, Rect outStableInsets,
- Rect outSurfaceInsets) {
- final SeamlessRotator rotator = mFixedRotationTransformState.mRotator;
- rotator.unrotateFrame(outFrame);
- rotator.unrotateInsets(outInsets);
- rotator.unrotateInsets(outStableInsets);
- rotator.unrotateInsets(outSurfaceInsets);
- }
-
- /**
* Gives a chance to this {@link WindowToken} to adjust the {@link
* android.view.WindowManager.LayoutParams} of its windows.
*/
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index e0d4045..e3f9ae8 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -220,6 +220,7 @@
void reloadPointerIcons();
void setCustomPointerIcon(const SpriteIcon& icon);
void setPointerCapture(bool enabled);
+ void setMotionClassifierEnabled(bool enabled);
/* --- InputReaderPolicyInterface implementation --- */
@@ -1295,6 +1296,10 @@
return POINTER_ICON_STYLE_CUSTOM;
}
+void NativeInputManager::setMotionClassifierEnabled(bool enabled) {
+ mInputManager->setMotionClassifierEnabled(enabled);
+}
+
// ----------------------------------------------------------------------------
static jlong nativeInit(JNIEnv* env, jclass /* clazz */,
@@ -1774,6 +1779,13 @@
InputReaderConfiguration::CHANGE_DISPLAY_INFO);
}
+static void nativeSetMotionClassifierEnabled(JNIEnv* /* env */, jclass /* clazz */, jlong ptr,
+ jboolean enabled) {
+ NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
+
+ im->setMotionClassifierEnabled(enabled);
+}
+
// ----------------------------------------------------------------------------
static const JNINativeMethod gInputManagerMethods[] = {
@@ -1832,6 +1844,7 @@
(void*)nativeSetCustomPointerIcon},
{"nativeCanDispatchToDisplay", "(JII)Z", (void*)nativeCanDispatchToDisplay},
{"nativeNotifyPortAssociationsChanged", "(J)V", (void*)nativeNotifyPortAssociationsChanged},
+ {"nativeSetMotionClassifierEnabled", "(JZ)V", (void*)nativeSetMotionClassifierEnabled},
};
#define FIND_CLASS(var, className) \
diff --git a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
index 5f0c8fe3..725036c 100644
--- a/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
+++ b/services/core/jni/com_android_server_pm_PackageManagerShellCommandDataLoader.cpp
@@ -51,7 +51,8 @@
using FileIdx = int16_t;
using BlockIdx = int32_t;
using NumBlocks = int32_t;
-using CompressionType = int16_t;
+using BlockType = int8_t;
+using CompressionType = int8_t;
using RequestType = int16_t;
using MagicType = uint32_t;
@@ -59,7 +60,7 @@
static constexpr int BLOCKS_COUNT = BUFFER_SIZE / INCFS_DATA_FILE_BLOCK_SIZE;
static constexpr int COMMAND_SIZE = 4 + 2 + 2 + 4; // bytes
-static constexpr int HEADER_SIZE = 2 + 2 + 4 + 2; // bytes
+static constexpr int HEADER_SIZE = 2 + 1 + 1 + 4 + 2; // bytes
static constexpr std::string_view OKAY = "OKAY"sv;
static constexpr MagicType INCR = 0x52434e49; // BE INCR
@@ -110,6 +111,7 @@
struct BlockHeader {
FileIdx fileIdx = -1;
+ BlockType blockType = -1;
CompressionType compressionType = -1;
BlockIdx blockIdx = -1;
BlockSize blockSize = -1;
@@ -649,8 +651,8 @@
auto remainingData = std::span(data);
while (!remainingData.empty()) {
auto header = readHeader(remainingData);
- if (header.fileIdx == -1 && header.compressionType == 0 && header.blockIdx == 0 &&
- header.blockSize == 0) {
+ if (header.fileIdx == -1 && header.blockType == 0 && header.compressionType == 0 &&
+ header.blockIdx == 0 && header.blockSize == 0) {
ALOGI("Stop signal received. Sending exit command (remaining bytes: %d).",
int(remainingData.size()));
@@ -658,8 +660,8 @@
mStopReceiving = true;
break;
}
- if (header.fileIdx < 0 || header.blockSize <= 0 || header.compressionType < 0 ||
- header.blockIdx < 0) {
+ if (header.fileIdx < 0 || header.blockSize <= 0 || header.blockType < 0 ||
+ header.compressionType < 0 || header.blockIdx < 0) {
ALOGE("invalid header received. Abort.");
mStopReceiving = true;
break;
@@ -687,7 +689,7 @@
.fileFd = writeFd,
.pageIndex = static_cast<IncFsBlockIndex>(header.blockIdx),
.compression = static_cast<IncFsCompressionKind>(header.compressionType),
- .kind = INCFS_BLOCK_KIND_DATA,
+ .kind = static_cast<IncFsBlockKind>(header.blockType),
.dataSize = static_cast<uint16_t>(header.blockSize),
.data = (const char*)remainingData.data(),
};
@@ -761,8 +763,8 @@
}
header.fileIdx = static_cast<FileIdx>(be16toh(*reinterpret_cast<const uint16_t*>(&data[0])));
- header.compressionType =
- static_cast<CompressionType>(be16toh(*reinterpret_cast<const uint16_t*>(&data[2])));
+ header.blockType = static_cast<BlockType>(data[2]);
+ header.compressionType = static_cast<CompressionType>(data[3]);
header.blockIdx = static_cast<BlockIdx>(be32toh(*reinterpret_cast<const uint32_t*>(&data[4])));
header.blockSize =
static_cast<BlockSize>(be16toh(*reinterpret_cast<const uint16_t*>(&data[8])));
diff --git a/services/core/jni/com_android_server_stats_pull_StatsPullAtomService.cpp b/services/core/jni/com_android_server_stats_pull_StatsPullAtomService.cpp
index 43cd0a2..b1fbe64 100644
--- a/services/core/jni/com_android_server_stats_pull_StatsPullAtomService.cpp
+++ b/services/core/jni/com_android_server_stats_pull_StatsPullAtomService.cpp
@@ -46,17 +46,15 @@
static void nativeInit(JNIEnv* env, jobject javaObject) {
// on device power measurement
gPowerStatsPuller = server::stats::PowerStatsPuller();
- AStatsManager_registerPullAtomCallback(android::util::ON_DEVICE_POWER_MEASUREMENT,
- onDevicePowerMeasurementCallback,
- /* metadata= */ nullptr,
- /* cookie= */ nullptr);
+ AStatsManager_setPullAtomCallback(android::util::ON_DEVICE_POWER_MEASUREMENT,
+ /* metadata= */ nullptr, onDevicePowerMeasurementCallback,
+ /* cookie= */ nullptr);
// subsystem sleep state
gSubsystemSleepStatePuller = server::stats::SubsystemSleepStatePuller();
- AStatsManager_registerPullAtomCallback(android::util::SUBSYSTEM_SLEEP_STATE,
- subsystemSleepStateCallback,
- /* metadata= */ nullptr,
- /* cookie= */ nullptr);
+ AStatsManager_setPullAtomCallback(android::util::SUBSYSTEM_SLEEP_STATE,
+ /* metadata= */ nullptr, subsystemSleepStateCallback,
+ /* cookie= */ nullptr);
}
static const JNINativeMethod sMethods[] = {{"nativeInit", "()V", (void*)nativeInit}};
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 6ab5303..ef183a2 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -11440,9 +11440,9 @@
}
@Override
- public boolean isSecondaryLockscreenEnabled(int userId) {
+ public boolean isSecondaryLockscreenEnabled(@NonNull UserHandle userHandle) {
synchronized (getLockObject()) {
- return getUserData(userId).mSecondaryLockscreenEnabled;
+ return getUserData(userHandle.getIdentifier()).mSecondaryLockscreenEnabled;
}
}
diff --git a/services/people/java/com/android/server/people/data/DataManager.java b/services/people/java/com/android/server/people/data/DataManager.java
index 7085f96..ae8d5743 100644
--- a/services/people/java/com/android/server/people/data/DataManager.java
+++ b/services/people/java/com/android/server/people/data/DataManager.java
@@ -152,42 +152,12 @@
/** This method is called when a user is stopping. */
public void onUserStopping(int userId) {
synchronized (mLock) {
- ContentResolver contentResolver = mContext.getContentResolver();
- if (mUserDataArray.indexOfKey(userId) >= 0) {
- mUserDataArray.get(userId).setUserStopped();
+ UserData userData = mUserDataArray.get(userId);
+ if (userData != null) {
+ userData.setUserStopped();
}
- if (mUsageStatsQueryFutures.indexOfKey(userId) >= 0) {
- mUsageStatsQueryFutures.get(userId).cancel(true);
- }
- if (mBroadcastReceivers.indexOfKey(userId) >= 0) {
- mContext.unregisterReceiver(mBroadcastReceivers.get(userId));
- }
- if (mContactsContentObservers.indexOfKey(userId) >= 0) {
- contentResolver.unregisterContentObserver(mContactsContentObservers.get(userId));
- }
- if (mNotificationListeners.indexOfKey(userId) >= 0) {
- try {
- mNotificationListeners.get(userId).unregisterAsSystemService();
- } catch (RemoteException e) {
- // Should never occur for local calls.
- }
- }
- if (mPackageMonitors.indexOfKey(userId) >= 0) {
- mPackageMonitors.get(userId).unregister();
- }
- if (userId == UserHandle.USER_SYSTEM) {
- if (mCallLogContentObserver != null) {
- contentResolver.unregisterContentObserver(mCallLogContentObserver);
- mCallLogContentObserver = null;
- }
- if (mMmsSmsContentObserver != null) {
- contentResolver.unregisterContentObserver(mMmsSmsContentObserver);
- mCallLogContentObserver = null;
- }
- }
-
- DataMaintenanceService.cancelJob(mContext, userId);
}
+ mScheduledExecutor.execute(() -> cleanupUser(userId));
}
/**
@@ -371,6 +341,47 @@
}
}
+ private void cleanupUser(@UserIdInt int userId) {
+ synchronized (mLock) {
+ UserData userData = mUserDataArray.get(userId);
+ if (userData == null || userData.isUnlocked()) {
+ return;
+ }
+ ContentResolver contentResolver = mContext.getContentResolver();
+ if (mUsageStatsQueryFutures.indexOfKey(userId) >= 0) {
+ mUsageStatsQueryFutures.get(userId).cancel(true);
+ }
+ if (mBroadcastReceivers.indexOfKey(userId) >= 0) {
+ mContext.unregisterReceiver(mBroadcastReceivers.get(userId));
+ }
+ if (mContactsContentObservers.indexOfKey(userId) >= 0) {
+ contentResolver.unregisterContentObserver(mContactsContentObservers.get(userId));
+ }
+ if (mNotificationListeners.indexOfKey(userId) >= 0) {
+ try {
+ mNotificationListeners.get(userId).unregisterAsSystemService();
+ } catch (RemoteException e) {
+ // Should never occur for local calls.
+ }
+ }
+ if (mPackageMonitors.indexOfKey(userId) >= 0) {
+ mPackageMonitors.get(userId).unregister();
+ }
+ if (userId == UserHandle.USER_SYSTEM) {
+ if (mCallLogContentObserver != null) {
+ contentResolver.unregisterContentObserver(mCallLogContentObserver);
+ mCallLogContentObserver = null;
+ }
+ if (mMmsSmsContentObserver != null) {
+ contentResolver.unregisterContentObserver(mMmsSmsContentObserver);
+ mCallLogContentObserver = null;
+ }
+ }
+
+ DataMaintenanceService.cancelJob(mContext, userId);
+ }
+ }
+
private int mimeTypeToShareEventType(String mimeType) {
if (mimeType.startsWith("text/")) {
return Event.TYPE_SHARE_TEXT;
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index 5bf0d03..7c6ac17 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -4267,12 +4267,14 @@
mContext.binder.callingUid = DpmMockContext.CALLER_UID;
// Initial state is disabled.
- assertFalse(dpm.isSecondaryLockscreenEnabled(DpmMockContext.CALLER_USER_HANDLE));
+ assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(
+ DpmMockContext.CALLER_USER_HANDLE)));
// Profile owner can set enabled state.
setAsProfileOwner(admin1);
dpm.setSecondaryLockscreenEnabled(admin1, true);
- assertTrue(dpm.isSecondaryLockscreenEnabled(DpmMockContext.CALLER_USER_HANDLE));
+ assertTrue(dpm.isSecondaryLockscreenEnabled(UserHandle.of(
+ DpmMockContext.CALLER_USER_HANDLE)));
// Managed profile managed by different package is unaffiliated - cannot set enabled.
final int managedProfileUserId = 15;
@@ -4289,24 +4291,26 @@
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
// Initial state is disabled.
- assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.USER_SYSTEM));
+ assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(UserHandle.USER_SYSTEM)));
// Device owners can set enabled state.
setupDeviceOwner();
dpm.setSecondaryLockscreenEnabled(admin1, true);
- assertTrue(dpm.isSecondaryLockscreenEnabled(UserHandle.USER_SYSTEM));
+ assertTrue(dpm.isSecondaryLockscreenEnabled(UserHandle.of(UserHandle.USER_SYSTEM)));
}
public void testSecondaryLockscreen_nonOwner() throws Exception {
mContext.binder.callingUid = DpmMockContext.CALLER_UID;
// Initial state is disabled.
- assertFalse(dpm.isSecondaryLockscreenEnabled(DpmMockContext.CALLER_USER_HANDLE));
+ assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(
+ DpmMockContext.CALLER_USER_HANDLE)));
// Non-DO/PO cannot set enabled state.
assertExpectException(SecurityException.class, /* messageRegex= */ null,
() -> dpm.setSecondaryLockscreenEnabled(admin1, true));
- assertFalse(dpm.isSecondaryLockscreenEnabled(DpmMockContext.CALLER_USER_HANDLE));
+ assertFalse(dpm.isSecondaryLockscreenEnabled(UserHandle.of(
+ DpmMockContext.CALLER_USER_HANDLE)));
}
public void testIsDeviceManaged() throws Exception {
diff --git a/services/tests/servicestests/src/com/android/server/pm/permission/PermissionManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/permission/PermissionManagerServiceTest.java
new file mode 100644
index 0000000..56966776
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/pm/permission/PermissionManagerServiceTest.java
@@ -0,0 +1,197 @@
+/*
+ * 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.server.pm.permission;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.app.AppOpsManager;
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Process;
+import android.permission.PermissionManagerInternal;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.server.LocalServices;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@RunWith(AndroidJUnit4.class)
+public class PermissionManagerServiceTest {
+ private static final String TAG = "PermissionManagerServiceTag";
+
+ private static final int SYSTEM_UID = 1000;
+ private static final int SYSTEM_PID = 1234;
+ private static final int APP_UID = Process.FIRST_APPLICATION_UID;
+ private static final int APP_PID = 5678;
+
+ private PermissionManagerService mPermissionManagerService;
+ private Context mContext;
+
+ @Mock
+ private PermissionManagerService.Injector mInjector;
+
+ @Mock
+ private AppOpsManager mAppOpsManager;
+
+ @Mock
+ private DevicePolicyManager mDevicePolicyManager;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = InstrumentationRegistry.getContext();
+ Object lock = new Object();
+ mPermissionManagerService = new PermissionManagerService(mContext, lock, mInjector);
+ }
+
+ @After
+ public void tearDown() {
+ // The LocalServices added by the constructor of the PermissionManagerService can either be
+ // removed here after each test when tests are run serially, or to run them in parallel
+ // the Injector can provide methods to add these that can be ignored by the mock.
+ LocalServices.removeServiceForTest(PermissionManagerServiceInternal.class);
+ LocalServices.removeServiceForTest(PermissionManagerInternal.class);
+ }
+
+ @Test
+ public void checkDeviceIdentifierAccess_callingAppUidMismatch_throwsException() {
+ // An application should only be able to query its own device identifier access, querying
+ // of any other UIDs should result in a SecurityException.
+ setupCheckDeviceIdentifierAccessTest(APP_PID, APP_UID);
+
+ assertThrows(SecurityException.class,
+ () -> mPermissionManagerService.checkDeviceIdentifierAccess(
+ mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null,
+ APP_PID, SYSTEM_UID));
+ }
+
+ @Test
+ public void checkDeviceIdentifierAccess_callingAppPidMismatch_throwsException() {
+ // Similar to above an app can only specify its own pid, a mismatch should result in a
+ // SecurityException.
+ setupCheckDeviceIdentifierAccessTest(APP_PID, APP_UID);
+
+ assertThrows(SecurityException.class,
+ () -> mPermissionManagerService.checkDeviceIdentifierAccess(
+ mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null,
+ SYSTEM_PID, APP_UID));
+ }
+
+ @Test
+ public void checkDeviceIdentifierAccess_callingAppIdWithoutAccess_returnsDenied() {
+ // An application can query its own device identifier access; this test verifies that all
+ // checks can run through completion and return denied.
+ setupCheckDeviceIdentifierAccessTest(APP_PID, APP_UID);
+
+ int result = mPermissionManagerService.checkDeviceIdentifierAccess(
+ mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID,
+ APP_UID);
+
+ assertEquals(PackageManager.PERMISSION_DENIED, result);
+ }
+
+ @Test
+ public void checkDeviceIdentifierAccess_systemUid_returnsGranted() {
+ // The system UID should always have access to device identifiers.
+ setupCheckDeviceIdentifierAccessTest(SYSTEM_PID, SYSTEM_UID);
+ int result = mPermissionManagerService.checkDeviceIdentifierAccess(
+ mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, SYSTEM_PID,
+ SYSTEM_UID);
+
+ assertEquals(PackageManager.PERMISSION_GRANTED, result);
+ }
+
+ @Test
+ public void checkDeviceIdentifierAccess_hasPrivilegedPermission_returnsGranted() {
+ // Apps with the READ_PRIVILEGED_PHONE_STATE permission should have access to device
+ // identifiers.
+ setupCheckDeviceIdentifierAccessTest(SYSTEM_PID, SYSTEM_UID);
+ when(mInjector.checkPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
+ APP_PID, APP_UID)).thenReturn(PackageManager.PERMISSION_GRANTED);
+
+ int result = mPermissionManagerService.checkDeviceIdentifierAccess(
+ mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID,
+ APP_UID);
+
+ assertEquals(PackageManager.PERMISSION_GRANTED, result);
+ }
+
+ @Test
+ public void checkDeviceIdentifierAccess_hasAppOp_returnsGranted() {
+ // Apps that have been granted the READ_DEVICE_IDENTIFIERS appop should have access to
+ // device identifiers.
+ setupCheckDeviceIdentifierAccessTest(SYSTEM_PID, SYSTEM_UID);
+ when(mAppOpsManager.noteOpNoThrow(eq(AppOpsManager.OPSTR_READ_DEVICE_IDENTIFIERS),
+ eq(APP_UID), eq(mContext.getPackageName()), any(), any())).thenReturn(
+ AppOpsManager.MODE_ALLOWED);
+
+ int result = mPermissionManagerService.checkDeviceIdentifierAccess(
+ mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID,
+ APP_UID);
+
+ assertEquals(PackageManager.PERMISSION_GRANTED, result);
+ }
+
+ @Test
+ public void checkDeviceIdentifierAccess_hasDpmAccess_returnsGranted() {
+ // Apps that pass a DevicePolicyManager device / profile owner check should have access to
+ // device identifiers.
+ setupCheckDeviceIdentifierAccessTest(SYSTEM_PID, SYSTEM_UID);
+ when(mDevicePolicyManager.hasDeviceIdentifierAccess(mContext.getPackageName(), APP_PID,
+ APP_UID)).thenReturn(true);
+
+ int result = mPermissionManagerService.checkDeviceIdentifierAccess(
+ mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID,
+ APP_UID);
+
+ assertEquals(PackageManager.PERMISSION_GRANTED, result);
+ }
+
+ private void setupCheckDeviceIdentifierAccessTest(int callingPid, int callingUid) {
+ when(mInjector.getCallingPid()).thenReturn(callingPid);
+ when(mInjector.getCallingUid()).thenReturn(callingUid);
+
+ // Configure the checkDeviceIdentifierAccess tests to fail all access checks, then each test
+ // can individually set the access check to pass for verification.
+ when(mInjector.checkPermission(anyString(), anyInt(), anyInt())).thenReturn(
+ PackageManager.PERMISSION_DENIED);
+
+ when(mAppOpsManager.noteOpNoThrow(anyString(), anyInt(), anyString(), any(),
+ any())).thenReturn(AppOpsManager.MODE_DEFAULT);
+ when(mInjector.getSystemService(eq(Context.APP_OPS_SERVICE))).thenReturn(mAppOpsManager);
+
+ when(mDevicePolicyManager.hasDeviceIdentifierAccess(anyString(), anyInt(),
+ anyInt())).thenReturn(false);
+ when(mInjector.getSystemService(eq(Context.DEVICE_POLICY_SERVICE))).thenReturn(
+ mDevicePolicyManager);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
index 1a4ce8a..bb51471 100644
--- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -63,7 +63,6 @@
import android.os.PowerSaveState;
import android.os.SystemClock;
import android.os.UserHandle;
-import android.platform.test.annotations.FlakyTest;
import android.provider.Settings;
import android.service.dreams.DreamManagerInternal;
import android.test.mock.MockContentResolver;
@@ -158,6 +157,7 @@
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
+ FakeSettingsProvider.clearSettingsProvider();
mPowerSaveState = new PowerSaveState.Builder()
.setBatterySaverEnabled(BATTERY_SAVER_ENABLED)
@@ -263,6 +263,7 @@
LocalServices.removeServiceForTest(DisplayManagerInternal.class);
LocalServices.removeServiceForTest(BatteryManagerInternal.class);
LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+ FakeSettingsProvider.clearSettingsProvider();
}
/**
@@ -690,7 +691,10 @@
@Test
public void testInattentiveSleep_hideWarningIfStayOnIsEnabledAndPluggedIn() throws Exception {
- setAttentiveTimeout(15000);
+ setMinimumScreenOffTimeoutConfig(5);
+ setAttentiveWarningDuration(120);
+ setAttentiveTimeout(100);
+
Settings.Global.putInt(mContextSpy.getContentResolver(),
Settings.Global.STAY_ON_WHILE_PLUGGED_IN, BatteryManager.BATTERY_PLUGGED_AC);
@@ -706,10 +710,10 @@
}
@Test
- public void testInattentive_userActivityDismissesWarning() throws Exception {
+ public void testInattentiveSleep_userActivityDismissesWarning() throws Exception {
setMinimumScreenOffTimeoutConfig(5);
- setAttentiveWarningDuration(30);
- setAttentiveTimeout(100);
+ setAttentiveWarningDuration(1900);
+ setAttentiveTimeout(2000);
createService();
startSystem();
@@ -718,7 +722,7 @@
PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0);
verify(mInattentiveSleepWarningControllerMock, never()).show();
- SystemClock.sleep(70);
+ SystemClock.sleep(150);
verify(mInattentiveSleepWarningControllerMock, times(1)).show();
verify(mInattentiveSleepWarningControllerMock, never()).dismiss(anyBoolean());
when(mInattentiveSleepWarningControllerMock.isShown()).thenReturn(true);
@@ -731,16 +735,18 @@
@Test
public void testInattentiveSleep_warningHiddenAfterWakingUp() throws Exception {
setMinimumScreenOffTimeoutConfig(5);
- setAttentiveWarningDuration(20);
- setAttentiveTimeout(30);
+ setAttentiveWarningDuration(70);
+ setAttentiveTimeout(100);
createService();
startSystem();
- SystemClock.sleep(10);
+ SystemClock.sleep(50);
verify(mInattentiveSleepWarningControllerMock, atLeastOnce()).show();
when(mInattentiveSleepWarningControllerMock.isShown()).thenReturn(true);
- SystemClock.sleep(30);
+ SystemClock.sleep(70);
+ assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
forceAwake();
+ assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_AWAKE);
verify(mInattentiveSleepWarningControllerMock, atLeastOnce()).dismiss(false);
}
@@ -762,7 +768,6 @@
assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
}
- @FlakyTest
@Test
public void testInattentiveSleep_goesToSleepWithWakeLock() throws Exception {
final String pkg = mContextSpy.getOpPackageName();
@@ -770,7 +775,7 @@
final String tag = "sleep_testWithWakeLock";
setMinimumScreenOffTimeoutConfig(5);
- setAttentiveTimeout(10);
+ setAttentiveTimeout(30);
createService();
startSystem();
@@ -778,7 +783,7 @@
PowerManager.SCREEN_BRIGHT_WAKE_LOCK, tag, pkg,
null /* workSource */, null /* historyTag */);
- SystemClock.sleep(11);
+ SystemClock.sleep(60);
assertThat(mService.getWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP);
}
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
index f070bff..327cfc7 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
@@ -1208,6 +1208,81 @@
STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController, PACKAGE_1));
}
+ @Test
+ public void testAppUpdateOnRestrictedBucketStatus() {
+ // Updates shouldn't change bucket if the app timed out.
+ // Way past all timeouts. App times out into RESTRICTED bucket.
+ reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1);
+ mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD * 4;
+ mController.checkIdleStates(USER_ID);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+
+ mController.maybeUnrestrictBuggyApp(PACKAGE_1, USER_ID);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+ mController.maybeUnrestrictBuggyApp(PACKAGE_1, USER_ID2);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+ mController.maybeUnrestrictBuggyApp("com.random.package", USER_ID);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+
+ // Updates shouldn't change bucket if the app was forced by the system for a non-buggy
+ // reason.
+ reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1);
+ mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD * 4;
+ mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RESTRICTED,
+ REASON_MAIN_FORCED_BY_SYSTEM
+ | REASON_SUB_FORCED_SYSTEM_FLAG_BACKGROUND_RESOURCE_USAGE);
+
+ mController.maybeUnrestrictBuggyApp(PACKAGE_1, USER_ID);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+ mController.maybeUnrestrictBuggyApp(PACKAGE_1, USER_ID2);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+ mController.maybeUnrestrictBuggyApp("com.random.package", USER_ID);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+
+ // Updates should change bucket if the app was forced by the system for a buggy reason.
+ reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1);
+ mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD * 4;
+ mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RESTRICTED,
+ REASON_MAIN_FORCED_BY_SYSTEM | REASON_SUB_FORCED_SYSTEM_FLAG_BUGGY);
+
+ mController.maybeUnrestrictBuggyApp(PACKAGE_1, USER_ID2);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+ mController.maybeUnrestrictBuggyApp("com.random.package", USER_ID);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+ mController.maybeUnrestrictBuggyApp(PACKAGE_1, USER_ID);
+ assertNotEquals(STANDBY_BUCKET_RESTRICTED, getStandbyBucket(mController, PACKAGE_1));
+
+ // Updates shouldn't change bucket if the app was forced by the system for more than just
+ // a buggy reason.
+ reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1);
+ mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD * 4;
+ mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RESTRICTED,
+ REASON_MAIN_FORCED_BY_SYSTEM | REASON_SUB_FORCED_SYSTEM_FLAG_ABUSE
+ | REASON_SUB_FORCED_SYSTEM_FLAG_BUGGY);
+
+ mController.maybeUnrestrictBuggyApp(PACKAGE_1, USER_ID);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+ assertEquals(REASON_MAIN_FORCED_BY_SYSTEM | REASON_SUB_FORCED_SYSTEM_FLAG_ABUSE,
+ getStandbyBucketReason(PACKAGE_1));
+ mController.maybeUnrestrictBuggyApp(PACKAGE_1, USER_ID2);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+ mController.maybeUnrestrictBuggyApp("com.random.package", USER_ID);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+
+ // Updates shouldn't change bucket if the app was forced by the user.
+ reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1);
+ mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD * 4;
+ mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RESTRICTED,
+ REASON_MAIN_FORCED_BY_USER);
+
+ mController.maybeUnrestrictBuggyApp(PACKAGE_1, USER_ID);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+ mController.maybeUnrestrictBuggyApp(PACKAGE_1, USER_ID2);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+ mController.maybeUnrestrictBuggyApp("com.random.package", USER_ID);
+ assertBucket(STANDBY_BUCKET_RESTRICTED);
+ }
+
private String getAdminAppsStr(int userId) {
return getAdminAppsStr(userId, mController.getActiveAdminAppsForTest(userId));
}
diff --git a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
index 93ca34a..69ef499 100644
--- a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java
@@ -31,6 +31,7 @@
import android.os.PowerManagerInternal;
import android.os.PowerSaveState;
import android.os.RemoteException;
+import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import com.android.server.twilight.TwilightManager;
@@ -54,6 +55,7 @@
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
@@ -113,6 +115,7 @@
when(mContext.getResources()).thenReturn(mResources);
when(mContext.getContentResolver()).thenReturn(mContentResolver);
when(mPowerManager.isInteractive()).thenReturn(true);
+ when(mPowerManager.newWakeLock(anyInt(), anyString())).thenReturn(mWakeLock);
when(mTwilightManager.getLastTwilightState()).thenReturn(mTwilightState);
when(mTwilightState.isNight()).thenReturn(true);
when(mContext.registerReceiver(notNull(), notNull())).then(inv -> {
@@ -135,23 +138,33 @@
mCustomListener = () -> {};
return null;
}).when(mAlarmManager).cancel(eq(mCustomListener));
-
- mUiManagerService = new UiModeManagerService(mContext,
- mWindowManager, mAlarmManager, mPowerManager,
- mWakeLock, mTwilightManager, mLocalPowerManager, true);
+ when(mContext.getSystemService(eq(Context.POWER_SERVICE)))
+ .thenReturn(mPowerManager);
+ when(mContext.getSystemService(eq(Context.ALARM_SERVICE)))
+ .thenReturn(mAlarmManager);
+ addLocalService(WindowManagerInternal.class, mWindowManager);
+ addLocalService(PowerManagerInternal.class, mLocalPowerManager);
+ addLocalService(TwilightManager.class, mTwilightManager);
+
+ mUiManagerService = new UiModeManagerService(mContext, true);
try {
mUiManagerService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
} catch (SecurityException e) {/* ignore for permission denial */}
mService = mUiManagerService.getService();
}
+ private <T> void addLocalService(Class<T> clazz, T service) {
+ LocalServices.removeServiceForTest(clazz);
+ LocalServices.addService(clazz, service);
+ }
+
@Test
public void setAutoMode_screenOffRegistered() throws RemoteException {
try {
mService.setNightMode(MODE_NIGHT_NO);
} catch (SecurityException e) { /* we should ignore this update config exception*/ }
mService.setNightMode(MODE_NIGHT_AUTO);
- verify(mContext).registerReceiver(any(BroadcastReceiver.class), any());
+ verify(mContext, atLeastOnce()).registerReceiver(any(BroadcastReceiver.class), any());
}
@Test
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BubbleCheckerTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BubbleCheckerTest.java
index 9636342..d7fc97c 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/BubbleCheckerTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/BubbleCheckerTest.java
@@ -104,7 +104,7 @@
void setUpIntentBubble() {
when(mPendingIntent.getIntent()).thenReturn(mIntent);
- when(mBubbleMetadata.getBubbleIntent()).thenReturn(mPendingIntent);
+ when(mBubbleMetadata.getIntent()).thenReturn(mPendingIntent);
when(mBubbleMetadata.getShortcutId()).thenReturn(null);
}
@@ -112,7 +112,7 @@
when(mBubbleMetadata.getShortcutId()).thenReturn(SHORTCUT_ID);
when(mShortcutHelper.hasValidShortcutInfo(SHORTCUT_ID, PKG, mUserHandle))
.thenReturn(isValid);
- when(mBubbleMetadata.getBubbleIntent()).thenReturn(null);
+ when(mBubbleMetadata.getIntent()).thenReturn(null);
}
void setUpBubblesEnabled(boolean feature, boolean app, boolean channel) {
@@ -160,7 +160,7 @@
@Test
public void testCanBubble_false_noIntentNoShortcut() {
setUpBubblesEnabled(true /* feature */, true /* app */, true /* channel */);
- when(mBubbleMetadata.getBubbleIntent()).thenReturn(null);
+ when(mBubbleMetadata.getIntent()).thenReturn(null);
when(mBubbleMetadata.getShortcutId()).thenReturn(null);
assertFalse(mBubbleChecker.canBubble(mNr, PKG, USER_ID));
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 2b8ce78..9db7d5e 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -678,9 +678,8 @@
private Notification.BubbleMetadata.Builder getBubbleMetadataBuilder() {
PendingIntent pi = PendingIntent.getActivity(mContext, 0, new Intent(), 0);
- return new Notification.BubbleMetadata.Builder()
- .createIntentBubble(pi,
- Icon.createWithResource(mContext, android.R.drawable.sym_def_app_icon));
+ return new Notification.BubbleMetadata.Builder(pi,
+ Icon.createWithResource(mContext, android.R.drawable.sym_def_app_icon));
}
private Notification.Builder getMessageStyleNotifBuilder(boolean addBubbleMetadata,
@@ -6175,7 +6174,7 @@
// Messaging notification with shortcut info
Notification.BubbleMetadata metadata =
- getBubbleMetadataBuilder().createShortcutBubble("someshortcutId").build();
+ new Notification.BubbleMetadata.Builder("someshortcutId").build();
Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */,
null /* groupKey */, false /* isSummary */);
nb.setBubbleMetadata(metadata);
@@ -6232,8 +6231,8 @@
ArgumentCaptor.forClass(LauncherApps.Callback.class);
// Messaging notification with shortcut info
- Notification.BubbleMetadata metadata =
- getBubbleMetadataBuilder().createShortcutBubble("someshortcutId").build();
+ Notification.BubbleMetadata metadata = new Notification.BubbleMetadata.Builder(
+ "someshortcutId").build();
Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */,
null /* groupKey */, false /* isSummary */);
nb.setBubbleMetadata(metadata);
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index b3c6b22..218c816 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -1016,6 +1016,15 @@
assertTrue(mDisplayContent.getDisplayRotation().shouldRotateSeamlessly(
ROTATION_0 /* oldRotation */, ROTATION_90 /* newRotation */,
false /* forceUpdate */));
+
+ final Rect outFrame = new Rect();
+ final Rect outInsets = new Rect();
+ final Rect outStableInsets = new Rect();
+ final Rect outSurfaceInsets = new Rect();
+ mAppWindow.getAnimationFrames(outFrame, outInsets, outStableInsets, outSurfaceInsets);
+ // The animation frames should not be rotated because display hasn't rotated.
+ assertEquals(mDisplayContent.getBounds(), outFrame);
+
// The display should keep current orientation and the rotated configuration should apply
// to the activity.
assertEquals(config.orientation, mDisplayContent.getConfiguration().orientation);
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 0eba07b..18d5819 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -41,7 +41,6 @@
import android.content.res.Resources;
import android.database.ContentObserver;
import android.hardware.soundtrigger.IRecognitionStatusCallback;
-import android.hardware.soundtrigger.KeyphraseEnrollmentInfo;
import android.hardware.soundtrigger.KeyphraseMetadata;
import android.hardware.soundtrigger.ModelParams;
import android.hardware.soundtrigger.SoundTrigger;
@@ -100,7 +99,7 @@
* SystemService that publishes an IVoiceInteractionManagerService.
*/
public class VoiceInteractionManagerService extends SystemService {
- static final String TAG = "VoiceInteractionManagerService";
+ static final String TAG = "VoiceInteractionManager";
static final boolean DEBUG = false;
final Context mContext;
@@ -172,17 +171,17 @@
}
@Override
- public void onStartUser(@NonNull UserInfo userInfo) {
- if (DEBUG_USER) Slog.d(TAG, "onStartUser(" + userInfo + ")");
+ public void onUserStarting(@NonNull TargetUser user) {
+ if (DEBUG_USER) Slog.d(TAG, "onUserStarting(" + user + ")");
- mServiceStub.initForUser(userInfo.id);
+ mServiceStub.initForUser(user.getUserIdentifier());
}
@Override
- public void onUnlockUser(@NonNull UserInfo userInfo) {
- if (DEBUG_USER) Slog.d(TAG, "onUnlockUser(" + userInfo + ")");
+ public void onUserUnlocking(@NonNull TargetUser user) {
+ if (DEBUG_USER) Slog.d(TAG, "onUserUnlocking(" + user + ")");
- mServiceStub.initForUser(userInfo.id);
+ mServiceStub.initForUser(user.getUserIdentifier());
mServiceStub.switchImplementationIfNeeded(false);
}
@@ -224,7 +223,6 @@
class VoiceInteractionManagerServiceStub extends IVoiceInteractionManagerService.Stub {
VoiceInteractionManagerServiceImpl mImpl;
- KeyphraseEnrollmentInfo mEnrollmentApplicationInfo;
private boolean mSafeMode;
private int mCurUser;
@@ -449,15 +447,6 @@
}
}
- private void getOrCreateEnrollmentApplicationInfo() {
- synchronized (this) {
- if (mEnrollmentApplicationInfo == null) {
- mEnrollmentApplicationInfo = new KeyphraseEnrollmentInfo(
- mContext.getPackageManager());
- }
- }
- }
-
private void setCurrentUserLocked(@UserIdInt int userHandle) {
mCurUser = userHandle;
final UserInfo userInfo = mUserManagerInternal.getUserInfo(mCurUser);
@@ -1391,11 +1380,6 @@
pw.println(" mCurUserUnlocked: " + mCurUserUnlocked);
pw.println(" mCurUserSupported: " + mCurUserSupported);
dumpSupportedUsers(pw, " ");
- if (mEnrollmentApplicationInfo == null) {
- pw.println(" (No enrollment application info)");
- } else {
- pw.println(" " + mEnrollmentApplicationInfo.toString());
- }
mDbHelper.dump(pw);
if (mImpl == null) {
pw.println(" (No active implementation)");
@@ -1425,9 +1409,13 @@
}
}
+ private boolean isCallerHoldingPermission(String permission) {
+ return mContext.checkCallingOrSelfPermission(permission)
+ == PackageManager.PERMISSION_GRANTED;
+ }
+
private void enforceCallingPermission(String permission) {
- if (mContext.checkCallingOrSelfPermission(permission)
- != PackageManager.PERMISSION_GRANTED) {
+ if (!isCallerHoldingPermission(permission)) {
throw new SecurityException("Caller does not hold the permission " + permission);
}
}
@@ -1440,12 +1428,12 @@
}
private void enforceCallerAllowedToEnrollVoiceModel() {
- enforceCallingPermission(Manifest.permission.MANAGE_VOICE_KEYPHRASES);
- if (!isCallerCurrentVoiceInteractionService()
- && !isCallerTrustedEnrollmentApplication()) {
- throw new SecurityException("Caller is required to be the current voice interaction"
- + " service or a system enrollment application to enroll voice models");
+ if (isCallerHoldingPermission(Manifest.permission.KEYPHRASE_ENROLLMENT_APPLICATION)) {
+ return;
}
+
+ enforceCallingPermission(Manifest.permission.MANAGE_VOICE_KEYPHRASES);
+ enforceIsCurrentVoiceInteractionService();
}
private boolean isCallerCurrentVoiceInteractionService() {
@@ -1453,12 +1441,6 @@
&& mImpl.mInfo.getServiceInfo().applicationInfo.uid == Binder.getCallingUid();
}
- private boolean isCallerTrustedEnrollmentApplication() {
- getOrCreateEnrollmentApplicationInfo();
- return mEnrollmentApplicationInfo.isUidSupportedEnrollmentApplication(
- Binder.getCallingUid());
- }
-
private void setImplLocked(VoiceInteractionManagerServiceImpl impl) {
mImpl = impl;
mAtmInternal.notifyActiveVoiceInteractionServiceChanged(
diff --git a/startop/view_compiler/apk_layout_compiler.cc b/startop/view_compiler/apk_layout_compiler.cc
index 09cdbd5..eaa3e04 100644
--- a/startop/view_compiler/apk_layout_compiler.cc
+++ b/startop/view_compiler/apk_layout_compiler.cc
@@ -100,10 +100,12 @@
dex_file.MakeClass(StringPrintf("%s.CompiledView", package_name.c_str()))};
std::vector<dex::MethodBuilder> methods;
- assets->ForEachFile("res/", [&](const android::StringPiece& s, android::FileType) {
+ assets->GetAssetsProvider()->ForEachFile("res/", [&](const android::StringPiece& s,
+ android::FileType) {
if (s == "layout") {
auto path = StringPrintf("res/%s/", s.to_string().c_str());
- assets->ForEachFile(path, [&](const android::StringPiece& layout_file, android::FileType) {
+ assets->GetAssetsProvider()->ForEachFile(path, [&](const android::StringPiece& layout_file,
+ android::FileType) {
auto layout_path = StringPrintf("%s%s", path.c_str(), layout_file.to_string().c_str());
android::ApkAssetsCookie cookie = android::kInvalidCookie;
auto asset = resources.OpenNonAsset(layout_path, android::Asset::ACCESS_RANDOM, &cookie);
@@ -166,8 +168,7 @@
void CompileApkLayoutsFd(android::base::unique_fd fd, CompilationTarget target,
std::ostream& target_out) {
constexpr const char* friendly_name{"viewcompiler assets"};
- auto assets = android::ApkAssets::LoadFromFd(
- std::move(fd), friendly_name, /*system=*/false, /*force_shared_lib=*/false);
+ auto assets = android::ApkAssets::LoadFromFd(std::move(fd), friendly_name);
CompileApkAssetsLayouts(assets, target, target_out);
}
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index 1792256..e3baa0a 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -848,7 +848,6 @@
*
* @hide
*/
- @SystemApi
public static final int CALL_SOURCE_EMERGENCY_SHORTCUT = 2;
/**
@@ -856,7 +855,6 @@
*
* @hide
*/
- @SystemApi
public static final int CALL_SOURCE_EMERGENCY_DIALPAD = 1;
/**
@@ -864,7 +862,6 @@
*
* @hide
*/
- @SystemApi
public static final int CALL_SOURCE_UNSPECIFIED = 0;
/**
diff --git a/telephony/api/system-current.txt b/telephony/api/system-current.txt
index b3e350a..afb75bb 100644
--- a/telephony/api/system-current.txt
+++ b/telephony/api/system-current.txt
@@ -290,30 +290,6 @@
field public static final String MBMS_STREAMING_SERVICE_ACTION = "android.telephony.action.EmbmsStreaming";
}
- public final class ModemActivityInfo implements android.os.Parcelable {
- ctor public ModemActivityInfo(long, int, int, @NonNull int[], int);
- method public int describeContents();
- method public int getIdleTimeMillis();
- method public int getReceiveTimeMillis();
- method public int getSleepTimeMillis();
- method public long getTimestamp();
- method @NonNull public java.util.List<android.telephony.ModemActivityInfo.TransmitPower> getTransmitPowerInfo();
- method public boolean isValid();
- method public void writeToParcel(android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ModemActivityInfo> CREATOR;
- field public static final int TX_POWER_LEVELS = 5; // 0x5
- field public static final int TX_POWER_LEVEL_0 = 0; // 0x0
- field public static final int TX_POWER_LEVEL_1 = 1; // 0x1
- field public static final int TX_POWER_LEVEL_2 = 2; // 0x2
- field public static final int TX_POWER_LEVEL_3 = 3; // 0x3
- field public static final int TX_POWER_LEVEL_4 = 4; // 0x4
- }
-
- public class ModemActivityInfo.TransmitPower {
- method @NonNull public android.util.Range<java.lang.Integer> getPowerRangeInDbm();
- method public int getTimeInMillis();
- }
-
public final class NetworkRegistrationInfo implements android.os.Parcelable {
method @Nullable public android.telephony.DataSpecificRegistrationInfo getDataSpecificInfo();
method public int getRegistrationState();
@@ -521,21 +497,15 @@
}
public class ServiceState implements android.os.Parcelable {
- method public void fillInNotifierBundle(@NonNull android.os.Bundle);
method @Nullable public android.telephony.NetworkRegistrationInfo getNetworkRegistrationInfo(int, int);
method @NonNull public java.util.List<android.telephony.NetworkRegistrationInfo> getNetworkRegistrationInfoListForDomain(int);
method @NonNull public java.util.List<android.telephony.NetworkRegistrationInfo> getNetworkRegistrationInfoListForTransportType(int);
- method @NonNull public static android.telephony.ServiceState newFromBundle(@NonNull android.os.Bundle);
field public static final int ROAMING_TYPE_DOMESTIC = 2; // 0x2
field public static final int ROAMING_TYPE_INTERNATIONAL = 3; // 0x3
field public static final int ROAMING_TYPE_NOT_ROAMING = 0; // 0x0
field public static final int ROAMING_TYPE_UNKNOWN = 1; // 0x1
}
- public class SignalStrength implements android.os.Parcelable {
- ctor public SignalStrength(@NonNull android.telephony.SignalStrength);
- }
-
public final class SmsCbCmasInfo implements android.os.Parcelable {
ctor public SmsCbCmasInfo(int, int, int, int, int, int);
method public int describeContents();
@@ -660,11 +630,8 @@
}
public final class SmsManager {
- method @RequiresPermission(android.Manifest.permission.ACCESS_MESSAGES_ON_ICC) public boolean copyMessageToIcc(@Nullable byte[], @NonNull byte[], int);
- method @RequiresPermission(android.Manifest.permission.ACCESS_MESSAGES_ON_ICC) public boolean deleteMessageFromIcc(int);
method public boolean disableCellBroadcastRange(int, int, int);
method public boolean enableCellBroadcastRange(int, int, int);
- method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_MESSAGES_ON_ICC) public java.util.List<android.telephony.SmsMessage> getMessagesFromIcc();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getPremiumSmsConsent(@NonNull String);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSmsCapacityOnIcc();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void sendMultipartTextMessageWithoutPersisting(String, String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>);
@@ -720,11 +687,6 @@
field @NonNull public static final android.net.Uri WFC_ROAMING_MODE_CONTENT_URI;
}
- public class TelephonyFrameworkInitializer {
- method public static void registerServiceWrappers();
- method public static void setTelephonyServiceManager(@NonNull android.os.TelephonyServiceManager);
- }
-
public final class TelephonyHistogram implements android.os.Parcelable {
ctor public TelephonyHistogram(int, int, int);
ctor public TelephonyHistogram(android.telephony.TelephonyHistogram);
@@ -809,8 +771,8 @@
method public boolean isDataConnectivityPossible();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isDataEnabledForApn(int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isEmergencyAssistanceEnabled();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean isIccLockEnabled();
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isIdle();
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isInEmergencySmsMode();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isLteCdmaEvdoGsmWcdmaEnabled();
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isOffhook();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isOpportunisticNetworkEnabled();
@@ -826,7 +788,6 @@
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean rebootRadio();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void reportDefaultNetworkStatus(boolean);
method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.MODIFY_PHONE_STATE}) public void requestCellInfoUpdate(@NonNull android.os.WorkSource, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback);
- method public void requestModemActivityInfo(@NonNull android.os.ResultReceiver);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void requestNumberVerification(@NonNull android.telephony.PhoneNumberRange, long, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.NumberVerificationCallback);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void resetAllCarrierActions();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void resetCarrierKeysForImsiEncryption();
@@ -863,11 +824,6 @@
method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void updateOtaEmergencyNumberDbFilePath(@NonNull android.os.ParcelFileDescriptor);
method public void updateServiceLocation();
field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final String ACTION_ANOMALY_REPORTED = "android.telephony.action.ANOMALY_REPORTED";
- field public static final String ACTION_CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE = "com.android.internal.telephony.CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE";
- field public static final String ACTION_CARRIER_SIGNAL_PCO_VALUE = "com.android.internal.telephony.CARRIER_SIGNAL_PCO_VALUE";
- field public static final String ACTION_CARRIER_SIGNAL_REDIRECTED = "com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED";
- field public static final String ACTION_CARRIER_SIGNAL_REQUEST_NETWORK_FAILED = "com.android.internal.telephony.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED";
- field public static final String ACTION_CARRIER_SIGNAL_RESET = "com.android.internal.telephony.CARRIER_SIGNAL_RESET";
field public static final String ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED";
field public static final String ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED = "android.intent.action.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED";
field public static final String ACTION_EMERGENCY_ASSISTANCE = "android.telephony.action.EMERGENCY_ASSISTANCE";
@@ -884,34 +840,14 @@
field public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; // 0xffffffff
field public static final String EXTRA_ANOMALY_DESCRIPTION = "android.telephony.extra.ANOMALY_DESCRIPTION";
field public static final String EXTRA_ANOMALY_ID = "android.telephony.extra.ANOMALY_ID";
- field @Deprecated public static final String EXTRA_APN_PROTOCOL = "apnProto";
- field public static final String EXTRA_APN_PROTOCOL_INT = "apnProtoInt";
- field @Deprecated public static final String EXTRA_APN_TYPE = "apnType";
- field public static final String EXTRA_APN_TYPE_INT = "apnTypeInt";
- field public static final String EXTRA_DEFAULT_NETWORK_AVAILABLE = "defaultNetworkAvailable";
- field public static final String EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE = "android.telephony.extra.DEFAULT_SUBSCRIPTION_SELECT_TYPE";
- field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_ALL = 4; // 0x4
- field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA = 1; // 0x1
- field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_NONE = 0; // 0x0
- field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_SMS = 3; // 0x3
- field public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_VOICE = 2; // 0x2
- field public static final String EXTRA_ERROR_CODE = "errorCode";
- field public static final String EXTRA_PCO_ID = "pcoId";
- field public static final String EXTRA_PCO_VALUE = "pcoValue";
field public static final String EXTRA_PHONE_IN_ECM_STATE = "android.telephony.extra.PHONE_IN_ECM_STATE";
field public static final String EXTRA_PHONE_IN_EMERGENCY_CALL = "android.telephony.extra.PHONE_IN_EMERGENCY_CALL";
- field public static final String EXTRA_REDIRECTION_URL = "redirectionUrl";
- field public static final String EXTRA_SIM_COMBINATION_NAMES = "android.telephony.extra.SIM_COMBINATION_NAMES";
- field public static final String EXTRA_SIM_COMBINATION_WARNING_TYPE = "android.telephony.extra.SIM_COMBINATION_WARNING_TYPE";
- field public static final int EXTRA_SIM_COMBINATION_WARNING_TYPE_DUAL_CDMA = 1; // 0x1
- field public static final int EXTRA_SIM_COMBINATION_WARNING_TYPE_NONE = 0; // 0x0
field public static final String EXTRA_SIM_STATE = "android.telephony.extra.SIM_STATE";
field public static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL";
field public static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING";
field public static final int INVALID_EMERGENCY_NUMBER_DB_VERSION = -1; // 0xffffffff
field public static final int KEY_TYPE_EPDG = 1; // 0x1
field public static final int KEY_TYPE_WLAN = 2; // 0x2
- field public static final String MODEM_ACTIVITY_RESULT_KEY = "controller_activity";
field public static final long NETWORK_TYPE_BITMASK_1xRTT = 64L; // 0x40L
field public static final long NETWORK_TYPE_BITMASK_CDMA = 8L; // 0x8L
field public static final long NETWORK_TYPE_BITMASK_EDGE = 2L; // 0x2L
diff --git a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
index 68b1768..0b33174 100644
--- a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
+++ b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
@@ -20,7 +20,6 @@
import android.Manifest;
import android.annotation.Nullable;
import android.app.AppOpsManager;
-import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -28,6 +27,7 @@
import android.os.Build;
import android.os.Process;
import android.os.UserHandle;
+import android.permission.PermissionManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -303,14 +303,10 @@
String message, boolean allowCarrierPrivilegeOnAnySub) {
int uid = Binder.getCallingUid();
int pid = Binder.getCallingPid();
- // Allow system and root access to the device identifiers.
- final int appId = UserHandle.getAppId(uid);
- if (appId == Process.SYSTEM_UID || appId == Process.ROOT_UID) {
- return true;
- }
- // Allow access to packages that have the READ_PRIVILEGED_PHONE_STATE permission.
- if (context.checkPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, pid,
- uid) == PackageManager.PERMISSION_GRANTED) {
+ PermissionManager permissionManager = (PermissionManager) context.getSystemService(
+ Context.PERMISSION_SERVICE);
+ if (permissionManager.checkDeviceIdentifierAccess(callingPackage, message, callingFeatureId,
+ pid, uid) == PackageManager.PERMISSION_GRANTED) {
return true;
}
@@ -323,30 +319,6 @@
return true;
}
- // if the calling package is not null then perform the DevicePolicyManager device /
- // profile owner and Appop checks.
- if (callingPackage != null) {
- // Allow access to an app that has been granted the READ_DEVICE_IDENTIFIERS app op.
- long token = Binder.clearCallingIdentity();
- AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(
- Context.APP_OPS_SERVICE);
- try {
- if (appOpsManager.noteOpNoThrow(AppOpsManager.OPSTR_READ_DEVICE_IDENTIFIERS, uid,
- callingPackage, callingFeatureId, null) == AppOpsManager.MODE_ALLOWED) {
- return true;
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- // Allow access to a device / profile owner app.
- DevicePolicyManager devicePolicyManager =
- (DevicePolicyManager) context.getSystemService(
- Context.DEVICE_POLICY_SERVICE);
- if (devicePolicyManager != null && devicePolicyManager.hasDeviceIdentifierAccess(
- callingPackage, pid, uid)) {
- return true;
- }
- }
return reportAccessDeniedToReadIdentifiers(context, subId, pid, uid, callingPackage,
message);
}
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index e2112a59..78e5f2d 100755
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -3007,7 +3007,7 @@
* Controls time in milliseconds until DcTracker reevaluates 5G connection state.
* @hide
*/
- public static final String KEY_5G_WATCHDOG_TIME_MS_LONG = "5g_watchdog_time_long";
+ public static final String KEY_5G_WATCHDOG_TIME_MS_LONG = "5g_watchdog_time_ms_long";
/**
* Whether NR (non-standalone) should be unmetered for all frequencies.
diff --git a/telephony/java/android/telephony/CellSignalStrength.java b/telephony/java/android/telephony/CellSignalStrength.java
index cb8fdf0..2e7bde3 100644
--- a/telephony/java/android/telephony/CellSignalStrength.java
+++ b/telephony/java/android/telephony/CellSignalStrength.java
@@ -156,6 +156,8 @@
/**
* Returns the number of signal strength levels.
* @return Number of signal strength levels, enforced to be 5
+ *
+ * @hide
*/
public static final int getNumSignalStrengthLevels() {
return NUM_SIGNAL_STRENGTH_BINS;
diff --git a/telephony/java/android/telephony/ModemActivityInfo.java b/telephony/java/android/telephony/ModemActivityInfo.java
index e815aec..2b72ab7 100644
--- a/telephony/java/android/telephony/ModemActivityInfo.java
+++ b/telephony/java/android/telephony/ModemActivityInfo.java
@@ -18,7 +18,6 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
@@ -33,7 +32,6 @@
* Reports modem activity information.
* @hide
*/
-@SystemApi
public final class ModemActivityInfo implements Parcelable {
/**
* Tx(transmit) power level. see power index below
diff --git a/telephony/java/android/telephony/NetworkRegistrationInfo.java b/telephony/java/android/telephony/NetworkRegistrationInfo.java
index 4940cb2..93fbb00 100644
--- a/telephony/java/android/telephony/NetworkRegistrationInfo.java
+++ b/telephony/java/android/telephony/NetworkRegistrationInfo.java
@@ -690,7 +690,7 @@
*/
public void updateNrState() {
mNrState = NR_STATE_NONE;
- if (mDataSpecificInfo.isEnDcAvailable) {
+ if (mDataSpecificInfo != null && mDataSpecificInfo.isEnDcAvailable) {
if (!mDataSpecificInfo.isDcNrRestricted && mDataSpecificInfo.isNrAvailable) {
mNrState = NR_STATE_NOT_RESTRICTED;
} else {
diff --git a/telephony/java/android/telephony/PhoneCapability.java b/telephony/java/android/telephony/PhoneCapability.java
index 6571858..b785037 100644
--- a/telephony/java/android/telephony/PhoneCapability.java
+++ b/telephony/java/android/telephony/PhoneCapability.java
@@ -28,6 +28,8 @@
/**
* Define capability of a modem group. That is, the capabilities
* are shared between those modems defined by list of modem IDs.
+ *
+ * @hide
*/
public final class PhoneCapability implements Parcelable {
// Hardcoded default DSDS capability.
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index deba551..0e61efa 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -397,7 +397,6 @@
* @return newly created ServiceState
* @hide
*/
- @SystemApi
@NonNull
public static ServiceState newFromBundle(@NonNull Bundle m) {
ServiceState ret;
@@ -1316,7 +1315,6 @@
* @hide
*
*/
- @SystemApi
public void fillInNotifierBundle(@NonNull Bundle m) {
m.putParcelable(EXTRA_SERVICE_STATE, this);
// serviceState already consists of below entries.
diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java
index ad58c54..283e666 100644
--- a/telephony/java/android/telephony/SignalStrength.java
+++ b/telephony/java/android/telephony/SignalStrength.java
@@ -18,7 +18,6 @@
import android.annotation.ElapsedRealtimeLong;
import android.annotation.NonNull;
-import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
import android.os.Bundle;
@@ -284,7 +283,6 @@
*
* @hide
*/
- @SystemApi
public SignalStrength(@NonNull SignalStrength s) {
copyFrom(s);
}
diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java
index cc8cef3..c144746 100644
--- a/telephony/java/android/telephony/SmsManager.java
+++ b/telephony/java/android/telephony/SmsManager.java
@@ -424,7 +424,7 @@
String destinationAddress, String scAddress, String text,
PendingIntent sentIntent, PendingIntent deliveryIntent) {
sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent,
- true /* persistMessage*/, null, 0L /* messageId */);
+ true /* persistMessage*/, null, null, 0L /* messageId */);
}
@@ -443,7 +443,7 @@
@Nullable PendingIntent sentIntent, @Nullable PendingIntent deliveryIntent,
long messageId) {
sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent,
- true /* persistMessage*/, null, messageId);
+ true /* persistMessage*/, null, null, messageId);
}
/**
@@ -561,7 +561,7 @@
private void sendTextMessageInternal(String destinationAddress, String scAddress,
String text, PendingIntent sentIntent, PendingIntent deliveryIntent,
- boolean persistMessage, String packageName, long messageId) {
+ boolean persistMessage, String packageName, String attributionTag, long messageId) {
if (TextUtils.isEmpty(destinationAddress)) {
throw new IllegalArgumentException("Invalid destinationAddress");
}
@@ -586,7 +586,7 @@
public void onSuccess(int subId) {
ISms iSms = getISmsServiceOrThrow();
try {
- iSms.sendTextForSubscriber(subId, packageName,
+ iSms.sendTextForSubscriber(subId, packageName, attributionTag,
destinationAddress, scAddress, text, sentIntent, deliveryIntent,
persistMessage, messageId);
} catch (RemoteException e) {
@@ -606,7 +606,7 @@
// visible to the user.
ISms iSms = getISmsServiceOrThrow();
try {
- iSms.sendTextForSubscriber(getSubscriptionId(), packageName,
+ iSms.sendTextForSubscriber(getSubscriptionId(), packageName, attributionTag,
destinationAddress, scAddress, text, sentIntent, deliveryIntent,
persistMessage, messageId);
} catch (RemoteException e) {
@@ -653,7 +653,7 @@
String destinationAddress, String scAddress, String text,
PendingIntent sentIntent, PendingIntent deliveryIntent) {
sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent,
- false /* persistMessage */, null,
+ false /* persistMessage */, null, null,
0L /* messageId */);
}
@@ -937,7 +937,7 @@
String destinationAddress, String scAddress, ArrayList<String> parts,
ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) {
sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents,
- deliveryIntents, true /* persistMessage*/, null,
+ deliveryIntents, true /* persistMessage*/, null, null,
0L /* messageId */);
}
@@ -955,7 +955,7 @@
@NonNull List<String> parts, @Nullable List<PendingIntent> sentIntents,
@Nullable List<PendingIntent> deliveryIntents, long messageId) {
sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents,
- deliveryIntents, true /* persistMessage*/, null,
+ deliveryIntents, true /* persistMessage*/, null, null,
messageId);
}
@@ -979,15 +979,18 @@
public void sendMultipartTextMessage(
@NonNull String destinationAddress, @Nullable String scAddress,
@NonNull List<String> parts, @Nullable List<PendingIntent> sentIntents,
- @Nullable List<PendingIntent> deliveryIntents, @NonNull String packageName) {
+ @Nullable List<PendingIntent> deliveryIntents, @NonNull String packageName,
+ @Nullable String attributionTag) {
sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents,
- deliveryIntents, true /* persistMessage*/, packageName, 0L /* messageId */);
+ deliveryIntents, true /* persistMessage*/, packageName, attributionTag,
+ 0L /* messageId */);
}
private void sendMultipartTextMessageInternal(
String destinationAddress, String scAddress, List<String> parts,
List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents,
- boolean persistMessage, String packageName, long messageId) {
+ boolean persistMessage, String packageName, @Nullable String attributionTag,
+ long messageId) {
if (TextUtils.isEmpty(destinationAddress)) {
throw new IllegalArgumentException("Invalid destinationAddress");
}
@@ -1012,7 +1015,7 @@
public void onSuccess(int subId) {
try {
ISms iSms = getISmsServiceOrThrow();
- iSms.sendMultipartTextForSubscriber(subId, packageName,
+ iSms.sendMultipartTextForSubscriber(subId, packageName, attributionTag,
destinationAddress, scAddress, parts, sentIntents,
deliveryIntents, persistMessage, messageId);
} catch (RemoteException e) {
@@ -1034,8 +1037,8 @@
ISms iSms = getISmsServiceOrThrow();
if (iSms != null) {
iSms.sendMultipartTextForSubscriber(getSubscriptionId(), packageName,
- destinationAddress, scAddress, parts, sentIntents, deliveryIntents,
- persistMessage, messageId);
+ attributionTag, destinationAddress, scAddress, parts, sentIntents,
+ deliveryIntents, persistMessage, messageId);
}
} catch (RemoteException e) {
Log.e(TAG, "sendMultipartTextMessageInternal: Couldn't send SMS - "
@@ -1053,7 +1056,7 @@
deliveryIntent = deliveryIntents.get(0);
}
sendTextMessageInternal(destinationAddress, scAddress, parts.get(0),
- sentIntent, deliveryIntent, true, packageName, messageId);
+ sentIntent, deliveryIntent, true, packageName, attributionTag, messageId);
}
}
@@ -1083,7 +1086,7 @@
String destinationAddress, String scAddress, List<String> parts,
List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents) {
sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents,
- deliveryIntents, false /* persistMessage*/, null,
+ deliveryIntents, false /* persistMessage*/, null, null,
0L /* messageId */);
}
@@ -1246,7 +1249,7 @@
ISms iSms = getISmsServiceOrThrow();
if (iSms != null) {
iSms.sendMultipartTextForSubscriberWithOptions(subId,
- null, destinationAddress,
+ null, null, destinationAddress,
scAddress, parts, sentIntents, deliveryIntents,
persistMessage, finalPriority, expectMore, finalValidity);
}
@@ -1268,7 +1271,7 @@
ISms iSms = getISmsServiceOrThrow();
if (iSms != null) {
iSms.sendMultipartTextForSubscriberWithOptions(getSubscriptionId(),
- null, destinationAddress,
+ null, null, destinationAddress,
scAddress, parts, sentIntents, deliveryIntents,
persistMessage, finalPriority, expectMore, finalValidity);
}
@@ -1399,9 +1402,8 @@
public void onSuccess(int subId) {
try {
ISms iSms = getISmsServiceOrThrow();
- iSms.sendDataForSubscriber(subId, null,
- destinationAddress, scAddress, destinationPort & 0xFFFF, data,
- sentIntent, deliveryIntent);
+ iSms.sendDataForSubscriber(subId, null, null, destinationAddress, scAddress,
+ destinationPort & 0xFFFF, data, sentIntent, deliveryIntent);
} catch (RemoteException e) {
Log.e(TAG, "sendDataMessage: Couldn't send SMS - Exception: " + e.getMessage());
notifySmsError(sentIntent, RESULT_REMOTE_EXCEPTION);
@@ -1553,7 +1555,7 @@
// it here because we do not have access to the activity context that is performing this
// operation.
// Requires that the calling process has the SEND_SMS permission.
- getITelephony().enqueueSmsPickResult(null,
+ getITelephony().enqueueSmsPickResult(null, null,
new IIntegerConsumer.Stub() {
@Override
public void accept(int subId) {
@@ -1672,7 +1674,6 @@
* @throws IllegalArgumentException if pdu is null.
* @hide
*/
- @SystemApi
@RequiresPermission(Manifest.permission.ACCESS_MESSAGES_ON_ICC)
public boolean copyMessageToIcc(
@Nullable byte[] smsc, @NonNull byte[] pdu, @StatusOnIcc int status) {
@@ -1717,7 +1718,6 @@
*
* {@hide}
*/
- @SystemApi
@RequiresPermission(Manifest.permission.ACCESS_MESSAGES_ON_ICC)
public boolean deleteMessageFromIcc(int messageIndex) {
boolean success = false;
@@ -1798,7 +1798,6 @@
*
* {@hide}
*/
- @SystemApi
@RequiresPermission(Manifest.permission.ACCESS_MESSAGES_ON_ICC)
public @NonNull List<SmsMessage> getMessagesFromIcc() {
return getAllMessagesFromIcc();
diff --git a/telephony/java/android/telephony/SmsMessage.java b/telephony/java/android/telephony/SmsMessage.java
index bc5cc96..e537f66 100644
--- a/telephony/java/android/telephony/SmsMessage.java
+++ b/telephony/java/android/telephony/SmsMessage.java
@@ -1198,6 +1198,7 @@
/**
* Returns the recipient address(receiver) of this SMS message in String form or null if
* unavailable.
+ * {@hide}
*/
@Nullable
public String getRecipientAddress() {
diff --git a/telephony/java/android/telephony/TelephonyFrameworkInitializer.java b/telephony/java/android/telephony/TelephonyFrameworkInitializer.java
index 0d2a8bc..c9540fb 100644
--- a/telephony/java/android/telephony/TelephonyFrameworkInitializer.java
+++ b/telephony/java/android/telephony/TelephonyFrameworkInitializer.java
@@ -17,7 +17,6 @@
package android.telephony;
import android.annotation.NonNull;
-import android.annotation.SystemApi;
import android.app.SystemServiceRegistry;
import android.content.Context;
import android.os.TelephonyServiceManager;
@@ -33,7 +32,6 @@
*
* @hide
*/
-@SystemApi
public class TelephonyFrameworkInitializer {
private TelephonyFrameworkInitializer() {
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 441a8ee..5a7b852 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -165,7 +165,6 @@
* into the ResultReceiver Bundle.
* @hide
*/
- @SystemApi
public static final String MODEM_ACTIVITY_RESULT_KEY = "controller_activity";
/**
@@ -1438,7 +1437,6 @@
*
* @hide
*/
- @SystemApi
public static final String EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE =
"android.telephony.extra.DEFAULT_SUBSCRIPTION_SELECT_TYPE";
@@ -1458,7 +1456,6 @@
* to indicate there's no need to re-select any default subscription.
* @hide
*/
- @SystemApi
public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_NONE = 0;
/**
@@ -1466,7 +1463,6 @@
* to indicate there's a need to select default data subscription.
* @hide
*/
- @SystemApi
public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DATA = 1;
/**
@@ -1474,7 +1470,6 @@
* to indicate there's a need to select default voice call subscription.
* @hide
*/
- @SystemApi
public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_VOICE = 2;
/**
@@ -1482,7 +1477,6 @@
* to indicate there's a need to select default sms subscription.
* @hide
*/
- @SystemApi
public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_SMS = 3;
/**
@@ -1492,7 +1486,6 @@
* which subscription should be the default subscription.
* @hide
*/
- @SystemApi
public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_ALL = 4;
/**
@@ -1502,7 +1495,6 @@
*
* @hide
*/
- @SystemApi
public static final String EXTRA_SIM_COMBINATION_WARNING_TYPE =
"android.telephony.extra.SIM_COMBINATION_WARNING_TYPE";
@@ -1519,7 +1511,6 @@
* to indicate there's no SIM combination warning.
* @hide
*/
- @SystemApi
public static final int EXTRA_SIM_COMBINATION_WARNING_TYPE_NONE = 0;
/**
@@ -1527,7 +1518,6 @@
* to indicate two active SIMs are both CDMA hence there might be functional limitation.
* @hide
*/
- @SystemApi
public static final int EXTRA_SIM_COMBINATION_WARNING_TYPE_DUAL_CDMA = 1;
/**
@@ -1538,7 +1528,6 @@
*
* @hide
*/
- @SystemApi
public static final String EXTRA_SIM_COMBINATION_NAMES =
"android.telephony.extra.SIM_COMBINATION_NAMES";
@@ -1590,7 +1579,6 @@
* <p class="note">This is a protected intent that can only be sent by the system.</p>
* @hide
*/
- @SystemApi
@SuppressLint("ActionValue")
public static final String ACTION_CARRIER_SIGNAL_REDIRECTED =
"com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED";
@@ -1608,7 +1596,6 @@
* <p class="note">This is a protected intent that can only be sent by the system. </p>
* @hide
*/
- @SystemApi
@SuppressLint("ActionValue")
public static final String ACTION_CARRIER_SIGNAL_REQUEST_NETWORK_FAILED =
"com.android.internal.telephony.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED";
@@ -1631,7 +1618,6 @@
* <p class="note">This is a protected intent that can only be sent by the system. </p>
* @hide
*/
- @SystemApi
@SuppressLint("ActionValue")
public static final String ACTION_CARRIER_SIGNAL_PCO_VALUE =
"com.android.internal.telephony.CARRIER_SIGNAL_PCO_VALUE";
@@ -1649,7 +1635,6 @@
* <p class="note">This is a protected intent that can only be sent by the system. </p>
* @hide
*/
- @SystemApi
@SuppressLint("ActionValue")
public static final String ACTION_CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE =
"com.android.internal.telephony.CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE";
@@ -1664,7 +1649,6 @@
* <p class="note">This is a protected intent that can only be sent by the system.</p>
* @hide
*/
- @SystemApi
@SuppressLint("ActionValue")
public static final String ACTION_CARRIER_SIGNAL_RESET =
"com.android.internal.telephony.CARRIER_SIGNAL_RESET";
@@ -1674,7 +1658,6 @@
* An string extra of redirected url upon {@link #ACTION_CARRIER_SIGNAL_REDIRECTED}.
* @hide
*/
- @SystemApi
@SuppressLint("ActionValue")
public static final String EXTRA_REDIRECTION_URL = "redirectionUrl";
@@ -1683,7 +1666,6 @@
* Check {@link DataFailCause} for all possible values.
* @hide
*/
- @SystemApi
@SuppressLint("ActionValue")
public static final String EXTRA_ERROR_CODE = "errorCode";
@@ -1697,7 +1679,6 @@
*
* @hide
*/
- @SystemApi
@Deprecated
@SuppressLint("ActionValue")
public static final String EXTRA_APN_TYPE = "apnType";
@@ -1710,7 +1691,6 @@
* Check {@link ApnSetting} TYPE_* for its values.
* @hide
*/
- @SystemApi
@SuppressLint("ActionValue")
public static final String EXTRA_APN_TYPE_INT = "apnTypeInt";
@@ -1722,7 +1702,6 @@
*
* @hide
*/
- @SystemApi
@Deprecated
@SuppressLint("ActionValue")
public static final String EXTRA_APN_PROTOCOL = "apnProto";
@@ -1733,7 +1712,6 @@
* Check {@link ApnSetting} PROTOCOL_* for its values.
* @hide
*/
- @SystemApi
@SuppressLint("ActionValue")
public static final String EXTRA_APN_PROTOCOL_INT = "apnProtoInt";
@@ -1742,7 +1720,6 @@
* {@link #ACTION_CARRIER_SIGNAL_PCO_VALUE} broadcasts.
* @hide
*/
- @SystemApi
@SuppressLint("ActionValue")
public static final String EXTRA_PCO_ID = "pcoId";
@@ -1751,7 +1728,6 @@
* {@link #ACTION_CARRIER_SIGNAL_PCO_VALUE} broadcasts.
* @hide
*/
- @SystemApi
@SuppressLint("ActionValue")
public static final String EXTRA_PCO_VALUE = "pcoValue";
@@ -1760,7 +1736,6 @@
* {@link #ACTION_CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE} broadcasts.
* @hide
*/
- @SystemApi
@SuppressLint("ActionValue")
public static final String EXTRA_DEFAULT_NETWORK_AVAILABLE = "defaultNetworkAvailable";
@@ -2911,6 +2886,8 @@
/**
* Return a collection of all network types
* @return network types
+ *
+ * @hide
*/
public static @NonNull @NetworkType int[] getAllNetworkTypes() {
return NETWORK_TYPES;
@@ -8087,7 +8064,6 @@
*
* @hide
*/
- @SystemApi
@RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public boolean isInEmergencySmsMode() {
try {
@@ -10278,7 +10254,6 @@
* {@link #MODEM_ACTIVITY_RESULT_KEY}.
* @hide
*/
- @SystemApi
public void requestModemActivityInfo(@NonNull ResultReceiver result) {
try {
ITelephony service = getITelephony();
@@ -13003,6 +12978,7 @@
*/
@WorkerThread
@RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SystemApi
public boolean isIccLockEnabled() {
try {
ITelephony telephony = getITelephony();
diff --git a/telephony/java/com/android/internal/telephony/ISms.aidl b/telephony/java/com/android/internal/telephony/ISms.aidl
index fed969d..89f811e 100644
--- a/telephony/java/com/android/internal/telephony/ISms.aidl
+++ b/telephony/java/com/android/internal/telephony/ISms.aidl
@@ -86,9 +86,9 @@
* raw pdu of the status report is in the extended data ("pdu").
* @param subId the subId id.
*/
- void sendDataForSubscriber(int subId, String callingPkg, in String destAddr,
- in String scAddr, in int destPort, in byte[] data, in PendingIntent sentIntent,
- in PendingIntent deliveryIntent);
+ void sendDataForSubscriber(int subId, String callingPkg, String callingattributionTag,
+ in String destAddr, in String scAddr, in int destPort,in byte[] data,
+ in PendingIntent sentIntent, in PendingIntent deliveryIntent);
/**
* Send an SMS.
@@ -120,8 +120,8 @@
* @param messageId An id that uniquely identifies the message requested to be sent.
* Used for logging and diagnostics purposes. The id may be 0.
*/
- void sendTextForSubscriber(in int subId, String callingPkg, in String destAddr,
- in String scAddr, in String text, in PendingIntent sentIntent,
+ void sendTextForSubscriber(in int subId, String callingPkg, String callingAttributionTag,
+ in String destAddr, in String scAddr, in String text, in PendingIntent sentIntent,
in PendingIntent deliveryIntent, in boolean persistMessageForNonDefaultSmsApp,
in long messageId);
@@ -222,7 +222,7 @@
* Used for logging and diagnostics purposes. The id may be 0.
*/
void sendMultipartTextForSubscriber(in int subId, String callingPkg,
- in String destinationAddress, in String scAddress,
+ String callingAttributionTag, in String destinationAddress, in String scAddress,
in List<String> parts, in List<PendingIntent> sentIntents,
in List<PendingIntent> deliveryIntents, in boolean persistMessageForNonDefaultSmsApp,
in long messageId);
@@ -272,10 +272,10 @@
* Any Other values included Negative considered as Invalid Validity Period of the message.
*/
void sendMultipartTextForSubscriberWithOptions(in int subId, String callingPkg,
- in String destinationAddress, in String scAddress, in List<String> parts,
- in List<PendingIntent> sentIntents, in List<PendingIntent> deliveryIntents,
- in boolean persistMessageForNonDefaultSmsApp, in int priority, in boolean expectMore,
- in int validityPeriod);
+ String callingAttributionTag, in String destinationAddress, in String scAddress,
+ in List<String> parts, in List<PendingIntent> sentIntents,
+ in List<PendingIntent> deliveryIntents, in boolean persistMessageForNonDefaultSmsApp,
+ in int priority, in boolean expectMore, in int validityPeriod);
/**
* Enable reception of cell broadcast (SMS-CB) messages with the given
@@ -433,6 +433,7 @@
*
* @param subId the SIM id.
* @param callingPkg the package name of the calling app
+ * @param callingAttributionTag the attribution tag of calling context
* @param messageUri the URI of the stored message
* @param scAddress is the service center address or null to use the current default SMSC
* @param sentIntent if not NULL this <code>PendingIntent</code> is
@@ -452,8 +453,9 @@
* broadcast when the message is delivered to the recipient. The
* raw pdu of the status report is in the extended data ("pdu").
*/
- void sendStoredText(int subId, String callingPkg, in Uri messageUri, String scAddress,
- in PendingIntent sentIntent, in PendingIntent deliveryIntent);
+ void sendStoredText(int subId, String callingPkg, String callingAttributionTag,
+ in Uri messageUri, String scAddress, in PendingIntent sentIntent,
+ in PendingIntent deliveryIntent);
/**
* Send a system stored multi-part text message.
@@ -465,6 +467,7 @@
*
* @param subId the SIM id.
* @param callingPkg the package name of the calling app
+ * @param callingAttributeTag the attribute tag of the calling context
* @param messageUri the URI of the stored message
* @param scAddress is the service center address or null to use
* the current default SMSC
@@ -488,8 +491,8 @@
* to the recipient. The raw pdu of the status report is in the
* extended data ("pdu").
*/
- void sendStoredMultipartText(int subId, String callingPkg, in Uri messageUri,
- String scAddress, in List<PendingIntent> sentIntents,
+ void sendStoredMultipartText(int subId, String callingPkg, String callingAttributeTag,
+ in Uri messageUri, String scAddress, in List<PendingIntent> sentIntents,
in List<PendingIntent> deliveryIntents);
/**
diff --git a/telephony/java/com/android/internal/telephony/ISmsImplBase.java b/telephony/java/com/android/internal/telephony/ISmsImplBase.java
index 67ad23a..f1182f7 100644
--- a/telephony/java/com/android/internal/telephony/ISmsImplBase.java
+++ b/telephony/java/com/android/internal/telephony/ISmsImplBase.java
@@ -45,15 +45,15 @@
}
@Override
- public void sendDataForSubscriber(int subId, String callingPkg, String destAddr,
- String scAddr, int destPort, byte[] data, PendingIntent sentIntent,
+ public void sendDataForSubscriber(int subId, String callingPkg, String callingAttributionTag,
+ String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent,
PendingIntent deliveryIntent) {
throw new UnsupportedOperationException();
}
@Override
- public void sendTextForSubscriber(int subId, String callingPkg, String destAddr,
- String scAddr, String text, PendingIntent sentIntent,
+ public void sendTextForSubscriber(int subId, String callingPkg, String callingAttributionTag,
+ String destAddr, String scAddr, String text, PendingIntent sentIntent,
PendingIntent deliveryIntent, boolean persistMessageForNonDefaultSmsApp,
long messageId) {
throw new UnsupportedOperationException();
@@ -76,7 +76,7 @@
@Override
public void sendMultipartTextForSubscriber(int subId, String callingPkg,
- String destinationAddress, String scAddress,
+ String callingAttributionTag, String destinationAddress, String scAddress,
List<String> parts, List<PendingIntent> sentIntents,
List<PendingIntent> deliveryIntents, boolean persistMessageForNonDefaultSmsApp,
long messageId) {
@@ -85,7 +85,7 @@
@Override
public void sendMultipartTextForSubscriberWithOptions(int subId, String callingPkg,
- String destinationAddress, String scAddress,
+ String callingAttributionTag, String destinationAddress, String scAddress,
List<String> parts, List<PendingIntent> sentIntents,
List<PendingIntent> deliveryIntents, boolean persistMessageForNonDefaultSmsApp,
int priority, boolean expectMore, int validityPeriod) {
@@ -162,14 +162,15 @@
}
@Override
- public void sendStoredText(int subId, String callingPkg, Uri messageUri, String scAddress,
- PendingIntent sentIntent, PendingIntent deliveryIntent) {
+ public void sendStoredText(int subId, String callingPkg, String callingAttributionTag,
+ Uri messageUri, String scAddress, PendingIntent sentIntent,
+ PendingIntent deliveryIntent) {
throw new UnsupportedOperationException();
}
@Override
- public void sendStoredMultipartText(int subId, String callingPkg, Uri messageUri,
- String scAddress, List<PendingIntent> sentIntents,
+ public void sendStoredMultipartText(int subId, String callingPkg, String callingAttributionTag,
+ Uri messageUri, String scAddress, List<PendingIntent> sentIntents,
List<PendingIntent> deliveryIntents) {
throw new UnsupportedOperationException();
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 81c0895..43aeb19 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -2204,7 +2204,8 @@
* Enqueue a pending sms Consumer, which will answer with the user specified selection for an
* outgoing SmsManager operation.
*/
- oneway void enqueueSmsPickResult(String callingPackage, IIntegerConsumer subIdResult);
+ oneway void enqueueSmsPickResult(String callingPackage, String callingAttributeTag,
+ IIntegerConsumer subIdResult);
/**
* Returns the MMS user agent.
diff --git a/tools/stats_log_api_gen/Collation.cpp b/tools/stats_log_api_gen/Collation.cpp
index f31a2af..47eb63e 100644
--- a/tools/stats_log_api_gen/Collation.cpp
+++ b/tools/stats_log_api_gen/Collation.cpp
@@ -55,8 +55,7 @@
resetState(that.resetState),
nested(that.nested),
uidField(that.uidField),
- whitelisted(that.whitelisted),
- binaryFields(that.binaryFields) {}
+ whitelisted(that.whitelisted) {}
AtomDecl::AtomDecl(int c, const string& n, const string& m)
:code(c),
@@ -422,10 +421,6 @@
continue;
}
}
- // Binary field validity is already checked above.
- if (isBinaryField) {
- atomDecl->binaryFields.push_back(it->first);
- }
}
return errorCount;
diff --git a/tools/stats_log_api_gen/Collation.h b/tools/stats_log_api_gen/Collation.h
index d99b931..c6dad1d 100644
--- a/tools/stats_log_api_gen/Collation.h
+++ b/tools/stats_log_api_gen/Collation.h
@@ -147,8 +147,6 @@
bool whitelisted = false;
- vector<int> binaryFields;
-
AtomDecl();
AtomDecl(const AtomDecl& that);
AtomDecl(int code, const string& name, const string& message);
diff --git a/tools/stats_log_api_gen/atoms_info_writer.cpp b/tools/stats_log_api_gen/atoms_info_writer.cpp
index 58f13a4..4f66f68 100644
--- a/tools/stats_log_api_gen/atoms_info_writer.cpp
+++ b/tools/stats_log_api_gen/atoms_info_writer.cpp
@@ -48,9 +48,6 @@
" const static std::map<int, StateAtomFieldOptions> "
"kStateAtomsFieldOptions;\n");
fprintf(out,
- " const static std::map<int, std::vector<int>> "
- "kBytesFieldAtoms;\n");
- fprintf(out,
" const static std::set<int> kWhitelistedAtoms;\n");
fprintf(out, "};\n");
fprintf(out, "const static int kMaxPushedAtomId = %d;\n\n", atoms.maxPushedAtomId);
@@ -175,35 +172,6 @@
"const std::map<int, StateAtomFieldOptions> "
"AtomsInfo::kStateAtomsFieldOptions = "
"getStateAtomFieldOptions();\n");
-
- fprintf(out,
- "static std::map<int, std::vector<int>> "
- "getBinaryFieldAtoms() {\n");
- fprintf(out, " std::map<int, std::vector<int>> options;\n");
- for (set<AtomDecl>::const_iterator atom = atoms.decls.begin();
- atom != atoms.decls.end(); atom++) {
- if (atom->binaryFields.size() == 0) {
- continue;
- }
- fprintf(out,
- "\n // Adding binary fields for atom "
- "(%d)%s\n",
- atom->code, atom->name.c_str());
-
- for (const auto& field : atom->binaryFields) {
- fprintf(out, " options[%d /* %s */].push_back(%d);\n",
- atom->code, make_constant_name(atom->name).c_str(), field);
- }
- }
-
- fprintf(out, " return options;\n");
- fprintf(out, "}\n");
-
- fprintf(out,
- "const std::map<int, std::vector<int>> "
- "AtomsInfo::kBytesFieldAtoms = "
- "getBinaryFieldAtoms();\n");
-
}
int write_atoms_info_header(FILE* out, const Atoms &atoms, const string& namespaceStr) {
diff --git a/wifi/api/current.txt b/wifi/api/current.txt
index 1b62ec1..53c3b33 100644
--- a/wifi/api/current.txt
+++ b/wifi/api/current.txt
@@ -16,7 +16,7 @@
field public static final int EASY_CONNECT_EVENT_FAILURE_TIMEOUT = -6; // 0xfffffffa
}
- public class ScanResult implements android.os.Parcelable {
+ public final class ScanResult implements android.os.Parcelable {
ctor public ScanResult(@NonNull android.net.wifi.ScanResult);
ctor public ScanResult();
method public int describeContents();
diff --git a/wifi/api/system-current.txt b/wifi/api/system-current.txt
index 150a650..e39e148 100644
--- a/wifi/api/system-current.txt
+++ b/wifi/api/system-current.txt
@@ -208,7 +208,7 @@
field @Deprecated public byte id;
}
- public class ScanResult implements android.os.Parcelable {
+ public final class ScanResult implements android.os.Parcelable {
field public static final int CIPHER_CCMP = 3; // 0x3
field public static final int CIPHER_GCMP_256 = 4; // 0x4
field public static final int CIPHER_NONE = 0; // 0x0
diff --git a/wifi/api/system-removed.txt b/wifi/api/system-removed.txt
index 35f9726..a2d0dff 100644
--- a/wifi/api/system-removed.txt
+++ b/wifi/api/system-removed.txt
@@ -8,7 +8,7 @@
field public boolean truncated;
}
- public class ScanResult implements android.os.Parcelable {
+ public final class ScanResult implements android.os.Parcelable {
field public boolean untrusted;
}
diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java
index 727952c..f5b5622 100644
--- a/wifi/java/android/net/wifi/ScanResult.java
+++ b/wifi/java/android/net/wifi/ScanResult.java
@@ -38,7 +38,7 @@
* {@code quality}, {@code noise}, and {@code maxbitrate} attributes,
* but does not currently report them to external clients.
*/
-public class ScanResult implements Parcelable {
+public final class ScanResult implements Parcelable {
/**
* The network name.
*/
diff --git a/wifi/java/android/net/wifi/WifiMigration.java b/wifi/java/android/net/wifi/WifiMigration.java
index 666d72d..87afdc5 100755
--- a/wifi/java/android/net/wifi/WifiMigration.java
+++ b/wifi/java/android/net/wifi/WifiMigration.java
@@ -138,7 +138,10 @@
/**
* Load data from legacy shared wifi config store file.
- * TODO(b/149418926): Add XSD for the AOSP file format for each file from R.
+ * <p>
+ * Expected AOSP format is available in the sample files under {@code /frameworks/base/wifi/
+ * java/android/net/wifi/migration_samples}.
+ * </p>
* <p>
* Note:
* <li>OEMs need to change the implementation of
@@ -214,7 +217,10 @@
/**
* Load data from legacy user wifi config store file.
- * TODO(b/149418926): Add XSD for the AOSP file format for each file from R.
+ * <p>
+ * Expected AOSP format is available in the sample files under {@code /frameworks/base/wifi/
+ * java/android/net/wifi/migration_samples}.
+ * </p>
* <p>
* Note:
* <li>OEMs need to change the implementation of
diff --git a/wifi/java/android/net/wifi/migration_samples/README.txt b/wifi/java/android/net/wifi/migration_samples/README.txt
new file mode 100644
index 0000000..264deba
--- /dev/null
+++ b/wifi/java/android/net/wifi/migration_samples/README.txt
@@ -0,0 +1,35 @@
+This folder contains sample files for each of the 4 XML Wi-Fi config store files in Android 11 AOSP.
+OEMs can use these files as reference for converting their previous customized
+formats into the AOSP format. The conversion logic needs to be written in
+WifiMigration.java class, i.e each OEM needs to modify
+WifiMigration.convertAndRetrieveSharedConfigStoreFile() and the
+WifiMigration.convertAndRetrieveUserConfigStoreFile() methods.
+
+The 4 files are:
+
+Shared files
+============
+1) WifiConfigStore.xml - General storage for shared configurations. Includes
+user's saved Wi-Fi networks.
+AOSP Path in Android 10: /data/misc/wifi/WifiConfigStore.xml
+AOSP Path in Android 11: /data/misc/apexdata/com.android/wifi/WifiConfigStore.xml
+Sample File (in this folder): Shared_WifiConfigStore.xml
+
+2) WifiConfigStoreSoftAp.xml - Storage for user's softap/tethering configuration.
+AOSP Path in Android 10: /data/misc/wifi/softap.conf.
+Note: Was key/value format in Android 10. Conversion to XML done in SoftApConfToXmlMigrationUtil.java.
+AOSP Path in Android 11: /data/misc/apexdata/com.android/wifi/WifiConfigStore.xml
+Sample File (in this folder): Shared_WifiConfigStoreSoftAp.xml
+
+User specific files
+==================
+3) WifiConfigStore.xml - General storage for user specific configurations. Includes
+user's saved passpoint networks, Wi-Fi network request approvals, etc.
+AOSP Path in Android 10: /data/misc_ce/<userId>/wifi/WifiConfigStore.xml
+AOSP Path in Android 11: /data/misc_ce/<userId>/apexdata/com.android/wifi/WifiConfigStore.xml
+Sample File (in this folder): User_WifiConfigStore.xml
+
+4) WifiConfigStoreNetworkSuggestions.xml - Storage for app installed network suggestions.
+AOSP Path in Android 10: /data/misc_ce/<userId>/wifi/WifiConfigStoreNetworkSuggestions.xml
+AOSP Path in Android 11: /data/misc_ce/<userId>/apexdata/com.android/wifi/WifiConfigStoreNetworkSuggestions.xml
+Sample File (in this folder): User_WifiConfigStoreNetworkSuggestions.xml
diff --git a/wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStore.xml b/wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStore.xml
new file mode 100644
index 0000000..3063276
--- /dev/null
+++ b/wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStore.xml
@@ -0,0 +1,200 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+<WifiConfigStoreData>
+<int name="Version" value="3" />
+<NetworkList>
+<Network>
+<WifiConfiguration>
+<string name="ConfigKey">"OPEN_SSID"NONE</string>
+<string name="SSID">"OPEN_SSID"</string>
+<null name="PreSharedKey" />
+<null name="WEPKeys" />
+<int name="WEPTxKeyIndex" value="0" />
+<boolean name="HiddenSSID" value="false" />
+<boolean name="RequirePMF" value="false" />
+<byte-array name="AllowedKeyMgmt" num="1">01</byte-array>
+<byte-array name="AllowedProtocols" num="1">03</byte-array>
+<byte-array name="AllowedAuthAlgos" num="0"></byte-array>
+<byte-array name="AllowedGroupCiphers" num="1">2f</byte-array>
+<byte-array name="AllowedPairwiseCiphers" num="1">0e</byte-array>
+<byte-array name="AllowedGroupMgmtCiphers" num="1">04</byte-array>
+<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
+<boolean name="Shared" value="true" />
+<boolean name="AutoJoinEnabled" value="true" />
+<boolean name="Trusted" value="true" />
+<null name="BSSID" />
+<int name="Status" value="2" />
+<null name="FQDN" />
+<null name="ProviderFriendlyName" />
+<null name="LinkedNetworksList" />
+<null name="DefaultGwMacAddress" />
+<boolean name="ValidatedInternetAccess" value="true" />
+<boolean name="NoInternetAccessExpected" value="false" />
+<boolean name="MeteredHint" value="false" />
+<int name="MeteredOverride" value="0" />
+<boolean name="UseExternalScores" value="false" />
+<int name="NumAssociation" value="3" />
+<int name="CreatorUid" value="1000" />
+<string name="CreatorName">android.uid.system:1000</string>
+<int name="LastUpdateUid" value="1000" />
+<string name="LastUpdateName">android.uid.system:1000</string>
+<int name="LastConnectUid" value="1000" />
+<boolean name="IsLegacyPasspointConfig" value="false" />
+<long-array name="RoamingConsortiumOIs" num="0" />
+<string name="RandomizedMacAddress">ce:b1:36:bb:71:ac</string>
+<int name="MacRandomizationSetting" value="1" />
+<int name="CarrierId" value="-1" />
+</WifiConfiguration>
+<NetworkStatus>
+<string name="SelectionStatus">NETWORK_SELECTION_ENABLED</string>
+<string name="DisableReason">NETWORK_SELECTION_ENABLE</string>
+<string name="ConnectChoice">"ENTERPRISE_SSID"WPA_EAP</string>
+<boolean name="HasEverConnected" value="true" />
+</NetworkStatus>
+<IpConfiguration>
+<string name="IpAssignment">DHCP</string>
+<string name="ProxySettings">NONE</string>
+</IpConfiguration>
+</Network>
+<Network>
+<WifiConfiguration>
+<string name="ConfigKey">"ENTERPRISE_SSID"WPA_EAP</string>
+<string name="SSID">"ENTERPRISE_SSID"</string>
+<null name="PreSharedKey" />
+<null name="WEPKeys" />
+<int name="WEPTxKeyIndex" value="0" />
+<boolean name="HiddenSSID" value="false" />
+<boolean name="RequirePMF" value="false" />
+<byte-array name="AllowedKeyMgmt" num="1">0c</byte-array>
+<byte-array name="AllowedProtocols" num="1">03</byte-array>
+<byte-array name="AllowedAuthAlgos" num="0"></byte-array>
+<byte-array name="AllowedGroupCiphers" num="1">2f</byte-array>
+<byte-array name="AllowedPairwiseCiphers" num="1">0e</byte-array>
+<byte-array name="AllowedGroupMgmtCiphers" num="1">04</byte-array>
+<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
+<boolean name="Shared" value="true" />
+<boolean name="AutoJoinEnabled" value="true" />
+<boolean name="Trusted" value="true" />
+<null name="BSSID" />
+<int name="Status" value="2" />
+<null name="FQDN" />
+<null name="ProviderFriendlyName" />
+<null name="LinkedNetworksList" />
+<null name="DefaultGwMacAddress" />
+<boolean name="ValidatedInternetAccess" value="false" />
+<boolean name="NoInternetAccessExpected" value="false" />
+<boolean name="MeteredHint" value="false" />
+<int name="MeteredOverride" value="0" />
+<boolean name="UseExternalScores" value="false" />
+<int name="NumAssociation" value="0" />
+<int name="CreatorUid" value="1000" />
+<string name="CreatorName">android.uid.system:1000</string>
+<int name="LastUpdateUid" value="1000" />
+<string name="LastUpdateName">android.uid.system:1000</string>
+<int name="LastConnectUid" value="1000" />
+<boolean name="IsLegacyPasspointConfig" value="false" />
+<long-array name="RoamingConsortiumOIs" num="0" />
+<string name="RandomizedMacAddress">f6:b3:94:44:40:87</string>
+<int name="MacRandomizationSetting" value="1" />
+<int name="CarrierId" value="-1" />
+</WifiConfiguration>
+<NetworkStatus>
+<string name="SelectionStatus">NETWORK_SELECTION_TEMPORARY_DISABLED</string>
+<string name="DisableReason">NETWORK_SELECTION_DISABLED_AUTHENTICATION_FAILURE</string>
+<null name="ConnectChoice" />
+<boolean name="HasEverConnected" value="false" />
+</NetworkStatus>
+<IpConfiguration>
+<string name="IpAssignment">DHCP</string>
+<string name="ProxySettings">NONE</string>
+</IpConfiguration>
+<WifiEnterpriseConfiguration>
+<string name="Identity">adadadasdaddsa</string>
+<string name="AnonIdentity">asdadaddadasd</string>
+<string name="Password">adasdadadad</string>
+<string name="ClientCert"></string>
+<string name="CaCert"></string>
+<string name="SubjectMatch"></string>
+<string name="Engine">0</string>
+<string name="EngineId"></string>
+<string name="PrivateKeyId"></string>
+<string name="AltSubjectMatch"></string>
+<string name="DomSuffixMatch">adsad</string>
+<string name="CaPath">/system/etc/security/cacerts</string>
+<int name="EapMethod" value="0" />
+<int name="Phase2Method" value="3" />
+<string name="PLMN"></string>
+<string name="Realm"></string>
+<int name="Ocsp" value="0" />
+<string name="WapiCertSuite"></string>
+</WifiEnterpriseConfiguration>
+</Network>
+<Network>
+<WifiConfiguration>
+<string name="ConfigKey">"WPA3_SSID"SAE</string>
+<string name="SSID">"WPA3_SSID"</string>
+<string name="PreSharedKey">"sfsdfsfdsfsdf"</string>
+<null name="WEPKeys" />
+<int name="WEPTxKeyIndex" value="0" />
+<boolean name="HiddenSSID" value="false" />
+<boolean name="RequirePMF" value="true" />
+<byte-array name="AllowedKeyMgmt" num="2">0001</byte-array>
+<byte-array name="AllowedProtocols" num="1">02</byte-array>
+<byte-array name="AllowedAuthAlgos" num="0"></byte-array>
+<byte-array name="AllowedGroupCiphers" num="1">28</byte-array>
+<byte-array name="AllowedPairwiseCiphers" num="1">0c</byte-array>
+<byte-array name="AllowedGroupMgmtCiphers" num="1">04</byte-array>
+<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
+<boolean name="Shared" value="true" />
+<boolean name="AutoJoinEnabled" value="true" />
+<boolean name="Trusted" value="true" />
+<null name="BSSID" />
+<int name="Status" value="1" />
+<null name="FQDN" />
+<null name="ProviderFriendlyName" />
+<null name="LinkedNetworksList" />
+<null name="DefaultGwMacAddress" />
+<boolean name="ValidatedInternetAccess" value="false" />
+<boolean name="NoInternetAccessExpected" value="false" />
+<boolean name="MeteredHint" value="false" />
+<int name="MeteredOverride" value="0" />
+<boolean name="UseExternalScores" value="false" />
+<int name="NumAssociation" value="0" />
+<int name="CreatorUid" value="1000" />
+<string name="CreatorName">android.uid.system:1000</string>
+<int name="LastUpdateUid" value="1000" />
+<string name="LastUpdateName">android.uid.system:1000</string>
+<int name="LastConnectUid" value="1000" />
+<boolean name="IsLegacyPasspointConfig" value="false" />
+<long-array name="RoamingConsortiumOIs" num="0" />
+<string name="RandomizedMacAddress">a6:3d:b0:13:ed:41</string>
+<int name="MacRandomizationSetting" value="1" />
+<int name="CarrierId" value="-1" />
+</WifiConfiguration>
+<NetworkStatus>
+<string name="SelectionStatus">NETWORK_SELECTION_PERMANENTLY_DISABLED</string>
+<string name="DisableReason">NETWORK_SELECTION_DISABLED_BY_WRONG_PASSWORD</string>
+<null name="ConnectChoice" />
+<boolean name="HasEverConnected" value="false" />
+</NetworkStatus>
+<IpConfiguration>
+<string name="IpAssignment">DHCP</string>
+<string name="ProxySettings">NONE</string>
+</IpConfiguration>
+</Network>
+</NetworkList>
+<MacAddressMap>
+<map name="MacMapEntry" />
+</MacAddressMap>
+<Settings>
+<map name="Values">
+<boolean name="wifi_p2p_pending_factory_reset" value="false" />
+<boolean name="wifi_scan_throttle_enabled" value="true" />
+<null name="wifi_p2p_device_name" />
+<boolean name="wifi_scan_always_enabled" value="false" />
+<boolean name="wifi_verbose_logging_enabled" value="true" />
+</map>
+</Settings>
+<PasspointConfigData>
+<long name="ProviderIndex" value="0" />
+</PasspointConfigData>
+</WifiConfigStoreData>
diff --git a/wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStoreSoftAp.xml b/wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStoreSoftAp.xml
new file mode 100644
index 0000000..fd99dd3
--- /dev/null
+++ b/wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStoreSoftAp.xml
@@ -0,0 +1,22 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+<WifiConfigStoreData>
+<int name="Version" value="3" />
+<SoftAp>
+<string name="SSID">HOTSPOT_SSID</string>
+<int name="ApBand" value="1" />
+<int name="Channel" value="0" />
+<boolean name="HiddenSSID" value="false" />
+<int name="SecurityType" value="1" />
+<string name="Passphrase">blahblahblah</string>
+<int name="MaxNumberOfClients" value="0" />
+<boolean name="ClientControlByUser" value="false" />
+<boolean name="AutoShutdownEnabled" value="true" />
+<long name="ShutdownTimeoutMillis" value="0" />
+<BlockedClientList>
+<string name="ClientMacAddress">00:11:22:33:44:55</string>
+</BlockedClientList>
+<AllowedClientList>
+<string name="ClientMacAddress">aa:bb:cc:dd:ee:ff</string>
+</AllowedClientList>
+</SoftAp>
+</WifiConfigStoreData>
diff --git a/wifi/java/android/net/wifi/migration_samples/User_WifiConfigStore.xml b/wifi/java/android/net/wifi/migration_samples/User_WifiConfigStore.xml
new file mode 100644
index 0000000..67d5aab
--- /dev/null
+++ b/wifi/java/android/net/wifi/migration_samples/User_WifiConfigStore.xml
@@ -0,0 +1,81 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+<WifiConfigStoreData>
+<int name="Version" value="3" />
+<NetworkList />
+<PasspointConfigData>
+<ProviderList>
+<Provider>
+<long name="ProviderID" value="0" />
+<int name="CreatorUID" value="10085" />
+<string name="PackageName">com.android.certinstaller</string>
+<list name="CaCertificateAliases">
+<string>HS2_0_0</string>
+</list>
+<null name="ClientPrivateKeyAlias" />
+<boolean name="HasEverConnected" value="false" />
+<boolean name="IsFromSuggestion" value="false" />
+<boolean name="IsTrusted" value="true" />
+<Configuration>
+<int name="UpdateIdentifier" value="-2147483648" />
+<int name="CredentialPriority" value="-2147483648" />
+<null name="TrustRootCertList" />
+<long name="SubscriptionCreationTime" value="-9223372036854775808" />
+<long name="SubscriptionExpirationTime" value="-9223372036854775808" />
+<null name="SubscriptionType" />
+<long name="UsageLimitTimePeriod" value="-9223372036854775808" />
+<long name="UsageLimitStartTime" value="-9223372036854775808" />
+<long name="UsageLimitDataLimit" value="-9223372036854775808" />
+<long name="UsageLimitTimeLimit" value="-9223372036854775808" />
+<HomeSP>
+<string name="FQDN">Passpoint.net</string>
+<string name="FriendlyName">Passpoint Friendly Name</string>
+<null name="IconURL" />
+<null name="HomeNetworkIDs" />
+<null name="MatchAllOIs" />
+<null name="MatchAnyOIs" />
+<null name="OtherHomePartners" />
+<null name="RoamingConsortiumOIs" />
+</HomeSP>
+<Credential>
+<long name="CreationTime" value="-9223372036854775808" />
+<long name="ExpirationTime" value="-9223372036854775808" />
+<string name="Realm">passpoint.com</string>
+<boolean name="CheckAAAServerCertStatus" value="false" />
+<UserCredential>
+<string name="Username">blahblahblah</string>
+<string name="Password">doubleblahlah</string>
+<boolean name="MachineManaged" value="true" />
+<null name="SoftTokenApp" />
+<boolean name="AbleToShare" value="false" />
+<int name="EAPType" value="21" />
+<string name="NonEAPInnerMethod">PAP</string>
+</UserCredential>
+</Credential>
+<int name="CarrierId" value="-1" />
+<boolean name="AutoJoinEnabled" value="true" />
+<boolean name="IsMacRandomizationEnabled" value="true" />
+<int name="MeteredOverride" value="0" />
+</Configuration>
+<null name="RemediationCaCertificateAlias" />
+</Provider>
+</ProviderList>
+</PasspointConfigData>
+<OpenNetworkNotifierBlacklistConfigData />
+<NetworkRequestMap>
+<ApprovedAccessPointsPerApp>
+<string name="RequestorPackageName">com.android.cts.verifier</string>
+<AccessPoint>
+<string name="SSID">OPEN_SSID</string>
+<string name="BSSID">00:11:22:33:44:55</string>
+<int name="NetworkType" value="0" />
+</AccessPoint>
+</ApprovedAccessPointsPerApp>
+</NetworkRequestMap>
+<WakeupConfigStoreData>
+<FeatureState>
+<boolean name="IsActive" value="false" />
+<boolean name="IsOnboarded" value="false" />
+<int name="NotificationsShown" value="1" />
+</FeatureState>
+</WakeupConfigStoreData>
+</WifiConfigStoreData>
diff --git a/wifi/java/android/net/wifi/migration_samples/User_WifiConfigStoreNetworkSuggestions.xml b/wifi/java/android/net/wifi/migration_samples/User_WifiConfigStoreNetworkSuggestions.xml
new file mode 100644
index 0000000..4ecdd29
--- /dev/null
+++ b/wifi/java/android/net/wifi/migration_samples/User_WifiConfigStoreNetworkSuggestions.xml
@@ -0,0 +1,155 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+<WifiConfigStoreData>
+<int name="Version" value="3" />
+<NetworkSuggestionMap>
+<NetworkSuggestionPerApp>
+<string name="SuggestorPackageName">com.android.cts.verifier</string>
+<null name="SuggestorFeatureId" />
+<boolean name="SuggestorHasUserApproved" value="true" />
+<int name="SuggestorMaxSize" value="1" />
+<int name="SuggestorUid" value="10228" />
+<int name="SuggestorCarrierId" value="-1" />
+<NetworkSuggestion>
+<WifiConfiguration>
+<string name="ConfigKey">"OPEN_SSID"NONE</string>
+<string name="SSID">"OPEN_SSID"</string>
+<null name="PreSharedKey" />
+<null name="WEPKeys" />
+<int name="WEPTxKeyIndex" value="0" />
+<boolean name="HiddenSSID" value="false" />
+<boolean name="RequirePMF" value="false" />
+<byte-array name="AllowedKeyMgmt" num="1">01</byte-array>
+<byte-array name="AllowedProtocols" num="0"></byte-array>
+<byte-array name="AllowedAuthAlgos" num="0"></byte-array>
+<byte-array name="AllowedGroupCiphers" num="0"></byte-array>
+<byte-array name="AllowedPairwiseCiphers" num="0"></byte-array>
+<byte-array name="AllowedGroupMgmtCiphers" num="0"></byte-array>
+<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
+<boolean name="Shared" value="true" />
+<boolean name="AutoJoinEnabled" value="true" />
+<boolean name="Trusted" value="true" />
+<null name="BSSID" />
+<int name="Status" value="0" />
+<null name="FQDN" />
+<null name="ProviderFriendlyName" />
+<null name="LinkedNetworksList" />
+<null name="DefaultGwMacAddress" />
+<boolean name="ValidatedInternetAccess" value="false" />
+<boolean name="NoInternetAccessExpected" value="false" />
+<boolean name="MeteredHint" value="false" />
+<int name="MeteredOverride" value="1" />
+<boolean name="UseExternalScores" value="false" />
+<int name="NumAssociation" value="0" />
+<int name="CreatorUid" value="10228" />
+<string name="CreatorName">com.android.cts.verifier</string>
+<int name="LastUpdateUid" value="-1" />
+<null name="LastUpdateName" />
+<int name="LastConnectUid" value="0" />
+<boolean name="IsLegacyPasspointConfig" value="false" />
+<long-array name="RoamingConsortiumOIs" num="0" />
+<string name="RandomizedMacAddress">02:00:00:00:00:00</string>
+<int name="MacRandomizationSetting" value="1" />
+<int name="CarrierId" value="-1" />
+</WifiConfiguration>
+<boolean name="IsAppInteractionRequired" value="false" />
+<boolean name="IsUserInteractionRequired" value="false" />
+<boolean name="IsUserAllowedToManuallyConnect" value="false" />
+<boolean name="InitializedAutoJoinEnabled" value="true" />
+<boolean name="AutoJoinEnabled" value="true" />
+</NetworkSuggestion>
+<NetworkSuggestion>
+<WifiConfiguration>
+<string name="ConfigKey">passpoint.net</string>
+<null name="SSID" />
+<null name="PreSharedKey" />
+<null name="WEPKeys" />
+<int name="WEPTxKeyIndex" value="0" />
+<boolean name="HiddenSSID" value="false" />
+<boolean name="RequirePMF" value="false" />
+<byte-array name="AllowedKeyMgmt" num="0"></byte-array>
+<byte-array name="AllowedProtocols" num="0"></byte-array>
+<byte-array name="AllowedAuthAlgos" num="0"></byte-array>
+<byte-array name="AllowedGroupCiphers" num="0"></byte-array>
+<byte-array name="AllowedPairwiseCiphers" num="0"></byte-array>
+<byte-array name="AllowedGroupMgmtCiphers" num="0"></byte-array>
+<byte-array name="AllowedSuiteBCiphers" num="0"></byte-array>
+<boolean name="Shared" value="true" />
+<boolean name="AutoJoinEnabled" value="true" />
+<boolean name="Trusted" value="true" />
+<null name="BSSID" />
+<int name="Status" value="0" />
+<string name="FQDN">passpoint.net</string>
+<null name="ProviderFriendlyName" />
+<null name="LinkedNetworksList" />
+<null name="DefaultGwMacAddress" />
+<boolean name="ValidatedInternetAccess" value="false" />
+<boolean name="NoInternetAccessExpected" value="false" />
+<boolean name="MeteredHint" value="false" />
+<int name="MeteredOverride" value="0" />
+<boolean name="UseExternalScores" value="false" />
+<int name="NumAssociation" value="0" />
+<int name="CreatorUid" value="1000" />
+<string name="CreatorName">com.android.cts.verifier</string>
+<int name="LastUpdateUid" value="-1" />
+<null name="LastUpdateName" />
+<int name="LastConnectUid" value="0" />
+<boolean name="IsLegacyPasspointConfig" value="false" />
+<long-array name="RoamingConsortiumOIs" num="0" />
+<string name="RandomizedMacAddress">02:00:00:00:00:00</string>
+<int name="MacRandomizationSetting" value="1" />
+<int name="CarrierId" value="-1" />
+<boolean name="IsMostRecentlyConnected" value="false" />
+</WifiConfiguration>
+<PasspointConfiguration>
+<int name="UpdateIdentifier" value="-2147483648" />
+<int name="CredentialPriority" value="-2147483648" />
+<null name="TrustRootCertList" />
+<long name="SubscriptionCreationTime" value="-9223372036854775808" />
+<long name="SubscriptionExpirationTime" value="-9223372036854775808" />
+<null name="SubscriptionType" />
+<long name="UsageLimitTimePeriod" value="-9223372036854775808" />
+<long name="UsageLimitStartTime" value="-9223372036854775808" />
+<long name="UsageLimitDataLimit" value="-9223372036854775808" />
+<long name="UsageLimitTimeLimit" value="-9223372036854775808" />
+<HomeSP>
+<string name="FQDN">passpoint.net</string>
+<string name="FriendlyName">Passpoint Friendly Name</string>
+<null name="IconURL" />
+<null name="HomeNetworkIDs" />
+<null name="MatchAllOIs" />
+<null name="MatchAnyOIs" />
+<null name="OtherHomePartners" />
+<null name="RoamingConsortiumOIs" />
+</HomeSP>
+<Credential>
+<long name="CreationTime" value="-9223372036854775808" />
+<long name="ExpirationTime" value="-9223372036854775808" />
+<string name="Realm">passpoint.com</string>
+<boolean name="CheckAAAServerCertStatus" value="false" />
+<UserCredential>
+<string name="Username">blahblahblah</string>
+<string name="Password">doubleblahblah</string>
+<boolean name="MachineManaged" value="false" />
+<null name="SoftTokenApp" />
+<boolean name="AbleToShare" value="false" />
+<int name="EAPType" value="21" />
+<string name="NonEAPInnerMethod">PAP</string>
+</UserCredential>
+</Credential>
+<int name="CarrierId" value="-1" />
+<boolean name="AutoJoinEnabled" value="true" />
+<boolean name="IsMacRandomizationEnabled" value="true" />
+<int name="MeteredOverride" value="0" />
+</PasspointConfiguration>
+<boolean name="IsAppInteractionRequired" value="false" />
+<boolean name="IsUserInteractionRequired" value="false" />
+<boolean name="IsUserAllowedToManuallyConnect" value="true" />
+<boolean name="InitializedAutoJoinEnabled" value="true" />
+<boolean name="AutoJoinEnabled" value="true" />
+</NetworkSuggestion>
+</NetworkSuggestionPerApp>
+</NetworkSuggestionMap>
+<ImsiPrivacyProtectionExemptionMap>
+<map name="CarrierExemptionMap" />
+</ImsiPrivacyProtectionExemptionMap>
+</WifiConfigStoreData>